* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org) * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3 * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2 * @version $Id$ */ // +-------------------------------------------------------------------------------------------------------------------+ class Migrationmotscles extends Script { private $mode; // +-------------------------------------------------------------------------------------------------------------------+ public function executer() { include_once dirname(__FILE__).'/bibliotheque/Dao.php'; $cmd = $this->getParametre('a'); $this->mode_verbeux = $this->getParametre('v'); switch($cmd) { case 'obs': $this->mode = $cmd; $this->migrerMotsClesObservations(); break; case 'images': $this->mode = $cmd; $this->migrerMotsClesImages(); break; default: echo 'Méthode inconnue, les méthodes possibles sont obs et images'."\n"; } } private function migrerMotsClesObservations() { $this->dao = new Dao('obs'); $this->convertirNestedSetVersPathEnum(); } private function migrerMotsClesImages() { $this->dao = new Dao('images'); $this->convertirNestedSetVersPathEnum(); } private function convertirNestedSetVersPathEnum() { $debut = microtime(); $this->dao->viderTables(); $mots_cles_hierarchiques = $this->dao->obtenirMotsClesOriginaux($this->mode); $mots_cles_hierarchiques = $this->formaterChemin($mots_cles_hierarchiques); $liaisons = $this->dao->obtenirLiaisonsMotsClesOriginaux($this->mode); if($this->mode_verbeux) { echo "-------------------------------------------------------------------\n"; echo " Début de la migration des mots clés ".$this->mode." \n"; echo " ".count($mots_cles_hierarchiques)." mots clés et ".count($liaisons)." liaisons à migrer \n"; echo "-------------------------------------------------------------------\n"; } $nb_mots_cles = 0; $nb_liaisons = 0; $mots_cles_slice = array_chunk($mots_cles_hierarchiques, 800, true); echo " Insertion des mots clés par paquet de 800 \n"; foreach($mots_cles_slice as &$mots_cles_tranche) { $this->dao->insererMotsCles($mots_cles_tranche); $nb_mots_cles += 800; if($this->mode_verbeux) { $this->afficherAvancement(' mots clés insérés ', $nb_mots_cles); } } echo "\n Insertion des mots clés ".$this->mode." terminée \n"; $infos_nouveaux_mots_cles = $this->dao->obtenirInfosNouveauxMotsCles(); $correspondances = $this->formaterCorrespondanceCheminId($infos_nouveaux_mots_cles); $liaisons_slice = array_chunk($liaisons, 800, true); echo " Insertion des mots liaisons par paquet de 800 \n"; foreach($liaisons_slice as &$liaison_tranche) { $this->dao->insererLiaisonsMotsCles($mots_cles_hierarchiques, $liaison_tranche, $correspondances); $nb_liaisons += 800; if($this->mode_verbeux) { $this->afficherAvancement(' liaisons insérées ', $nb_liaisons); } } echo "\n Insertion des liaisons ".$this->mode." terminée \n"; $fin = microtime(true); if($this->mode_verbeux) { echo "\n"; echo "-------------------------------------------------------------------\n"; echo " Fin de la migration des mots clés ".$this->mode.", \n"; echo " ".($fin - $debut)." secondes écoulées \n"; echo " ".count($mots_cles_hierarchiques)." mots clés insérés \n"; echo " ".count($liaisons)." liaisons insérées \n"; echo "-------------------------------------------------------------------\n"; echo "\n"; } } private function formaterCorrespondanceCheminId($infos_nouveaux_mots_cles) { $mots_cles_correspondances = array(); foreach($infos_nouveaux_mots_cles as &$mot) { $cle = $mot['chemin'].'-'.$mot['id_utilisateur']; $mots_cles_correspondances[$cle] = $mot; } return $mots_cles_correspondances; } private function formaterChemin($mots_cles) { $mots_cles_hierarchiques = array(); $chemin_traites = array(); $pbs = array('doublons' => array(), 'vides' => array()); foreach($mots_cles as &$mot) { if(trim($mot['mot_cle']) != "") { $chemin = '/'; $cle_parent = $mot['parent'].'-'.$mot['id_utilisateur']; if(isset($mots_cles_hierarchiques[$cle_parent])) { $chemin = $mots_cles_hierarchiques[$cle_parent]['chemin']; } $chemin .= self::simplifier($mot['mot_cle']).'/'; $chemin = str_replace("//", "/", $chemin); if(!isset($chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']])) { $cle = $mot['id_mot_cle'].'-'.$mot['id_utilisateur']; $mots_cles_hierarchiques[$cle] = array( 'id_utilisateur' => $mot['id_utilisateur'], 'chemin' => $chemin, 'mot_cle' => $mot['mot_cle'] ); $chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = 1; } else { $pbs['doublons'][self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = $mot; } } else { $pbs['vides'][] = $mot; } } //echo '
'.print_r($mots_cles_hierarchiques,true).'
';exit; return $mots_cles_hierarchiques; } static public function harmoniserPourDoublon($texte) { $texte = htmlentities($texte, ENT_NOQUOTES, 'utf-8'); $texte = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $texte); $texte = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $texte); // pour les ligatures e.g. 'œ' $texte = preg_replace('/&[^;]+;/', '', $texte); // supprime les autres caractères return strtolower($texte); } static public function simplifier($text) { // le slash est le seul caractère interdit dans les mots clés return trim(str_replace(array('\\','/'), '', $text)); } } ?>