Subversion Repositories Applications.referentiel

Compare Revisions

Ignore whitespace Rev 50 → Rev 51

/trunk/configurations/referentiel_v2.1.ini
3,41 → 3,77
; Noms des champs
champs = "num_nom,num_nom_retenu,num_tax_sup,rang,nom_complet,nom_supra_generique,genre,epithete_infra_generique,epithete_sp,type_epithete,epithete_infra_sp,cultivar_groupe,cultivar,nom_commercial,auteur,annee,biblio_origine,notes,nom_addendum,homonyme,basionyme,synonyme_proparte,synonyme_douteux,synonyme_mal_applique,synonyme_orthographique,biblio_statut,hybride_parent_01,hybride_parent_01_notes,hybride_parent_02,hybride_parent_02_notes,nom_francais,presence,statut_origine,statut_introduction,statut_culture"
; Noms et types des champs
champs_type = "num_nom=INT,
num_nom_retenu=VARCHAR,
num_tax_sup=VARCHAR,
rang=INT,
nom_complet=VARCHAR,
nom_supra_generique=VARCHAR,
genre=VARCHAR,
epithete_infra_generique=VARCHAR,
epithete_sp=VARCHAR,
type_epithete=VARCHAR,
epithete_infra_sp=VARCHAR,
cultivar_groupe=VARCHAR,
cultivar=VARCHAR,
nom_commercial=VARCHAR,
auteur=VARCHAR,
annee=VARCHAR,
biblio_origine=VARCHAR,
champs_type = "num_nom=INT|7,
num_nom_retenu=VARCHAR|7,
num_tax_sup=VARCHAR|7,
rang=INT|4,
nom_complet=VARCHAR|500,
nom_supra_generique=VARCHAR|100,
genre=VARCHAR|100,
epithete_infra_generique=VARCHAR|100,
epithete_sp=VARCHAR|100,
type_epithete=VARCHAR|100,
epithete_infra_sp=VARCHAR|100,
cultivar_groupe=VARCHAR|100,
cultivar=VARCHAR|100,
nom_commercial=VARCHAR|100,
auteur=VARCHAR|100,
annee=VARCHAR|4,
biblio_origine=VARCHAR|500,
notes=TEXT,
nom_addendum=VARCHAR,
homonyme=VARCHAR,
basionyme=VARCHAR,
synonyme_proparte=VARCHAR,
synonyme_douteux=VARCHAR,
synonyme_mal_applique=VARCHAR,
synonyme_orthographique=VARCHAR,
nom_addendum=VARCHAR|500,
homonyme=VARCHAR|7,
basionyme=VARCHAR|7,
synonyme_proparte=VARCHAR|100,
synonyme_douteux=VARCHAR|7,
synonyme_mal_applique=VARCHAR|7,
synonyme_orthographique=VARCHAR|7,
biblio_statut=TEXT,
hybride_parent_01=VARCHAR,
hybride_parent_01=VARCHAR|7,
hybride_parent_01_notes=TEXT,
hybride_parent_02=VARCHAR,
hybride_parent_02=VARCHAR|7,
hybride_parent_02_notes=TEXT,
nom_francais=VARCHAR,
presence=VARCHAR,
statut_origine=VARCHAR,
statut_introduction=VARCHAR,
statut_culture=VARCHAR"
nom_francais=VARCHAR|500,
presence=VARCHAR|100,
statut_origine=VARCHAR|100,
statut_introduction=VARCHAR|100,
statut_culture=VARCHAR|100"
; Classement des champs dans les différentes classes de modification
champs_diff_type = "num_nom=1,
num_nom_retenu=1,
num_tax_sup=1,
rang=1,
nom_complet=2,
nom_supra_generique=2,
genre=2,
epithete_infra_generique=2,
epithete_sp=2,
type_epithete=2,
epithete_infra_sp=2,
cultivar_groupe=2,
cultivar=2,
nom_commercial=2,
auteur=3,
annee=3,
biblio_origine=3,
notes=3,
nom_addendum=3,
homonyme=3,
basionyme=3,
synonyme_proparte=3,
synonyme_douteux=3,
synonyme_mal_applique=3,
synonyme_orthographique=3,
biblio_statut=3,
hybride_parent_01=3,
hybride_parent_01_notes=3,
hybride_parent_02=3,
hybride_parent_02_notes=3,
nom_francais=3,
presence=3,
statut_origine=3,
statut_introduction=3,
statut_culture=3"
; Valeurs numériques des rangs
rangs = "10,20,30,40,50,55,40,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,340,350,360,370,380,390,400,410,420,430"
; Valeur numérique indiquant le rang du genre
/trunk/bibliotheque/dao/MetaDao.php
New file
0,0 → 1,45
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des Référentiels.
* Permet d'accèder au méta-données des référentiels.
*
* @package Referentiel
* @category Php 5.2
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $Id$
*
*/
class MetaDao extends Dao {
const SERVICE = 'Meta';
/**
* Retourne les dernières méta-données pour un projet donné.
*
* @param string le code du projet de référentiel.
* @return mixed un tableau contenant les informations sur les dernières méta-données ou false en cas d'échec.
*/
public function getDerniere($code_projet) {
$url = $this->url."/Derniere/$code_projet";
$json = $this->envoyerRequeteConsultation($url);
$traitements = json_decode($json, true);
return $traitements;
}
/**
* Ajoute des méta-données pour une référentiel donné.
*
* @param array les méta-données dans un tableau dont les clés correspondent aux champs de la table.
* @return mixed l'id du traitement ou false en cas d'échec.
*/
public function ajouter($metadonnees) {
// Envoie des données et récupération du retour
$json = $this->envoyerRequeteAjout($this->url, $metadonnees);
$id = json_decode($json, true);
return $id;
}
}
/trunk/bibliotheque/dao/ReferentielDao.php
15,6 → 15,7
*/
class ReferentielDao extends Dao {
const SERVICE = 'Referentiel';
const SERVICE_ARCHIVAGE = 'ArchiverReferentiel';
 
/**
* Retourne des infos sur l'ensemble des référentiels disponibles.
60,5 → 61,24
$nbre = json_decode($json, true);
return $nbre;
}
/**
* Copie la table de travail du référentiel pour l'archiver avec une numéro de version.
*
* @param string le code du référentiel.
* @param string la version du référentiel.
* @return bool true en cas de succé ou false en cas d'échec.
*/
public function archiver($code_projet, $version) {
$url = $this->url_jrest.self::SERVICE_ARCHIVAGE;
// Préparation des données à passer par POST
$donnees['code'] = $code_projet;
$donnees['version'] = $version;
// Envoie des données et récupération du retour
$json = $this->envoyerRequeteAjout($url, $donnees);
$ok = json_decode($json, true);
return $ok;
}
}
?>
/trunk/interfaces/controleurs/Versionnage.php
197,7 → 197,7
'contributeur' => 'Auteurs/Contributeurs');
foreach ($champs_contact as $champ_id => $champ_nom) {
if (isset($_POST[$champ_id]) && ! $this->verifierContact($_POST[$champ_id])) {
$this->addMessage("Le champ '$champ_nom' n'est pas au format : Prénom1 NOM1 (Organisation1) <courriel1>, Prénom2 NOM2 (Organisation2) <courriel2>.");
$this->addMessage("Le champ '$champ_nom' n'est pas au format : Prénom1 NOM1 (Organisation1) [courriel1], Prénom2 NOM2 (Organisation2) [courriel2].");
$ok = false;
}
}
220,7 → 220,7
$contacts = explode(',', $txt);
foreach ($contacts as $contact) {
$contact = trim($contact);
if (! preg_match("/^$pp $pn $po <$pc>(?:|.)$/u", $contact)) {
if (! preg_match("/^$pp $pn $po \[$pc\](?:|.)$/u", $contact)) {
$ok = false;
}
}
/trunk/interfaces/controleurs/AppliControleur.php
294,6 → 294,13
* Lance l'ajout d'un traitement
*/
protected function ajouterTraitement($referentiel_code, $script_nom) {
$this->ajouterTraitementParametre($referentiel_code, null, $script_nom);
}
/**
* Lance l'ajout d'un traitement
*/
protected function ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom) {
if (is_null($referentiel_code)) {
$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdnff).");
} else {
325,7 → 332,7
}
}
} else {
$resultat = $traitementDao->ajouterTraitement($referentiel_code, $script_nom);
$resultat = $traitementDao->ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom);
if ($resultat != false) {
$this->addMessage("Le traitement #'$resultat' a été ajouté.");
$this->lancerScript($referentiel_code, $script_nom);
/trunk/services/modules/Referentiel.php
69,7 → 69,7
/* Méthode pour récupérer les noms d'un référentiel.
* Appelée avec les paramêtres d'url suivant :
* /RefReferentiel/tout/code_du_referentiel
* /Referentiel/tout/code_du_referentiel?start=0&limit=1000
*/
public function getElementTout($params_url) {
$p = $this->traiterParametresUrl(array('projet'), $params_url, false);
87,6 → 87,13
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as &$nom) {
$donnees[$nom['num_nom']] = $nom;
unset($nom);
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
/trunk/services/modules/Meta.php
New file
0,0 → 1,112
<?php
/**
* Service fournissant des données de la table contenant les méta-données d'un référentiel de travail.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @category Php 5.2
* @package Referentiel
* @author Jean-Pascal MILCENT <jpm@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 2010 Tela-Botanica
* @version $Id$
*/
class Meta extends Ref {
 
/**
* Méthode principale appelée avec une requête de type GET.
*/
public function getElement($params_url = array()) {
// Initialisation des variables
$info = array();
// Nour recherchons le type de requête demandé
$p = $this->traiterParametresUrl(array('type'), $params_url, false);
extract($p);
if (!is_null($type)) {
$methode = 'getElement'.$type;
if (method_exists($this, $methode)) {
array_shift($params_url);
$info = $this->$methode($params_url);
} else {
$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
}
} else {
$this->messages[] = "Veuillez préciser le type de requête.";
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/** Méthode pour récupérer les dernières meta-données ajoutées
* Appelée avec les paramêtres d'url suivant :
* /Meta/Dernier/code_projet
*/
public function getElementDerniere($params_url) {
$p = $this->traiterParametresUrl(array('projet'), $params_url);
extract($p);
$nom_table = strtolower($projet).'_meta';
$donnees = false;
if (isset($projet)) {
$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '.
"FROM $nom_table ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'id_meta DESC').' '.
'LIMIT 0,1 ';
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (0 == count($donnees)) {
$donnees = null;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
} else {
$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff). ";
}
return $donnees;
}
/**
* Méthode appelée pour ajouter des méta-données à un référentiel.
* Retour l'id du nouvel enregistrement ou false!
*/
public function createElement($params_post) {
$params_attendus = array('titre', 'code', 'domaine_taxo', 'domaine_geo', 'domaine_nom', 'classification',
'version', 'coordinateur', 'auteur', 'contributeur', 'date_production', 'date_validation', 'source',
'contact', 'editeur', 'droit', 'licence', 'referencement', 'stat_combinaison', 'stat_taxon', 'stat_modification',
'signature');
$params_proteges = $this->traiterParametresPost($params_attendus, $params_post);
$nom_table = strtolower($params_post['code']).'_meta';
$champs = array();
$valeurs = array();
foreach ($params_proteges as $champ => $valeur) {
$champs[] = $champ;
$valeurs[] = $valeur;
}
try {
$requete = "INSERT INTO `$nom_table` (".implode(', ', $champs).') VALUES ('.implode(', ', $valeurs).') ';
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$id = false;
$this->debug[] = "Méta-données NON ajoutées.";
} else {
$id = $this->bdd->lastInsertId();
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
$this->envoyer($id);
}
}
/trunk/services/modules/ArchiverReferentiel.php
New file
0,0 → 1,57
<?php
/**
* Service réalisant l'archivage d'une version de travail d'un référentiel.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @category Php 5.2
* @package Referentiel
* @author Jean-Pascal MILCENT <jpm@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 2010 Tela-Botanica
* @version $Id$
*/
class ArchiverReferentiel extends Ref {
/**
* Méthode appelée pour ajouter des méta-données à un référentiel.
* Retour l'id du nouvel enregistrement ou false!
*/
public function createElement($params_post) {
$params_attendus = array('code', 'version');
$params_proteges = $this->traiterParametresPost($params_attendus, $params_post);
$nom_table_origine = strtolower($params_post['code']);
$nom_table_copie = strtolower($params_post['code']).'_v'.str_replace('.', '_', $params_post['version']);
$retour = false;
try {
$requete = "SHOW CREATE TABLE `$nom_table_origine`";
$resultat = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($resultat === false) {
$this->debug[] = "La récupération de la commande sql de création de la table d'archive a échoué.";
} else {
$requete = $resultat['Create Table'];
$requete = str_replace($nom_table_origine, $nom_table_copie, $requete);
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->debug[] = "La création de la structure de la table d'archive a échoué.";
} else {
$requete = "INSERT INTO `$nom_table_copie` SELECT * FROM `$nom_table_origine`";
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->debug[] = "La copie des données a échoué.";
} else {
$retour = true;
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
$this->envoyer($retour);
}
}
/trunk/services/modules/TableStructure.php
49,7 → 49,7
/* Méthode pour récupérer des informations sur les colonnes d'une table.
* Appelée avec les paramêtres d'url suivant :
* /RefTableStructure/colonnes/nom_de_la_table
* /TableStructure/colonnes/nom_de_la_table
*/
public function getElementColonnes($table) {
$requete = "SHOW COLUMNS FROM `$table` ";
68,7 → 68,7
/* Méthode pour récupérer un tableau d'analyse de la table.
* Appelée avec les paramêtres d'url suivant :
* /RefTableStructure/analyse/nom_de_la_table
* /TableStructure/analyse/nom_de_la_table
*/
public function getElementAnalyse($table) {
$requete = "SELECT * FROM `$table` PROCEDURE ANALYSE ( )";
/trunk/services/modules/Ref.php
126,10 → 126,23
return $PDO;
}
protected function executerRequete($requete, $message_echec) {
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = $message_echec;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
return $infos;
}
protected function getTxt($id) {
$sortie = '';
switch ($id) {
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
default : $sortie = $id;
}
return $sortie;
/trunk/services/modules/Traitement.php
281,7 → 281,7
try {
$requete = "INSERT INTO ref_traitement ".
' (referentiel_code, script, script_parametres, nom, meta_date_creation) '.
" VALUES ({$params_proteges['referentiel_code']}, {$params_proteges['script_parametres']}, {$params_proteges['script']}, $nom, $meta_date_creation) ";
" VALUES ({$params_proteges['referentiel_code']}, {$params_proteges['script']}, {$params_proteges['script_parametres']}, $nom, $meta_date_creation) ";
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$id = false;
/trunk/scripts/modules/versionnage/squelettes/meta.tpl.tsv
New file
0,0 → 1,22
titre <?=$titre?>
code <?=$acronyme?>
domaine_taxo <?=$dom_tax?>
domaine_geo <?=$dom_geo?>
domaine_nom <?=$dom_code?>
classification <?=$classification?>
version <?=$version?>
auteur <?=$auteur_principal?>
coordinateur <?=$coordinateur?>
contributeur <?=$contributeur?>
contributeur <?=$contributeur?>
date_production <?=$date_prod?>
source <?=$source?>
contact <?=$contact?>
editeur <?=$editeur?>
droit <?=$copyright?>
licence <?=$licence?>
referencement <?=$referencement?>
stat_combinaison <?=$stats['combinaison']?>
stat_taxon <?=$stats['taxon']?>
stat_modification <?=$stats['modification']?>
signature <?=$signature?>
/trunk/scripts/modules/versionnage/squelettes/diff.tpl.tsv
New file
0,0 → 1,6
<?=implode("\t", $champs)?>
 
<?php foreach ($diff as $nom_infos) : ?>
<?=implode("\t", $nom_infos)?>
 
<?php endforeach; ?>
/trunk/scripts/modules/versionnage/Versionnage.php
22,11 → 22,20
private $projet = null;
private $traitement = null;
private $meta = null;
private $messages = null;
private $manuel = null;
private $noms = null;
private $noms_precedents = null;
private $noms_stat = null;
private $champs_ordre = null;
private $champs_nom = null;
private $diff_modif_types = null;
private $signature_md5 = null;
private $resultatDao = null;
private $traitementDao = null;
private $metaDao = null;
private $tableStructureDao = null;
private $referentielDao = null;
52,10 → 61,11
$cmd = $this->getParam('a');
switch ($cmd) {
case 'tout' :
$this->metaDao = new MetaDao();
$this->resultatDao = new ResultatDao();
$this->referentielDao = new ReferentielDao();
$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v2.1.ini');
Debug::printr('Départ lancement test:');
Debug::printr('Départ lancement versionnage:');
$this->lancerVersionnage();
break;
default :
67,33 → 77,76
}
 
public function lancerVersionnage() {
// Récupération des données à tester
$noms = $this->referentielDao->getTout($this->projet);
Debug::printr('Nbre noms :'.count($noms));
$this->chargerTraitementParametre();
$this->archiver();
$this->chargerNomsATraiter();
$this->analyserNomsATraiter();
$this->creerFichiers();
$this->traiterMessages();
}
$this->versionnerBdnt($noms);
$this->traiterMessagesErreur();
private function chargerTraitementParametre() {
$this->meta = unserialize($this->traitement['script_parametres']);
}
private function versionnerBdnt($noms) {
Debug::printr("Element courrant du tableau des noms : ".print_r(current($noms),true));
//Debug::printr("Taille mémoire du tableau des noms : ".Debug::tailleMemoireVar($noms));
$champs_ordre = $this->determinerOrdreDesChamps(current($noms));
Debug::printr("Tableau ordre des champs : ".print_r($champs_ordre, true));
private function archiver() {
$ok = $this->referentielDao->archiver($this->projet, $this->meta['version']);
if ($ok) {
$m = "L'archivage de la version '{$this->meta['version']}' du référentiel '{$this->projet}' a réussi";
$this->ajouterMessage($m);
} else {
$m = "L'archivage de la version '{$this->meta['version']}' du référentiel '{$this->projet}' a échoué";
$this->ajouterMessage($m);
}
}
private function chargerNomsATraiter() {
$archive_courante = strtolower($this->projet).'_v'.str_replace('.', '_', $this->meta['version']);
Debug::printr("Nom archive courante :".$archive_courante);
$this->noms = $this->referentielDao->getTout($archive_courante);
}
private function analyserNomsATraiter() {
$this->noms_stat['combinaison'] = $this->getNombreCombinaison();
$this->noms_stat['taxon'] = $this->getNombreTaxon();
Debug::printr("Stats :".print_r($this->noms_stat, true));
}
private function getNombreCombinaison() {
return count($this->noms);
}
private function getNombreTaxon() {
$nbre = 0;
foreach ($this->noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
$nbre++;
}
}
return $nbre;
}
private function creerFichiers() {
// Respecter l'ordre de traitement : BDNT puis DIFF puis META
$this->creerFichierBdnt();
$this->creerFichierDiff();
$this->creerFichierMeta();
}
private function creerFichierBdnt() {
Debug::printr("Element courrant du tableau des noms : ".print_r(current($this->noms),true));
//Debug::printr("Taille mémoire du tableau des noms : ".Debug::tailleMemoireVar($this->noms));
$this->determinerOrdreDesChamps();
$this->definirNomDesChamps();
$donnees = array();
$donnees['champs'] = array_flip($champs_ordre);
//$donnees['noms'] = $noms;
foreach ($noms as $id => $nom) {
// Suppression de la ligne du tableau pour gagner de l'espace mémoire
unset($noms[$id]);
$donnees['champs'] = $this->champs_nom;
foreach ($this->noms as &$nom) {
$infos = array();
foreach ($nom as $champ => $valeur) {
if (isset($champs_ordre[$champ])) {
$ordre = $champs_ordre[$champ];
$infos[$ordre] = $valeur;
foreach ($nom as $champ => &$valeur) {
if (isset($this->champs_ordre[$champ])) {
$ordre = $this->champs_ordre[$champ];
$infos[$ordre] = trim($valeur);
} else {
$e = "Le champ '$champ' n'a pas été pris en compte dans l'attribution de l'ordre des champs.";
$this->ajouterMessage($e);
102,22 → 155,23
$donnees['noms'][] = $infos;
}
$bdtn_tsv = $this->getVue('versionnage/squelettes/bdnt', $donnees, '.tpl.tsv');
if (file_put_contents(Config::get('chemin_referentiel_zip').'bdnt.txt', $bdtn_tsv) == false) {
Debug::printr("une erreur est survenu lors de l'écriture du fichier");
} else {
}
$bdnt_tsv = $this->getVue('versionnage/squelettes/bdnt', $donnees, '.tpl.tsv');
$this->ecrireFichierBdnt($bdnt_tsv);
}
private function determinerOrdreDesChamps($nom) {
private function determinerOrdreDesChamps() {
$champs_ordre = explode(',', $this->manuel['champs']);
$champs_ordre = array_flip($champs_ordre);
$champs_ordre = $this->attribuerOrdreChampsSupplémentaires($champs_ordre, $nom);
$nom_courant = current($this->noms);
$champs_ordre = $this->attribuerOrdreChampsSupplémentaires($champs_ordre, $nom_courant);
asort($champs_ordre);
return $champs_ordre;
$this->champs_ordre = $champs_ordre;
}
private function definirNomDesChamps() {
$this->champs_nom = array_flip($this->champs_ordre);
}
private function attribuerOrdreChampsSupplémentaires($champs_ordre, $nom) {
foreach ($nom as $champ => $info) {
if (!isset($champs_ordre[$champ])) {
132,6 → 186,151
$this->messages[] = array($titre, $message);
}
private function ecrireFichierBdnt($contenu) {
$fichier_nom = $this->getBaseNomFichier().'_ref.txt';
$fichier_chemin = Config::get('chemin_referentiel_zip').$fichier_nom;
if ($this->ecrireFichier($fichier_chemin, $contenu)) {
$this->ajouterMessage("Écriture du fichier bdnt réussie.");
$this->signature_md5 = md5_file($fichier_chemin);
$this->ajouterMessage("Signature MD5 du fichier bdnt :".$this->signature_md5);
$this->ajouterMessage("Nombre de noms traités : ".count($noms));
}
}
private function getBaseNomFichier() {
return strtolower($this->meta['acronyme'].'_v'.$this->meta['version']);
}
private function ecrireFichier($fichier_chemin, $contenu) {
$retour = true;
if (file_put_contents($fichier_chemin, $contenu) == false) {
$e = "Une erreur est survenu lors de l'écriture du fichier : $fichier_chemin";
$this->ajouterMessage($e);
$retour = false;
}
return $retour;
}
private function creerFichierDiff() {
$derniere_meta = $this->metaDao->getDerniere($this->projet);
if ($derniere_meta === false) {
$this->ajouterMessage("Premier versionnage pour ce projet, aucun fichier différentiel ne sera créé.");
} else {
$code_projet_precedent = strtolower($derniere_meta['code']).'_v'.str_replace('.', '_', $derniere_meta['version']);
$this->noms_precedents = $this->referentielDao->getTout($code_projet_precedent);
$donnees = array();
$donnees['diff'] = $this->realiserDiff();
$donnees['champs'] = $this->champs_nom;
$diff_tsv = $this->getVue('versionnage/squelettes/diff', $donnees, '.tpl.tsv');
$this->ecrireFichierDiff($diff_tsv);
}
}
private function realiserDiff() {
$diff = array();
$this->noms_stat['modification'] = 0;
foreach ($this->noms as $id => &$nom) {
if (!isset($this->noms_precedents[$id])) {
$diff[$id] = $nom;
$diff[$id]['modification_type'] = 'A';
$diff[$id]['modification_type_1'] = '0';
$diff[$id]['modification_type_2'] = '0';
$diff[$id]['modification_type_3'] = '0';
$this->noms_stat['modification']++;
} else {
$nom_precedent =& $this->noms_precedents[$id];
$nom_diff = array_diff_assoc($noms, $nom_precedent);
if (count($nom_diff) > 0) {
$this->noms_stat['modification']++;
$modif['modification_type'] = 'M';
$modif['modification_type_1'] = '0';
$modif['modification_type_2'] = '0';
$modif['modification_type_3'] = '0';
$this->chargerTableauChampsModifTypes();
foreach ($this->champs_nom as $champ) {
if (isset($nom_diff[$champ])) {
$diff[$id][$champ] = $nom_diff[$champ];
$type = $this->getDiffType($champ);
$modif['modification_type_'.$type] = '1';
} else {
$diff[$id][$champ] = '';
}
}
foreach ($modif as $cle => $val) {
$diff[$id][$cle] = $val;
}
}
}
}
return $diff;
}
private function chargerTableauChampsModifTypes() {
$champs = explode(',', $this->manuel['champs_diff_type']);
foreach ($champs as $champ) {
list($champ_nom, $type) = explode('=', $champ);
$this->diff_modif_types[$champ_nom] = $type;
}
}
private function getDiffType($champ_nom) {
$type = isset($this->diff_modif_types[$champ_nom]) ? $this->diff_modif_types[$champ_nom] : '3';
return $type;
}
private function ecrireFichierDiff($contenu) {
$fichier_nom = $this->getBaseNomFichier().'diff.txt';
$fichier_chemin = Config::get('chemin_referentiel_zip').$fichier_nom;
if ($this->ecrireFichier($fichier_chemin, $contenu)) {
$this->ajouterMessage("Écriture du fichier diff réussie.");
}
}
private function creerFichierMeta() {
$donnees = array();
$donnees = $this->meta;
$donnees['stats'] = $this->noms_stat;
$donnees['signature'] = $this->signature_md5;
$meta_tsv = $this->getVue('versionnage/squelettes/meta', $donnees, '.tpl.tsv');
$this->ecrireFichierMeta($meta_tsv);
}
private function ecrireFichierMeta($contenu) {
$fichier_nom = $this->getBaseNomFichier().'_meta.txt';
$fichier_chemin = Config::get('chemin_referentiel_zip').$fichier_nom;
if ($this->ecrireFichier($fichier_chemin, $contenu)) {
$this->ajouterMessage("Écriture du fichier meta réussie.");
$this->archiverMetadonnees();
}
}
private function archiverMetadonnees() {
$metadonnees = $this->meta;
$metadonnees['code'] = $this->meta['acronyme'];
unset($metadonnees['acronyme']);
$metadonnees['domaine_taxo'] = $this->meta['dom_tax'];
unset($metadonnees['dom_tax']);
$metadonnees['domaine_geo'] = $this->meta['dom_geo'];
unset($metadonnees['dom_geo']);
$metadonnees['domaine_nom'] = $this->meta['dom_code'];
unset($metadonnees['dom_code']);
$metadonnees['auteur'] = $this->meta['auteur_principal'];
unset($metadonnees['auteur_principal']);
$metadonnees['date_production'] = $this->meta['date_prod'];
unset($metadonnees['date_prod']);
$metadonnees['droit'] = $this->meta['copyright'];
unset($metadonnees['copyright']);
$ok = $this->metaDao->ajouter($metadonnees);
if ($ok === false) {
$this->ajouterMessage("L'archivage des métadonnées a échoué.");
}
}
private function traiterMessages() {
if (isset($this->messages)) {
foreach ($this->messages as $message) {
/trunk/scripts/modules/tests/Tests.php
1202,8 → 1202,9
// Recercherche des erreurs
$champs_erreur = array();
foreach ($champs_attendus as $champ_attendu) {
list($champ_attendu_nom, $champ_attendu_type) = explode('=', trim($champ_attendu));
 
list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
if (isset($champs_presents[$champ_attendu_nom])) {
$champs_present_type = $champs_presents[$champ_attendu_nom];