Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2414 → Rev 2415

/trunk/scripts/cli.php
7,14 → 7,15
* Lancer ce fichier en ligne de commande avec :
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code>
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
* @category CEL
* @package Scripts
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
 
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
33,5 → 34,4
 
// Initialisation et lancement du script appelé en ligne de commande
Cli::executer();
}
?>
}
/trunk/scripts/modules/maintenance/Maintenance.php
1,4 → 1,21
<?php
// declare(encoding='UTF-8');
/**
* Classe de maintenance de la base de données du CEL.
*
* Utilisation :
* - <code>/opt/lamp/bin/php cli.php maintenance -a (voir méthode executer)</code>
*
* @category CEL
* @package Scripts
* @subpackage Maintenance
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Maintenance extends Script {
 
protected $bdd;
105,7 → 122,7
$this->traiterErreur($e->getMessage());
}
}
 
private function obtenirParametreIntObligatoirePourMethode($param) {
$param_val = $this->getParametre($param);
if(!$param_val || !is_numeric($param_val)) {
129,7 → 146,7
$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
. "INNER JOIN cel_mots_cles_images_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_image'] . "') "
. "WHERE id_image = '" . $image['id_image'] . "'";
$this->bdd->requeter($req);
$this->bdd->requeter($req);
}
}
 
140,7 → 157,7
"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
if(!$tout) {
$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
}
}
$res = $this->bdd->recupererTous($req);
echo count($res) . " observations trouvées\n";
foreach ($res as $image) {
147,7 → 164,7
$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
. "INNER JOIN cel_mots_cles_obs_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_observation'] . "') "
. "WHERE id_observation = '" . $image['id_observation'] . "'";
$this->bdd->requeter($req);
$this->bdd->requeter($req);
}
}
 
164,19 → 181,19
$res = $this->bdd->requeter($req);
echo "$res observations mises à jour\n";
}
 
protected function regenererChampsTailleImage() {
$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
$res = $this->bdd->recupererTous($req);
 
echo count($res)." images concernees \n";
echo "Début du traitement \n";
$images_maj = 0;
$image_meta_ratees = 0;
$images_inexistantes = 0;
 
foreach($res as $image) {
$chemin = $this->getCheminImage($image['id_image']);
$chemin = $this->getCheminImage($image['id_image']);
if(file_exists($chemin)) {
list($largeur, $hauteur) = @getimagesize($chemin);
if(is_numeric($largeur) && is_numeric($hauteur)) {
193,7 → 210,7
$images_inexistantes++;
}
$this->afficherAvancement("\tImages traitées : ", 1);
}
}
echo "\n";
echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
echo $images_maj." images ont vu leur infos de taille régénérées \n";
200,33 → 217,33
echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
echo $images_inexistantes." images n'existent pas en tant que fichier \n";
}
 
private function getCheminImage($id) {
$chemin_base = Config::get('dossierImages');
 
$id = sprintf('%09s', $id);
$id = wordwrap($id, 3 , '_', true);
 
list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
 
$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
 
return $chemin;
}
 
protected function reparerLiaisonsOublieesObs() {
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
 
$liaisons = $this->bdd->recupererTous($requete_liaisons);
$nb_liaisons_originales = count($liaisons);
 
// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
 
$anciens_mots_cles_fmt = array();
foreach($anciens_mots_cles as &$ancien_mot_cle) {
$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
235,11 → 252,11
}
$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
}
 
// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
 
$nouveau_mots_cles_fmt = array();
foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
248,18 → 265,18
}
$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle;
}
 
$anciens_mot_cles_pas_trouves = 0;
$nouveaux_mot_cles_pas_trouves = 0;
$utilisateurs_pas_trouves = 0;
$valeurs_a_inserer = array();
 
$ids_obs = array();
 
foreach($liaisons as &$liaison) {
$id_utilisateur_liaison = $liaison['ce_utilisateur'];
$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
 
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
267,7 → 284,7
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
 
$valeurs_a_inserer[] = array(
'id_element_lie' => $liaison['id_observation'],
'id_mot_cle' => $nouvel_id_mot_cle,
278,9 → 295,9
$nouveaux_mot_cles_pas_trouves++;
}
} else {
 
}
 
} else {
$anciens_mot_cles_pas_trouves++;
}
288,13 → 305,13
$utilisateurs_pas_trouves++;
}
}
 
echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
 
$tranches = array_chunk($valeurs_a_inserer, 800);
 
foreach($tranches as $tranche) {
309,7 → 326,7
}
echo "\n";
}
 
private function reparerLiaisonsOublieesImages() {
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
317,11 → 334,11
"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
 
$liaisons = $this->bdd->recupererTous($requete_liaisons);
 
// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
 
$anciens_mots_cles_fmt = array();
foreach($anciens_mots_cles as &$ancien_mot_cle) {
$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
330,11 → 347,11
}
$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
}
 
// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
 
$nouveau_mots_cles_fmt = array();
foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
343,16 → 360,16
}
$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
}
 
$anciens_mot_cles_pas_trouves = 0;
$nouveaux_mot_cles_pas_trouves = 0;
$utilisateurs_pas_trouves = 0;
$valeurs_a_inserer = array();
 
foreach($liaisons as &$liaison) {
$id_utilisateur_liaison = $liaison['ce_utilisateur'];
$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
 
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
359,7 → 376,7
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
 
$valeurs_a_inserer[] = array(
'id_element_lie' => $liaison['id_image'],
'id_mot_cle' => $nouvel_id_mot_cle,
370,9 → 387,9
$nouveaux_mot_cles_pas_trouves++;
}
} else {
 
}
 
} else {
$anciens_mot_cles_pas_trouves++;
}
380,7 → 397,7
$utilisateurs_pas_trouves++;
}
}
 
echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
400,24 → 417,24
}
echo "\n";
}
 
private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) {
$ancienne_table_obs = Config::get('table_obs_recup');
$requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ".
"FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'";
$obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte);
 
$requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ".
"WHERE id_utilisateur IN ".
"WHERE id_utilisateur IN ".
"(SELECT id_utilisateur FROM ".$ancienne_table_obs." ".
"WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')";
$nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle);
 
$mots_cles_indexes = array();
foreach($nouveaux_mots_cles as $mot_cle) {
$mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle;
}
 
$liaisons_a_inserer = array();
$utilFoirax = 0;
$mcFoirax = 0;
470,7 → 487,7
$q2 = "DELETE FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsImages) . ");";
$r2 = $this->bdd->requeter($q2);
}
 
// On convertit tous les doublons en cible
$q3 = "UPDATE cel_mots_cles_images_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
$r3 = $this->bdd->requeter($q3);
499,7 → 516,7
$q2 = "DELETE FROM cel_mots_cles_obs_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsObs) . ");";
$r2 = $this->bdd->requeter($q2);
}
 
// On convertit tous les doublons en cible
$q3 = "UPDATE cel_mots_cles_obs_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
$r3 = $this->bdd->requeter($q3);
560,16 → 577,16
}
echo "$aTraiter groupes ($mode) ont été réduits" . PHP_EOL;
}
 
private function reduireEtNormaliserMotsClesImages($util=null) {
$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_images', 'chemin', 'images', $util);
}
 
private function reduireEtNormaliserMotsClesObs($util=null) {
$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_obs', 'chemin', 'obs', $util);
}
private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images", $util=null) {
 
private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images", $util=null) {
echo "Suppression des accents dans la table $table, colonne $colonne ...";
$this->supprimerAccents($table, $colonne, $util);
echo "effectuée \n";
588,7 → 605,7
echo "Réduction de tous les mots clés $mode \n";
$req_utilisateurs = "SELECT DISTINCT id_utilisateur FROM ".$table;
$utilisateurs = $this->bdd->recupererTous($req_utilisateurs);
 
foreach($utilisateurs as $utilisateur) {
echo "Utilisateur en cours de traitement : ".$utilisateur['id_utilisateur']." \n";
if($mode == "images") {
600,17 → 617,17
}
echo "Fin de la réduction des mots clés $mode \n";
}
 
private function supprimerMajuscules($table, $colonne, $util=null) {
$requete = "UPDATE ".$table." SET ".$colonne." = LOWER(".$colonne.")";
if ($util !== null) {
$requete .= " WHERE id_utilisateur = $util";
}
$this->bdd->requeter($requete);
$this->bdd->requeter($requete);
}
 
private function supprimerAccents($table, $colonne, $util=null) {
 
$requetes = array(
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Š','S')",
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'š','s')",
680,7 → 697,7
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ÿ','y')",
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ƒ','f')",
);
 
foreach($requetes as $requete) {
if ($util !== null) {
$requete .= " WHERE id_utilisateur = $util";
688,5 → 705,4
$this->bdd->requeter($requete);
}
}
}
?>
}
/trunk/scripts/modules/migration_sauvages/bibliotheque/Dao.php
1,4 → 1,18
<?php
// declare(encoding='UTF-8');
/**
* Contient les requêtes effecturant la migration pour Sauvages.
*
* @category CEL
* @package Scripts
* @subpackage Migration : Sauvages
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Dao extends Bdd {
 
public function obtenirNbObservationsSauvages() {
49,5 → 63,4
$ajout = $this->requeter($requete);
return ($ajout !== false);
}
}
?>
}
/trunk/scripts/modules/migration_sauvages/MigrationSauvages.php
1,6 → 1,5
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
// declare(encoding='UTF-8');
/**
* Traitement des observations sauvages pour les migrer vers des champs étendus
*
7,26 → 6,27
* Description : classe permettant d'affecter des champs étendus aux observations sauvages. Elle permet aussi
* d'exporter les données à migrer en CSV pour vérifier les informations avant la migration.
* Utilisation :
* - Pour migrer : /opt/lamp/bin/php script.php migration_sauvages -a migrer -v 3
* - Pour exporter : /opt/lamp/bin/php script.php migration_sauvages -a exporter -s chemin_vers_fichier_sortie
* - Pour migrer : <code>/opt/lamp/bin/php cli.php migration_sauvages -a migrer -v 3</code>
* - Pour exporter : <code>/opt/lamp/bin/php cli.php migration_sauvages -a exporter -s chemin_vers_fichier_sortie</code>
*
* @category PHP 5.3
* @package scripts
//Auteur original :
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
* @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$
* @category CEL
* @package Scripts
* @subpackage Migration : Sauvages
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
// +-------------------------------------------------------------------------------------------------------------------+
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
 
class MigrationSauvages extends Script {
protected $parametres_autorises = array(
'-s' => array(false, true, "Chemin vers le fichier de sortie pour l'export"));
 
// +-------------------------------------------------------------------------------------------------------------------+
 
public function executer() {
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
$this->dao = new Dao();
// Récupération de paramétres
// Lancement de l'action demandée
223,5 → 223,4
 
return $champs_etendus;
}
}
?>
}
/trunk/scripts/modules/migration_optimisation/MigrationOptimisation.php
New file
0,0 → 1,173
<?php
// declare(encoding='UTF-8');
/**
* Mise à jour de la base de données afin de l'optimiser :
* - suppression de la table cel_obs_images
* - remplacement du champ "eflore_publiable" de la table "cel_images" par un champ "transmission" (correspondant au champ tansmission des obs)
* - ajout du champ "date_liaison" dans la table "cel_images"
*
* Utilisation :
* - mise à jour de la bdd : <code>/opt/lamp/bin/php cli.php migration_optimisation -a migrer</code>
*
* @category CEL
* @package Scripts
* @subpackage Migration : Optimisation
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
 
class MigrationOptimisation extends Script {
 
public function executer() {
$cmd = $this->getParametre('a');
$this->mode_verbeux = $this->getParametre('v');
 
switch($cmd) {
case 'celObsImages':
$this->migrerCelObsImages();
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 migrerCelObsImages() {
$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 '<pre>'.print_r($mots_cles_hierarchiques,true).'</pre>';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. '&oelig;'
$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));
}
}