Subversion Repositories Applications.referentiel

Compare Revisions

Ignore whitespace Rev 19 → Rev 20

/trunk/bibliotheque/dao/Dao.php
New file
0,0 → 1,52
<?php
// declare(encoding='UTF-8');
/**
* Classe modèle spécifique à l'application, donc d'accés au données, elle ne devrait pas être appelée de l'extérieur.
* Elle est abstraite donc doit obligatoirement être étendue.
*
* @category Php5
* @package Referentiel
* @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$
*/
abstract class Dao {
protected $distinction = '0';
protected $limite_debut = null;
protected $limite_nbre = null;
protected $url_jrest = null;
public function __construct() {
$this->url_jrest = config::get('url_jrest');
}
public function avoirLimitation() {
$limitation = false;
if (!is_null($this->limite_debut) && !is_null($this->limite_nbre)) {
$limitation = true;
}
return $limitation;
}
public function setDistinction($distinct) {
$this->distinction = $distinct;
}
public function getDistinction() {
return $this->distinction;
}
public function setLimitation($limite_debut, $limite_nbre) {
$this->limite_debut = $limite_debut;
$this->limite_nbre = $limite_nbre;
}
public function getLimiteDebut() {
return $this->limite_debut;
}
public function getLimiteNbre() {
return $this->limite_nbre;
}
}
/trunk/bibliotheque/dao/ReferentielDao.php
New file
0,0 → 1,64
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des Référentiels.
* Permet d'accèder au données d'un référentiel.
*
* @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 ReferentielDao extends Dao {
const SERVICE = 'RefReferentiel';
/**
* Retourne l'ensemble des information sur les colonnes d'une table.
*
* @param string le nom de la table.
* @return array un tableau contenant les informations sur les colonnes de la table.
*/
public function getTout($code_projet) {
$url = $this->url_jrest.self::SERVICE."/Tout/$code_projet";
$json = file_get_contents($url);
$noms = json_decode($json, true);
/*
$noms = array();
$pas = 20000;
$max = $this->getNombre($code_projet);
for ($i = 0; $i < $max; $i = $i + $pas) {
$start = ($i != 0) ? ($i+1): $i;
$limit = $i + $pas;
$url_limitee = $url."?start=$start&limit=$limit";
Debug::printr("Récupération des données de $start à $limit");
$json = file_get_contents($url_limitee);
$enregistrements = json_decode($json, true);
$noms = array_merge($noms, $enregistrements);
}*/
return $noms;
}
/**
* Retourne le nombre de noms présents dans la table de travail du référentiel.
*
* @param string le code du référentiel.
* @return int le nombre de noms.
*/
public function getNombre($code_projet) {
$url = $this->url_jrest.self::SERVICE."/Nombre/$code_projet";
$json = file_get_contents($url);
$nbre = json_decode($json, true);
return $nbre;
}
}
?>
/trunk/bibliotheque/dao/TableStructureDao.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.
* Service concernant les tests
*
* @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 TableStructureDao extends Dao {
const SERVICE = 'RefTableStructure';
/**
* Retourne l'ensemble des information sur les colonnes d'une table.
*
* @param string le nom de la table.
* @return array un tableau contenant les informations sur les colonnes de la table.
*/
public function getColonnes($table) {
$url = $this->url_jrest.self::SERVICE."/colonnes/$table";
$json = file_get_contents($url);
$donnees = json_decode($json, true);
return $donnees['colonnes'];
}
/**
* Retourne l'ensemble des information d'analyse de la structure d'une table.
*
* @param string le nom de la table.
* @return array un tableau contenant les informations de l'analyse de la table.
*/
public function getAnalyse($table) {
$url = $this->url_jrest.self::SERVICE."/analyse/$table";
$json = file_get_contents($url);
$donnees = json_decode($json, true);
return $donnees['analyses'];
}
}
?>
/trunk/interfaces/modeles/ReferentielDao.php
File deleted
\ No newline at end of file
/trunk/interfaces/modeles/AppliModele.php
File deleted
\ No newline at end of file
/trunk/interfaces/modeles/TableStructureDao.php
File deleted
\ No newline at end of file
/trunk/interfaces/referentiel.php
15,9 → 15,8
function __autoload($nom_classe) {
// Tableau des chemins à inclure pour trouver une classe relatif à ce fichier
$chemins = array(
'bibliotheque'.DS.'noyau',
'..'.DS.'bibliotheque'.DS.'dao',
'bibliotheque'.DS.'pear',
'bibliotheque'.DS.'utilitaires',
'composants');
foreach ($chemins as $chemin) {
$fichier_a_inclure = dirname(__FILE__).DS.$chemin.DS.$nom_classe.'.php';
/trunk/interfaces/controleurs/Test.php
41,2214 → 41,8
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs
*/
public function executerActionParDefaut() {
return $this->lancerTest();
return '';
}
public function lancerTest() {
$donnees = array();
$donnees['tests'] = array();
/*
// Récupération des données à tester
$colonnes = $this->tableStructureDao->getColonnes($this->projet);
$analyses = $this->tableStructureDao->getAnalyse($this->projet);
$noms = $this->referentielDao->getTout($this->projet);
$noms = $this->classerNomsParNumNom($noms);
$noms_homonymie = $this->classerNomsParNomComplet($noms);
// Lancement des tests unitaires
$donnees['tests'][] = $this->testerNombreDeChamps($colonnes);
$donnees['tests'][] = $this->testerNomDesChamps($colonnes);
$donnees['tests'][] = $this->testerTypeDesChamps($colonnes);
$donnees['tests'][] = $this->testerTailleDesChamps($colonnes, $analyses);
$donnees['tests'][] = $this->testerNumNomClePrimaire($colonnes);
$donnees['tests'][] = $this->testerNumNomSuperieurAZero($noms);
$donnees['tests'][] = $this->testerNumNomRetenuSuperieurAZero($noms);
$donnees['tests'][] = $this->testerNumTaxSupEgalZeroUnique($noms);
$donnees['tests'][] = $this->testerTaxSupPourTaxon($noms);
$donnees['tests'][] = $this->testerExitenceTaxonSuperieur($noms);
$donnees['tests'][] = $this->testerClassificationRang($noms);
$donnees['tests'][] = $this->testerClassification($noms);
$donnees['tests'][] = $this->testerRang($noms);
$donnees['tests'][] = $this->testerNomCompletSupraGenerique($noms);
$donnees['tests'][] = $this->testerNomCompletGenre($noms);
$donnees['tests'][] = $this->testerNomCompletInfraGenre($noms);
$donnees['tests'][] = $this->testerNomCompletEspece($noms);
$donnees['tests'][] = $this->testerNomCompletInfraSpecifique($noms);
 
$donnees['tests'][] = $this->testerNomSupraGeneriqueEspaces($noms);
$donnees['tests'][] = $this->testerNomSupraGeneriqueSyntaxe($noms);
$donnees['tests'][] = $this->testerNomSupraGeneriqueRang($noms);
$donnees['tests'][] = $this->testerGenreEspaces($noms);
$donnees['tests'][] = $this->testerGenreSyntaxe($noms);
$donnees['tests'][] = $this->testerGenreRang($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueRang($noms);
$donnees['tests'][] = $this->testerEpitheteSpEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteSpSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteSpRang($noms);
$donnees['tests'][] = $this->testerTypeEpitheteEspaces($noms);
$donnees['tests'][] = $this->testerTypeEpitheteSyntaxe($noms);
$donnees['tests'][] = $this->testerTypeEpitheteHybridite($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpRang($noms);
$donnees['tests'][] = $this->testerGroupeCultivarSyntaxe($noms);
$donnees['tests'][] = $this->testerGroupeCultivarRang($noms);
$donnees['tests'][] = $this->testerCultivarSyntaxe($noms);
$donnees['tests'][] = $this->testerCultivarRang($noms);
$donnees['tests'][] = $this->testerNomCommercialSyntaxe($noms);
$donnees['tests'][] = $this->testerNomCommercialPresenceCultivar($noms);
$donnees['tests'][] = $this->testerAuteurSyntaxe($noms);
$donnees['tests'][] = $this->testerAnneeSyntaxe($noms);
$donnees['tests'][] = $this->testerBiblioOrigineSyntaxe($noms);
$donnees['tests'][] = $this->testerHomonymieSyntaxe($noms);
$donnees['tests'][] = $this->testerHomonymieExistence($noms, $noms_homonymie);
$donnees['tests'][] = $this->testerBasionymeSyntaxe($noms);
$donnees['tests'][] = $this->testerBasionymeExistence($noms);
$donnees['tests'][] = $this->testerSynonymeProparteSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeProparteExistence($noms);
$donnees['tests'][] = $this->testerSynonymeDouteuxSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeMalAppliqueSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeOrthographiqueSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeOrthographiqueExistence($noms);
$donnees['tests'][] = $this->testerHybrideParent01Syntaxe($noms);
$donnees['tests'][] = $this->testerHybrideParent01Existence($noms);
$donnees['tests'][] = $this->testerHybrideParent02Syntaxe($noms);
$donnees['tests'][] = $this->testerHybrideParent02Existence($noms);
$donnees['tests'][] = $this->testerPresenceSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutOrigineSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutIntroductionSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutCultureSyntaxe($noms);
*/
//Debug::printr($this->manuel);
$this->setSortie(self::RENDU_CORPS, $this->getVue('test', $donnees));
}
//+--------------------------------------------------------------------------------------------------------------+//
// TESTS
private function testerStatutCultureSyntaxe($noms) {
$info = array('titre' => 'statut_culture -> syntaxe',
'description' => "Le champ statut_culture peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_culture'] != '') {
if (!$this->verifierStatutCulture($nom['statut_culture'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerStatutIntroductionSyntaxe($noms) {
$info = array('titre' => 'statut_introduction -> syntaxe',
'description' => "Le champ statut_introduction peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_introduction'] != '') {
if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerStatutOrigineSyntaxe($noms) {
$info = array('titre' => 'statut_origine -> syntaxe',
'description' => "Le champ statut_origine peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_origine'] != '') {
if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerPresenceSyntaxe($noms) {
$info = array('titre' => 'presence -> syntaxe',
'description' => "Le champ presence contient soit :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['presence'] != '') {
if (!$this->verifierPresence($nom['presence'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'presence erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent02Existence($noms) {
$info = array('titre' => 'hybride_parent_02 -> existence',
'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_02'] != '') {
if (!isset($noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_02']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent02Syntaxe($noms) {
$info = array('titre' => 'hybride_parent_02 -> syntaxe',
'description' => "Le champ hybride_parent_02 contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_02'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_02'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_02']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent01Existence($noms) {
$info = array('titre' => 'hybride_parent_01 -> existence',
'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
if (!isset($noms[$nom['hybride_parent_01']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_01']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent01Syntaxe($noms) {
$info = array('titre' => 'hybride_parent_01 -> syntaxe',
'description' => "Le champ hybride_parent_01 contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_01'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_01'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_01']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeOrthographiqueExistence($noms) {
$info = array('titre' => 'synonyme_orthographique -> existence',
'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!isset($noms[$nom['synonyme_orthographique']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeOrthographiqueSyntaxe($noms) {
$info = array('titre' => 'synonyme_orthographique -> syntaxe',
'description' => "Le champ synonyme_orthographique contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeMalAppliqueSyntaxe($noms) {
$info = array('titre' => 'synonyme_mal_applique -> syntaxe',
'description' => "Le champ synonyme_mal_applique contient soit :\n".
" - une valeur vide.\n".
" - le chiffre 1",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_mal_applique'] != '') {
if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeDouteuxSyntaxe($noms) {
$info = array('titre' => 'synonyme_douteux -> syntaxe',
'description' => "Le champ synonyme_douteux contient soit :\n".
" - une valeur vide.\n".
" - le chiffre 1",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_douteux'] != '') {
if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeProparteExistence($noms) {
$info = array('titre' => 'synonyme_proparte -> existence',
'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
"doit correspondre à une valeur du champ num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_proparte'] != '') {
$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
$num_nom_en_erreur = array();
foreach ($num_nom_a_verifier as $num_nom) {
if (!isset($noms[$num_nom])) {
$num_nom_en_erreur[] = $num_nom;
}
}
if (count($nbre_en_erreur) > 0) {
$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeProparteSyntaxe($noms) {
$info = array('titre' => 'synonyme_proparte -> syntaxe',
'description' => "Le champ synonyme_proparte contient soit :\n".
" - une valeur vide.\n".
" - un nombre.\n".
" - une suite de nombre séparés par des virgules.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_proparte'] != '') {
if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBasionymeExistence($noms) {
$info = array('titre' => 'basionyme -> existence',
'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['basionyme'] != '') {
if (!isset($noms[$nom['basionyme']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBasionymeSyntaxe($noms) {
$info = array('titre' => 'basionyme -> syntaxe',
'description' => "Le champ basionyme contient :\n".
" - un nombre ou une valeur vide.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['basionyme'] != '') {
if (!$this->verifierNombre($nom['basionyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHomonymieExistence($noms, $noms_homonymie) {
$info = array('titre' => 'homonyme -> existence',
'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
"dans le champ nom_complet.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
if ($noms_homonymie[$nom['nom_complet']] <= 1) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHomonymieSyntaxe($noms) {
$info = array('titre' => 'homonyme -> syntaxe',
'description' => "Le champ homonyme contient :\n".
" - le chiffre 1 ou une valeur vide.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['homonyme'] != '') {
if (!$this->verifierBooleen($nom['homonyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBiblioOrigineSyntaxe($noms) {
$info = array('titre' => 'biblio_origine -> syntaxe',
'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
"précis qui sont dans l'ordre de gauche à droite :\n".
" - Éventuellement le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
"l'ouvrage global dans lequel la publication est parue).\n".
" - point-virgule « ; » (si l'info précédent a été renseignée)\n".
" - Abréviation ou nom de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
"Cette information ne doit pas contenir de caractère virgule « , ».\n".
" - virgule « , »\n".
" - Les informations permettant d'identifier plus précisément le document contenant le nom... ".
"Par exemple, l'éditeur, le tome, le numéro d'édition, le volume... séparées par des virgules ou d'autres ".
"caractères sauf deux points « : ».\n".
" - deux points « : »\n".
" - la page contenant la publication du nom ou un ensemble de page (première et dernière page de ".
"l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
"dans le document la position du nom. Le tiret « - » doit toujours servir à séparer un ensemble.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['biblio_origine'] != '') {
if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
$biblio_traite = $this->repererEspace($nom['biblio_origine']);
$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerAnneeSyntaxe($noms) {
$info = array('titre' => 'annee -> syntaxe',
'description' => "Le champ annee doit :\n".
" - contenir un nombre de 4 chiffre\n".
" - être supérieur ou égal à 1753 ",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['annee'] != '') {
if (!$this->verifierAnnee($nom['annee'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'annee erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerAuteurSyntaxe($noms) {
$info = array('titre' => 'auteur -> syntaxe',
'description' => "Le champ auteur doit :\n".
" - contenir l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés à l'origine la combinaison latine courante.\n".
" - ou débuter par le mot « sensu » et contient l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés un nom dont la description ne correspond pas à celle de l'auteur ou des auteurs d'origine.\n".
" - se composer de caractères alphabétiques (A-Z, a-z), incluant les signes diacritiques, le symbole point (.), les paires de parenthèses ( () ), les apostrophes, l'esperluette (&) et l'espace ( ).\n".
" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['auteur'] != '') {
if (!$this->verifierAuteur($nom['auteur'])) {
$intitule_traite = $this->repererEspace($nom['auteur']);
$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'auteur erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCommercialSyntaxe($noms) {
$info = array('titre' => 'nom_commercial -> syntaxe',
'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_commercial'] != '') {
if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
$epithete_traite = $this->repererEspace($nom['nom_commercial']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCommercialPresenceCultivar($noms) {
$info = array('titre' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
'description' => "Si le champ nom_commercial contier un nom commercial alors le champ cultivar OU ".
"cultivar_groupe ne doit pas être vide.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_commercial'] != '' && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet']);
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerCultivarSyntaxe($noms) {
$info = array('titre' => 'cultivar -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir :\n".
" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature des Plantes ".
"Cultivées (CINPC) qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
"signes diacritiques et marques de ponctuations.\n".
" - un nom en alphabet latin ce qui implique une translittération des noms d'alphabet cyrillique, ".
"arabe, chinois...\n".
" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour les autres mots ".
"importants mais pas pour les mots mineurs.\n".
"Ne doit pas contenir :\n".
" - cv., convar. ou de guillemets simples (').\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar'] != '') {
if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
$epithete_traite = $this->repererEspace($nom['cultivar']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerCultivarRang($noms) {
$info = array('titre' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGroupeCultivarSyntaxe($noms) {
$info = array('titre' => 'cultivar_groupe -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
"du code des plantes cultivées qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
"signes diacritiques et marques de ponctuations.\n".
"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
"Il peut contir à la fin l'abréviation «gx» pour distinguer les groupes des grex.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar_groupe'] != '') {
if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGroupeCultivarRang($noms) {
$info = array('titre' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar_groupe'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpEspaces($noms) {
$info = array('titre' => 'epithete_infra_sp -> espaces en trop',
'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpSyntaxe($noms) {
$info = array('titre' => 'epithete_infra_sp -> syntaxe',
'description' => "Le champ epithete_infra_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
" Il commence par une lettre minuscule (avec ou sans tréma).\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
$mots = explode(' ', $nom['epithete_infra_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpRang($noms) {
$info = array('titre' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteEspaces($noms) {
$info = array('titre' => 'type_epithete -> espaces en trop',
'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/\s+/', $nom['type_epithete'])) {
$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteSyntaxe($noms) {
$info = array('titre' => 'type_epithete -> syntaxe',
'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules sans ".
" accents et de tirets (-). Il commence par une lettre minuscule sans accent.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteHybridite($noms) {
$info = array('titre' => 'type_epithete -> hybridité',
'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
" - «n-» \n".
" - «notho-» \n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNombreDeChamps($colonnes) {
$info = array('titre' => 'Structure -> nombre de champs : %s',
'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
'resultat' => false);
$nbre_colonnes = count($colonnes);
$info['titre'] = sprintf($info['titre'], $nbre_colonnes);
if ($nbre_colonnes >= 35) {
$info['resultat'] = true;
}
return $info;
}
private function testerNomDesChamps($colonnes) {
$info = array('titre' => 'Structure -> noms des champs',
'description' => 'Les champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs']);
$champs_presents = array();
foreach ($colonnes as $colonne) {
$champs_presents[$colonne['Field']] = $colonne;
}
$ok = true;
$champs_manquant = array();
foreach ($champs_attendus as $champ_attendu) {
if (!isset($champs_presents[$champ_attendu])) {
$champs_manquant[] = $champ_attendu;
$ok = false;
}
}
$info['resultat'] = $ok;
if (!$ok) {
$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
}
return $info;
}
private function testerTypeDesChamps($colonnes) {
$info = array('titre' => 'Structure -> types des champs',
'description' => 'Les types des champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs_type']);
$champs_presents = array();
foreach ($colonnes as $colonne) {
$champs_presents[$colonne['Field']] = $colonne['Type'];
}
// Recercherche des erreurs
$champs_erreur = array();
foreach ($champs_attendus as $champ_attendu) {
list($champ_attendu_nom, $champ_attendu_type) = explode('=', trim($champ_attendu));
 
if (isset($champs_presents[$champ_attendu_nom])) {
$champs_present_type = $champs_presents[$champ_attendu_nom];
if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTailleDesChamps($colonnes, $analyses) {
$info = array('titre' => 'Structure -> champs tronqués',
'description' => "Vérifie que les données de type texte insérées dans la table n'ont pas été tronquées lors de leur insertion.",
'resultat' => false);
$tailles_champs_maxi = array();
foreach ($colonnes as $colonne) {
if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
$tailles_champs_maxi[$colonne['Field']] = $match[1];
}
}
$tailles_trouvees = array();
foreach ($analyses as $analyse) {
if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
$tailles_trouvees[$match[1]] = $analyse['Max_length'];
}
}
$champs_erreur = array();
$champs_attendus = explode(',', $this->manuel['champs']);
foreach ($champs_attendus as $champ_attendu) {
if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
$champs_erreur[] = $champ_attendu;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumNomClePrimaire($colonnes) {
$info = array('titre' => 'Structure -> num_nom est clé primaire',
'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
'resultat' => false);
foreach ($colonnes as $colonne) {
if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
$info['resultat'] = true;
}
}
return $info;
}
private function testerNumNomSuperieurAZero($noms) {
$info = array('titre' => 'num_nom -> supérieur à 0',
'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumNomRetenuSuperieurAZero($noms) {
$info = array('titre' => 'num_nom_retenu -> supérieur à 0',
'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumTaxSupEgalZeroUnique($noms) {
$info = array('titre' => 'num_tax_sup -> égal à 0 unique',
'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if (preg_match('/^0$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 1) {
$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTaxSupPourTaxon($noms) {
$info = array('titre' => 'Classification -> uniquement pour les taxons',
'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom'] && preg_match('/^[0-9]+$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements qui n'est pas un taxon et qui possède une valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerExitenceTaxonSuperieur($noms) {
$info = array('titre' => 'Classification -> existence du taxon supérieur',
'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if ($nom['num_tax_sup'] != 0 && !isset($noms[$nom['num_tax_sup']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerClassificationRang($noms) {
$info = array('titre' => 'Classification -> taxon supérieur avec rang inférieur',
'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if (isset($noms[$nom['num_tax_sup']])) {
$nom_sup = $noms[$nom['num_tax_sup']];
if ($nom_sup['rang'] > $nom['rang']) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerClassification($noms) {
$info = array('titre' => 'Classification -> racine liée à chaque noeud',
'description' => "Pour chaque enregistrement, la classification doit pouvoir être remonté jusqu'à un même nom unique possédant une valeur num_tax_sup de 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
$classif_ok = $this->remonterClassif($noms, $nom);
if ($classif_ok === false) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function remonterClassif(&$noms, $nom) {
if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
return true;
} else if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
return false;
} else {
return $this->remonterClassif($noms, $noms[$nom['num_tax_sup']]);
}
}
private function testerRang($noms) {
$info = array('titre' => 'rang',
'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
'resultat' => false);
$rangs = array_flip(explode(',', $this->manuel['rangs']));
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if (!isset($rangs[$nom['rang']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletSupraGenerique($noms) {
$info = array('titre' => 'nom_complet -> noms supra-génériques',
'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ nom_supra_generique. ".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletGenre($noms) {
$info = array('titre' => 'nom_complet -> noms de genres',
'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ genre. ".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] == $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletInfraGenre($noms) {
$info = array('titre' => 'nom_complet -> noms infra-génériques',
'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_complet doit correspondre à une des formules suivantes : \n".
" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = '';
if ($nom['type_epithete'] == 'agg.') {
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
$nom_complet_ideal .= ' '.$nom['type_epithete'];
} else {
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.$nom['type_epithete'];
$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
}
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletEspece($noms) {
$info = array('titre' => "nom_complet -> noms d'espèce",
'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] == $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletInfraSpecifique($noms) {
$info = array('titre' => 'nom_complet -> noms infra-spécifiques',
'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] > $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_complet_ideal .= ' '.strtolower($nom['type_epithete']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueEspaces($noms) {
$info = array('titre' => 'nom_supra_generique -> espaces en trop',
'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueSyntaxe($noms) {
$info = array('titre' => 'nom_supra_generique -> syntaxe',
'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueRang($noms) {
$info = array('titre' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if ($nom['rang'] >= $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreEspaces($noms) {
$info = array('titre' => 'genre -> espaces en trop',
'description' => "Le champ genre ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreSyntaxe($noms) {
$info = array('titre' => 'genre -> syntaxe',
'description' => "Le champ genre peut contenir :\n".
" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
" Il commence par une lettre majuscule (avec ou sans tréma).".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
$mots = explode(' ', $nom['genre']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreRang($noms) {
$info = array('titre' => "genre -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueSyntaxe($noms) {
$info = array('titre' => 'epithete_infra_generique -> syntaxe',
'description' => "Le champ epithete_infra_generique est composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
"La première lettre (avec ou sans tréma) doit être en majuscule.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueRang($noms) {
$info = array('titre' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris \n".
"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueEspaces($noms) {
$info = array('titre' => 'epithete_infra_generique -> espaces en trop',
'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou aprés sa valeur.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpEspaces($noms) {
$info = array('titre' => 'epithete_sp -> espaces en trop',
'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpSyntaxe($noms) {
$info = array('titre' => 'epithete_sp -> syntaxe',
'description' => "Le champ epithete_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
" Il commence par une lettre minuscule [a-zëï].\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) ou d'un seul caractère majuscule (A-Z) \n".
" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
$mots = explode(' ', $nom['epithete_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpRang($noms) {
$info = array('titre' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_sp n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
//+--------------------------------------------------------------------------------------------------------------+//
// MÉTHODES COMMUNES aux TESTS
private function verifierPresence($valeur) {
$codes = $this->manuel['codes_presence'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutOrigine($valeur) {
$codes = $this->manuel['codes_statuts_origine'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutIntroduction($valeur) {
$codes = $this->manuel['codes_statuts_introduction'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutCulture($valeur) {
$codes = $this->manuel['codes_statuts_culture'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatuts($valeur, $codes) {
$ok = true;
if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierBooleen($valeur) {
$ok = true;
if (!preg_match('/^1$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombre($valeur) {
$ok = true;
if (!preg_match('/^[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombreSuite($valeur) {
$ok = true;
if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierTypeEpithete($type) {
$ok = false;
$rejetes = $this->manuel['type_epithete_rejetes'];
if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
$ok = false;
} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
$ok = true;
}
return $ok;
}
private function verifierBiblioOrigine($intitule) {
$ok = true;
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
$ok = false;
} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
$ok = false;// Contient une mauvaise suite de caractères
}
return $ok;
}
private function verifierAnnee($annee) {
$ok = true;
if (!preg_match('/^[0-9]{4}$/', $annee)) {
$ok = false;
} else if ($annee < 1753) {
$ok = false;
}
return $ok;
}
private function verifierAuteur($intitule) {
$ok = true;
$acceptes = $this->manuel['auteur_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
$mots = explode(' ', $intitule);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
continue;// Mot de l'intitulé auteur
} else {
$ok = false;
}
}
}
}
return $ok;
}
private function verifierNomCommercial($epithete) {
$ok = false;
if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteCultivar($epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteGroupeCultivar($epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_gp_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
continue;// Mot accepté
} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteSp($epithete) {
$ok = false;
if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
$ok = true;
} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteGenre($epithete) {
$ok = false;
if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function formaterStyleNomGenre($genre) {
$genre_fmt = '';
if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
} else {
$genre_fmt = ucfirst(strtolower($genre));
}
return $genre_fmt;
}
private function repererEspace($nom_complet) {
$nom_complet = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_complet);
return $nom_complet;
}
private function construireSuffixeNomPltCultivee($nom) {
$suffixe = array();
$suffixe[] = $this->construireNomCultivarGroupe($nom);
$suffixe[] = $this->construireNomCommercial($nom);
$suffixe[] = $this->construireNomCultivar($nom);
$suffixe = array_filter($suffixe);
return implode(' ', $suffixe);
}
private function construireNomCultivarGroupe($nom) {
$nom_groupe_cultivar = '';
if ($nom['cultivar_groupe'] != '') {
if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].')';
} else {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].' Gp)';
}
}
return $nom_groupe_cultivar;
}
private function construireNomCommercial($nom) {
$nom_commercial = '';
if ($nom['nom_commercial'] != '') {
$nom_commercial = strtoupper($nom['nom_commercial']);
}
return $nom_commercial;
}
private function construireNomCultivar($nom) {
$nom_cultivar = '';
if ($nom['cultivar'] != '') {
$nom_cultivar = "'".$nom['cultivar']."'";
}
return $nom_cultivar;
}
private function classerNomsParNumNom($noms) {
$noms_classes = array();
foreach ($noms as $nom) {
$noms_classes[$nom['num_nom']] = $nom;
}
return $noms_classes;
}
private function classerNomsParNomComplet($noms) {
$noms_classes = array();
foreach ($noms as $nom) {
if (!isset($noms_classes[$nom['nom_complet']])) {
$noms_classes[$nom['nom_complet']] = 1;
} else {
$noms_classes[$nom['nom_complet']]++;
}
}
return $noms_classes;
}
}
?>
/trunk/scripts/scripts.conf.php
New file
0,0 → 1,31
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Script configuration
*
* Description : permet de configurer le lancement des scripts. Le contenu de ce fichier ne devrait pas nécessité de
* modification dans la plupart des installations...
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
// Gestion de la mémoire maximum allouée aux scripts
ini_set('memory_limit', 1073741824);//128Mo = 134217728 ; 256Mo = 268435456 ; 512Mo = 536870912 ; 1Go = 1073741824
// Gestion des erreurs
error_reporting(E_ALL);
 
// Gestion des chemins
define('DS', DIRECTORY_SEPARATOR);
define('ES_CHEMIN_APPLI', dirname(__FILE__).DS);
define('ES_CHEMIN_CONFIG', ES_CHEMIN_APPLI.'configurations'.DS);
define('ES_CHEMIN_MODULE', ES_CHEMIN_APPLI.'modules'.DS);
define('ES_CHEMIN_PEAR', '/opt/lampp/lib/php/');
 
// Chargement de base pour l'autoload
$GLOBALS['chemins_autoload'] = array(dirname(realpath(__FILE__)).DS.'bibliotheque'.DS);
?>
/trunk/scripts/modules/tests/Tests.php
New file
0,0 → 1,2248
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Tests de référentiels de nomenclature et taxonomie
*
* Description : classe permettant de tester les référentiels selon le manuel technique
* Utilisation : php script.php tests -p bdnff -a tout
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2010
* @link http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
class Tests extends ScriptCommande {
private $projet = null;
private $manuel = null;
public function executer() {
// Récupération de paramêtres
$this->projet = $this->getParam('p');
$this->manuel = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'referentiel_v2.1.ini');
// Lancement du test demandé
$cmd = $this->getParam('a');
switch ($cmd) {
case 'tout' :
$this->lancerTests();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
public function lancerTests() {
$donnees = array();
$donnees['tests'] = array();
/*
// Récupération des données à tester
$colonnes = $this->tableStructureDao->getColonnes($this->projet);
$analyses = $this->tableStructureDao->getAnalyse($this->projet);
$noms = $this->referentielDao->getTout($this->projet);
$noms = $this->classerNomsParNumNom($noms);
$noms_homonymie = $this->classerNomsParNomComplet($noms);
// Lancement des tests unitaires
$donnees['tests'][] = $this->testerNombreDeChamps($colonnes);
$donnees['tests'][] = $this->testerNomDesChamps($colonnes);
$donnees['tests'][] = $this->testerTypeDesChamps($colonnes);
$donnees['tests'][] = $this->testerTailleDesChamps($colonnes, $analyses);
$donnees['tests'][] = $this->testerNumNomClePrimaire($colonnes);
$donnees['tests'][] = $this->testerNumNomSuperieurAZero($noms);
$donnees['tests'][] = $this->testerNumNomRetenuSuperieurAZero($noms);
$donnees['tests'][] = $this->testerNumTaxSupEgalZeroUnique($noms);
$donnees['tests'][] = $this->testerTaxSupPourTaxon($noms);
$donnees['tests'][] = $this->testerExitenceTaxonSuperieur($noms);
$donnees['tests'][] = $this->testerClassificationRang($noms);
$donnees['tests'][] = $this->testerClassification($noms);
$donnees['tests'][] = $this->testerRang($noms);
$donnees['tests'][] = $this->testerNomCompletSupraGenerique($noms);
$donnees['tests'][] = $this->testerNomCompletGenre($noms);
$donnees['tests'][] = $this->testerNomCompletInfraGenre($noms);
$donnees['tests'][] = $this->testerNomCompletEspece($noms);
$donnees['tests'][] = $this->testerNomCompletInfraSpecifique($noms);
 
$donnees['tests'][] = $this->testerNomSupraGeneriqueEspaces($noms);
$donnees['tests'][] = $this->testerNomSupraGeneriqueSyntaxe($noms);
$donnees['tests'][] = $this->testerNomSupraGeneriqueRang($noms);
$donnees['tests'][] = $this->testerGenreEspaces($noms);
$donnees['tests'][] = $this->testerGenreSyntaxe($noms);
$donnees['tests'][] = $this->testerGenreRang($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueRang($noms);
$donnees['tests'][] = $this->testerEpitheteSpEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteSpSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteSpRang($noms);
$donnees['tests'][] = $this->testerTypeEpitheteEspaces($noms);
$donnees['tests'][] = $this->testerTypeEpitheteSyntaxe($noms);
$donnees['tests'][] = $this->testerTypeEpitheteHybridite($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpEspaces($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpSyntaxe($noms);
$donnees['tests'][] = $this->testerEpitheteInfraSpRang($noms);
$donnees['tests'][] = $this->testerGroupeCultivarSyntaxe($noms);
$donnees['tests'][] = $this->testerGroupeCultivarRang($noms);
$donnees['tests'][] = $this->testerCultivarSyntaxe($noms);
$donnees['tests'][] = $this->testerCultivarRang($noms);
$donnees['tests'][] = $this->testerNomCommercialSyntaxe($noms);
$donnees['tests'][] = $this->testerNomCommercialPresenceCultivar($noms);
$donnees['tests'][] = $this->testerAuteurSyntaxe($noms);
$donnees['tests'][] = $this->testerAnneeSyntaxe($noms);
$donnees['tests'][] = $this->testerBiblioOrigineSyntaxe($noms);
$donnees['tests'][] = $this->testerHomonymieSyntaxe($noms);
$donnees['tests'][] = $this->testerHomonymieExistence($noms, $noms_homonymie);
$donnees['tests'][] = $this->testerBasionymeSyntaxe($noms);
$donnees['tests'][] = $this->testerBasionymeExistence($noms);
$donnees['tests'][] = $this->testerSynonymeProparteSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeProparteExistence($noms);
$donnees['tests'][] = $this->testerSynonymeDouteuxSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeMalAppliqueSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeOrthographiqueSyntaxe($noms);
$donnees['tests'][] = $this->testerSynonymeOrthographiqueExistence($noms);
$donnees['tests'][] = $this->testerHybrideParent01Syntaxe($noms);
$donnees['tests'][] = $this->testerHybrideParent01Existence($noms);
$donnees['tests'][] = $this->testerHybrideParent02Syntaxe($noms);
$donnees['tests'][] = $this->testerHybrideParent02Existence($noms);
$donnees['tests'][] = $this->testerPresenceSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutOrigineSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutIntroductionSyntaxe($noms);
$donnees['tests'][] = $this->testerStatutCultureSyntaxe($noms);
*/
//Debug::printr($this->manuel);
$this->setSortie(self::RENDU_CORPS, $this->getVue('test', $donnees));
}
//+--------------------------------------------------------------------------------------------------------------+//
// TESTS
private function testerStatutCultureSyntaxe($noms) {
$info = array('titre' => 'statut_culture -> syntaxe',
'description' => "Le champ statut_culture peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_culture'] != '') {
if (!$this->verifierStatutCulture($nom['statut_culture'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerStatutIntroductionSyntaxe($noms) {
$info = array('titre' => 'statut_introduction -> syntaxe',
'description' => "Le champ statut_introduction peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_introduction'] != '') {
if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerStatutOrigineSyntaxe($noms) {
$info = array('titre' => 'statut_origine -> syntaxe',
'description' => "Le champ statut_origine peut contenir :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['statut_origine'] != '') {
if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerPresenceSyntaxe($noms) {
$info = array('titre' => 'presence -> syntaxe',
'description' => "Le champ presence contient soit :\n".
" - le symbole tiret «-» une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - Cette première lettre peut être suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
"un code de présence spécifique au référentiel.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['presence'] != '') {
if (!$this->verifierPresence($nom['presence'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'presence erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent02Existence($noms) {
$info = array('titre' => 'hybride_parent_02 -> existence',
'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_02'] != '') {
if (!isset($noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_02']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent02Syntaxe($noms) {
$info = array('titre' => 'hybride_parent_02 -> syntaxe',
'description' => "Le champ hybride_parent_02 contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_02'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_02'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_02']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent01Existence($noms) {
$info = array('titre' => 'hybride_parent_01 -> existence',
'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
if (!isset($noms[$nom['hybride_parent_01']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_01']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHybrideParent01Syntaxe($noms) {
$info = array('titre' => 'hybride_parent_01 -> syntaxe',
'description' => "Le champ hybride_parent_01 contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['hybride_parent_01'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_01'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['hybride_parent_01']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeOrthographiqueExistence($noms) {
$info = array('titre' => 'synonyme_orthographique -> existence',
'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!isset($noms[$nom['synonyme_orthographique']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeOrthographiqueSyntaxe($noms) {
$info = array('titre' => 'synonyme_orthographique -> syntaxe',
'description' => "Le champ synonyme_orthographique contient soit :\n".
" - une valeur vide.\n".
" - un nombre",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeMalAppliqueSyntaxe($noms) {
$info = array('titre' => 'synonyme_mal_applique -> syntaxe',
'description' => "Le champ synonyme_mal_applique contient soit :\n".
" - une valeur vide.\n".
" - le chiffre 1",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_mal_applique'] != '') {
if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeDouteuxSyntaxe($noms) {
$info = array('titre' => 'synonyme_douteux -> syntaxe',
'description' => "Le champ synonyme_douteux contient soit :\n".
" - une valeur vide.\n".
" - le chiffre 1",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_douteux'] != '') {
if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeProparteExistence($noms) {
$info = array('titre' => 'synonyme_proparte -> existence',
'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
"doit correspondre à une valeur du champ num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_proparte'] != '') {
$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
$num_nom_en_erreur = array();
foreach ($num_nom_a_verifier as $num_nom) {
if (!isset($noms[$num_nom])) {
$num_nom_en_erreur[] = $num_nom;
}
}
if (count($nbre_en_erreur) > 0) {
$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerSynonymeProparteSyntaxe($noms) {
$info = array('titre' => 'synonyme_proparte -> syntaxe',
'description' => "Le champ synonyme_proparte contient soit :\n".
" - une valeur vide.\n".
" - un nombre.\n".
" - une suite de nombre séparés par des virgules.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['synonyme_proparte'] != '') {
if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBasionymeExistence($noms) {
$info = array('titre' => 'basionyme -> existence',
'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['basionyme'] != '') {
if (!isset($noms[$nom['basionyme']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBasionymeSyntaxe($noms) {
$info = array('titre' => 'basionyme -> syntaxe',
'description' => "Le champ basionyme contient :\n".
" - un nombre ou une valeur vide.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['basionyme'] != '') {
if (!$this->verifierNombre($nom['basionyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHomonymieExistence($noms, $noms_homonymie) {
$info = array('titre' => 'homonyme -> existence',
'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
"dans le champ nom_complet.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
if ($noms_homonymie[$nom['nom_complet']] <= 1) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerHomonymieSyntaxe($noms) {
$info = array('titre' => 'homonyme -> syntaxe',
'description' => "Le champ homonyme contient :\n".
" - le chiffre 1 ou une valeur vide.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['homonyme'] != '') {
if (!$this->verifierBooleen($nom['homonyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerBiblioOrigineSyntaxe($noms) {
$info = array('titre' => 'biblio_origine -> syntaxe',
'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
"précis qui sont dans l'ordre de gauche à droite :\n".
" - Éventuellement le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
"l'ouvrage global dans lequel la publication est parue).\n".
" - point-virgule « ; » (si l'info précédent a été renseignée)\n".
" - Abréviation ou nom de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
"Cette information ne doit pas contenir de caractère virgule « , ».\n".
" - virgule « , »\n".
" - Les informations permettant d'identifier plus précisément le document contenant le nom... ".
"Par exemple, l'éditeur, le tome, le numéro d'édition, le volume... séparées par des virgules ou d'autres ".
"caractères sauf deux points « : ».\n".
" - deux points « : »\n".
" - la page contenant la publication du nom ou un ensemble de page (première et dernière page de ".
"l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
"dans le document la position du nom. Le tiret « - » doit toujours servir à séparer un ensemble.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['biblio_origine'] != '') {
if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
$biblio_traite = $this->repererEspace($nom['biblio_origine']);
$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerAnneeSyntaxe($noms) {
$info = array('titre' => 'annee -> syntaxe',
'description' => "Le champ annee doit :\n".
" - contenir un nombre de 4 chiffre\n".
" - être supérieur ou égal à 1753 ",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['annee'] != '') {
if (!$this->verifierAnnee($nom['annee'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'annee erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerAuteurSyntaxe($noms) {
$info = array('titre' => 'auteur -> syntaxe',
'description' => "Le champ auteur doit :\n".
" - contenir l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés à l'origine la combinaison latine courante.\n".
" - ou débuter par le mot « sensu » et contient l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés un nom dont la description ne correspond pas à celle de l'auteur ou des auteurs d'origine.\n".
" - se composer de caractères alphabétiques (A-Z, a-z), incluant les signes diacritiques, le symbole point (.), les paires de parenthèses ( () ), les apostrophes, l'esperluette (&) et l'espace ( ).\n".
" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['auteur'] != '') {
if (!$this->verifierAuteur($nom['auteur'])) {
$intitule_traite = $this->repererEspace($nom['auteur']);
$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'auteur erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCommercialSyntaxe($noms) {
$info = array('titre' => 'nom_commercial -> syntaxe',
'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_commercial'] != '') {
if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
$epithete_traite = $this->repererEspace($nom['nom_commercial']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCommercialPresenceCultivar($noms) {
$info = array('titre' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
'description' => "Si le champ nom_commercial contier un nom commercial alors le champ cultivar OU ".
"cultivar_groupe ne doit pas être vide.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_commercial'] != '' && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet']);
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerCultivarSyntaxe($noms) {
$info = array('titre' => 'cultivar -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir :\n".
" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature des Plantes ".
"Cultivées (CINPC) qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
"signes diacritiques et marques de ponctuations.\n".
" - un nom en alphabet latin ce qui implique une translittération des noms d'alphabet cyrillique, ".
"arabe, chinois...\n".
" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour les autres mots ".
"importants mais pas pour les mots mineurs.\n".
"Ne doit pas contenir :\n".
" - cv., convar. ou de guillemets simples (').\n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar'] != '') {
if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
$epithete_traite = $this->repererEspace($nom['cultivar']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerCultivarRang($noms) {
$info = array('titre' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGroupeCultivarSyntaxe($noms) {
$info = array('titre' => 'cultivar_groupe -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
"du code des plantes cultivées qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
"signes diacritiques et marques de ponctuations.\n".
"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
"Il peut contir à la fin l'abréviation «gx» pour distinguer les groupes des grex.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar_groupe'] != '') {
if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGroupeCultivarRang($noms) {
$info = array('titre' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['cultivar_groupe'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpEspaces($noms) {
$info = array('titre' => 'epithete_infra_sp -> espaces en trop',
'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpSyntaxe($noms) {
$info = array('titre' => 'epithete_infra_sp -> syntaxe',
'description' => "Le champ epithete_infra_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
" Il commence par une lettre minuscule (avec ou sans tréma).\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
$mots = explode(' ', $nom['epithete_infra_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraSpRang($noms) {
$info = array('titre' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteEspaces($noms) {
$info = array('titre' => 'type_epithete -> espaces en trop',
'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/\s+/', $nom['type_epithete'])) {
$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteSyntaxe($noms) {
$info = array('titre' => 'type_epithete -> syntaxe',
'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules sans ".
" accents et de tirets (-). Il commence par une lettre minuscule sans accent.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTypeEpitheteHybridite($noms) {
$info = array('titre' => 'type_epithete -> hybridité',
'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
" - «n-» \n".
" - «notho-» \n",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNombreDeChamps($colonnes) {
$info = array('titre' => 'Structure -> nombre de champs : %s',
'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
'resultat' => false);
$nbre_colonnes = count($colonnes);
$info['titre'] = sprintf($info['titre'], $nbre_colonnes);
if ($nbre_colonnes >= 35) {
$info['resultat'] = true;
}
return $info;
}
private function testerNomDesChamps($colonnes) {
$info = array('titre' => 'Structure -> noms des champs',
'description' => 'Les champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs']);
$champs_presents = array();
foreach ($colonnes as $colonne) {
$champs_presents[$colonne['Field']] = $colonne;
}
$ok = true;
$champs_manquant = array();
foreach ($champs_attendus as $champ_attendu) {
if (!isset($champs_presents[$champ_attendu])) {
$champs_manquant[] = $champ_attendu;
$ok = false;
}
}
$info['resultat'] = $ok;
if (!$ok) {
$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
}
return $info;
}
private function testerTypeDesChamps($colonnes) {
$info = array('titre' => 'Structure -> types des champs',
'description' => 'Les types des champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs_type']);
$champs_presents = array();
foreach ($colonnes as $colonne) {
$champs_presents[$colonne['Field']] = $colonne['Type'];
}
// Recercherche des erreurs
$champs_erreur = array();
foreach ($champs_attendus as $champ_attendu) {
list($champ_attendu_nom, $champ_attendu_type) = explode('=', trim($champ_attendu));
 
if (isset($champs_presents[$champ_attendu_nom])) {
$champs_present_type = $champs_presents[$champ_attendu_nom];
if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTailleDesChamps($colonnes, $analyses) {
$info = array('titre' => 'Structure -> champs tronqués',
'description' => "Vérifie que les données de type texte insérées dans la table n'ont pas été tronquées lors de leur insertion.",
'resultat' => false);
$tailles_champs_maxi = array();
foreach ($colonnes as $colonne) {
if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
$tailles_champs_maxi[$colonne['Field']] = $match[1];
}
}
$tailles_trouvees = array();
foreach ($analyses as $analyse) {
if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
$tailles_trouvees[$match[1]] = $analyse['Max_length'];
}
}
$champs_erreur = array();
$champs_attendus = explode(',', $this->manuel['champs']);
foreach ($champs_attendus as $champ_attendu) {
if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
$champs_erreur[] = $champ_attendu;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumNomClePrimaire($colonnes) {
$info = array('titre' => 'Structure -> num_nom est clé primaire',
'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
'resultat' => false);
foreach ($colonnes as $colonne) {
if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
$info['resultat'] = true;
}
}
return $info;
}
private function testerNumNomSuperieurAZero($noms) {
$info = array('titre' => 'num_nom -> supérieur à 0',
'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumNomRetenuSuperieurAZero($noms) {
$info = array('titre' => 'num_nom_retenu -> supérieur à 0',
'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNumTaxSupEgalZeroUnique($noms) {
$info = array('titre' => 'num_tax_sup -> égal à 0 unique',
'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if (preg_match('/^0$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 1) {
$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerTaxSupPourTaxon($noms) {
$info = array('titre' => 'Classification -> uniquement pour les taxons',
'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom'] && preg_match('/^[0-9]+$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements qui n'est pas un taxon et qui possède une valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerExitenceTaxonSuperieur($noms) {
$info = array('titre' => 'Classification -> existence du taxon supérieur',
'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if ($nom['num_tax_sup'] != 0 && !isset($noms[$nom['num_tax_sup']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerClassificationRang($noms) {
$info = array('titre' => 'Classification -> taxon supérieur avec rang inférieur',
'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if (isset($noms[$nom['num_tax_sup']])) {
$nom_sup = $noms[$nom['num_tax_sup']];
if ($nom_sup['rang'] > $nom['rang']) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerClassification($noms) {
$info = array('titre' => 'Classification -> racine liée à chaque noeud',
'description' => "Pour chaque enregistrement, la classification doit pouvoir être remonté jusqu'à un même nom unique possédant une valeur num_tax_sup de 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
$classif_ok = $this->remonterClassif($noms, $nom);
if ($classif_ok === false) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function remonterClassif(&$noms, $nom) {
if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
return true;
} else if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
return false;
} else {
return $this->remonterClassif($noms, $noms[$nom['num_tax_sup']]);
}
}
private function testerRang($noms) {
$info = array('titre' => 'rang',
'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
'resultat' => false);
$rangs = array_flip(explode(',', $this->manuel['rangs']));
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if (!isset($rangs[$nom['rang']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletSupraGenerique($noms) {
$info = array('titre' => 'nom_complet -> noms supra-génériques',
'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ nom_supra_generique. ".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletGenre($noms) {
$info = array('titre' => 'nom_complet -> noms de genres',
'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ genre. ".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] == $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletInfraGenre($noms) {
$info = array('titre' => 'nom_complet -> noms infra-génériques',
'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_complet doit correspondre à une des formules suivantes : \n".
" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = '';
if ($nom['type_epithete'] == 'agg.') {
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
$nom_complet_ideal .= ' '.$nom['type_epithete'];
} else {
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.$nom['type_epithete'];
$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
}
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletEspece($noms) {
$info = array('titre' => "nom_complet -> noms d'espèce",
'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] == $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomCompletInfraSpecifique($noms) {
$info = array('titre' => 'nom_complet -> noms infra-spécifiques',
'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['rang'] > $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_complet_ideal .= ' '.strtolower($nom['type_epithete']);
$nom_complet_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_complet'] != $nom_complet_ideal) {
$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueEspaces($noms) {
$info = array('titre' => 'nom_supra_generique -> espaces en trop',
'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueSyntaxe($noms) {
$info = array('titre' => 'nom_supra_generique -> syntaxe',
'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerNomSupraGeneriqueRang($noms) {
$info = array('titre' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['nom_supra_generique'] != '') {
if ($nom['rang'] >= $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreEspaces($noms) {
$info = array('titre' => 'genre -> espaces en trop',
'description' => "Le champ genre ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreSyntaxe($noms) {
$info = array('titre' => 'genre -> syntaxe',
'description' => "Le champ genre peut contenir :\n".
" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
" Il commence par une lettre majuscule (avec ou sans tréma).".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
$mots = explode(' ', $nom['genre']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerGenreRang($noms) {
$info = array('titre' => "genre -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['genre'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueSyntaxe($noms) {
$info = array('titre' => 'epithete_infra_generique -> syntaxe',
'description' => "Le champ epithete_infra_generique est composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
"La première lettre (avec ou sans tréma) doit être en majuscule.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueRang($noms) {
$info = array('titre' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris \n".
"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteInfraGeneriqueEspaces($noms) {
$info = array('titre' => 'epithete_infra_generique -> espaces en trop',
'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou aprés sa valeur.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_infra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpEspaces($noms) {
$info = array('titre' => 'epithete_sp -> espaces en trop',
'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpSyntaxe($noms) {
$info = array('titre' => 'epithete_sp -> syntaxe',
'description' => "Le champ epithete_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
" Il commence par une lettre minuscule [a-zëï].\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) ou d'un seul caractère majuscule (A-Z) \n".
" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) séparés entre eux \n".
" par la lettre x entourée de caractères espaces.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
$mots = explode(' ', $nom['epithete_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
private function testerEpitheteSpRang($noms) {
$info = array('titre' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_sp n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_sp']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($noms as $nom) {
if ($nom['epithete_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
return $info;
}
//+--------------------------------------------------------------------------------------------------------------+//
// MÉTHODES COMMUNES aux TESTS
private function verifierPresence($valeur) {
$codes = $this->manuel['codes_presence'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutOrigine($valeur) {
$codes = $this->manuel['codes_statuts_origine'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutIntroduction($valeur) {
$codes = $this->manuel['codes_statuts_introduction'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutCulture($valeur) {
$codes = $this->manuel['codes_statuts_culture'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatuts($valeur, $codes) {
$ok = true;
if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierBooleen($valeur) {
$ok = true;
if (!preg_match('/^1$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombre($valeur) {
$ok = true;
if (!preg_match('/^[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombreSuite($valeur) {
$ok = true;
if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierTypeEpithete($type) {
$ok = false;
$rejetes = $this->manuel['type_epithete_rejetes'];
if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
$ok = false;
} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
$ok = true;
}
return $ok;
}
private function verifierBiblioOrigine($intitule) {
$ok = true;
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
$ok = false;
} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
$ok = false;// Contient une mauvaise suite de caractères
}
return $ok;
}
private function verifierAnnee($annee) {
$ok = true;
if (!preg_match('/^[0-9]{4}$/', $annee)) {
$ok = false;
} else if ($annee < 1753) {
$ok = false;
}
return $ok;
}
private function verifierAuteur($intitule) {
$ok = true;
$acceptes = $this->manuel['auteur_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
$mots = explode(' ', $intitule);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
continue;// Mot de l'intitulé auteur
} else {
$ok = false;
}
}
}
}
return $ok;
}
private function verifierNomCommercial($epithete) {
$ok = false;
if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteCultivar($epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteGroupeCultivar($epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_gp_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
continue;// Mot accepté
} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteSp($epithete) {
$ok = false;
if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
$ok = true;
} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteGenre($epithete) {
$ok = false;
if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function formaterStyleNomGenre($genre) {
$genre_fmt = '';
if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
} else {
$genre_fmt = ucfirst(strtolower($genre));
}
return $genre_fmt;
}
private function repererEspace($nom_complet) {
$nom_complet = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_complet);
return $nom_complet;
}
private function construireSuffixeNomPltCultivee($nom) {
$suffixe = array();
$suffixe[] = $this->construireNomCultivarGroupe($nom);
$suffixe[] = $this->construireNomCommercial($nom);
$suffixe[] = $this->construireNomCultivar($nom);
$suffixe = array_filter($suffixe);
return implode(' ', $suffixe);
}
private function construireNomCultivarGroupe($nom) {
$nom_groupe_cultivar = '';
if ($nom['cultivar_groupe'] != '') {
if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].')';
} else {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].' Gp)';
}
}
return $nom_groupe_cultivar;
}
private function construireNomCommercial($nom) {
$nom_commercial = '';
if ($nom['nom_commercial'] != '') {
$nom_commercial = strtoupper($nom['nom_commercial']);
}
return $nom_commercial;
}
private function construireNomCultivar($nom) {
$nom_cultivar = '';
if ($nom['cultivar'] != '') {
$nom_cultivar = "'".$nom['cultivar']."'";
}
return $nom_cultivar;
}
private function classerNomsParNumNom($noms) {
$noms_classes = array();
foreach ($noms as $nom) {
$noms_classes[$nom['num_nom']] = $nom;
}
return $noms_classes;
}
private function classerNomsParNomComplet($noms) {
$noms_classes = array();
foreach ($noms as $nom) {
if (!isset($noms_classes[$nom['nom_complet']])) {
$noms_classes[$nom['nom_complet']] = 1;
} else {
$noms_classes[$nom['nom_complet']]++;
}
}
return $noms_classes;
}
 
}
?>
/trunk/scripts/modules/tests/configurations/referentiel_v2.1.ini
New file
0,0 → 1,76
; Version du référentiel servant de base aux informations ci-dessous
version = 2.1
; 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=INT,
num_tax_sup=INT,
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=INT,
biblio_origine=VARCHAR,
notes=TEXT,
nom_addendum=VARCHAR,
homonyme=INT,
basionyme=INT,
synonyme_proparte=VARCHAR,
synonyme_douteux=BOOL,
synonyme_mal_applique=BOOL,
synonyme_orthographique=INT,
biblio_statut=TEXT,
hybride_parent_01=INT,
hybride_parent_01_notes=TEXT,
hybride_parent_02=INT,
hybride_parent_02_notes=TEXT,
nom_francais=VARCHAR,
presence=VARCHAR,
statut_origine=VARCHAR,
statut_introduction=VARCHAR,
statut_culture=VARCHAR"
; 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
rang_genre="220"
; Valeur numérique indiquant le rang de l'espèce
rang_sp="290"
 
; TOUTES LES LISTES séparées par | sontinsérées dans la regexp suivante : /^(?:$liste)$/ VOUS DEVEZ SI NÉCESSAIRE
; ANTISLASHER LES CARACTÈRES : . \ + * ? [ ^ ] $ ( ) { } = ! < > : -
; Liste de types d'épithète à rejeter. Séparation : ,. Insenssible à la casse.
type_epithete_rejetes="cv[.]?|convar[.]?"
; Liste de mots de noms de cultivar qui doivent être rejetés. Séparation : |. Inssensible à la casse.
cultivar_mots_rejetes="cv[.]?|convar[.]?"
; Liste de noms de cultivar acceptés faisant exception à la règle de la majuscule pour la 1ère lettre de chaque mot. Séparation : |. Senssible à la casse.
cultivar_acceptes="s-Hertogenbosch|IJsselham"
; Liste de mots de noms de groupe de cultivar qui doivent être rejetés. Séparation : |. Inssensible à la casse.
cultivar_gp_mots_rejetes="gp|grex|group|gruppe|groupe|grupo|gruppen"
; Liste de mots de noms de groupe de cultivar à accepter. Séparation : |. Senssible à la casse.
cultivar_gp_mots_acceptes="gx"
; Liste de noms de groupe de cultivar à accepter. Séparation : |. Senssible à la casse.
cultivar_gp_acceptes=""
;Liste des mots mineurs (conjonctions et prépositions). Séparation : |. Sensible à la casse.
mots_mineurs = "mais|ou|et|donc|or|ni|car|and|but|or|nor|de|à|pour|en|dans|avec|sur|par|sans|of|to|in|for|with|on"
; Liste des intitulés auteur faisant exception aux règles mais acceptés. Séparation : |
auteur_acceptes=""
; Liste des mots composant un intitulés auteur qui sont rejetés. Séparation : |
auteur_mots_rejetes="et|and|[(]?(?:p\.){2}[)]?"
 
; Liste des codes de présence
codes_presence = "PSDECA"
; Liste des statuts d'origine
codes_statuts_origine = "NSDECAX"
; Liste des statuts d'introduction
codes_statuts_introduction = "ISDECAX"
; Liste des statuts de culture
codes_statuts_culture = "CISDECX"
/trunk/scripts/configurations/bdd.defaut.ini
New file
0,0 → 1,12
; Encodage : UTF-8
; Exemple de fichier de configuration de la Base de Données
; Ce fichier de configuration est appelé le premier
; Il est nécessaire de le copier et de le renommer en supprimant de son nom ".defaut"
; Les commentaires commencent par ';', comme dans php.ini
 
; Type d'abstraction de bases de données
bdd_abstraction = "DB"
; Indique les options pour MDB2 et DB
bdd_options = "php:array('debug' => 3)"
; Indique le DSN utilisé pour se connecter à la base de données
bdd_dsn = "mysqli://utilisateur:mot_de_passe@localhost/nom_base_de_données"
/trunk/scripts/configurations/commun.defaut.ini
New file
0,0 → 1,10
; Encodage : UTF-8
; Contient des paramêtres commun à tous les modules
; Ce fichier est appelé aprés bdd.ini et juste avant le fichier ini du projet qui peut donc écrasé les variables présentent ici
; Il est nécessaire de copier puis de renommer en commun.ini ce fichier
; Les commentaires commencent par ';', comme dans php.ini
 
; Indique le chemin ou stocker le fichier de log
log_chemin = "php:'/home/'.$_ENV['USER'].'/importation/log/'"
; Indique si l'on veut avoir un seul fichier de log ecrase a chaque fois (true) ou pas (false)
log_fichier_ecraser = "php-static:true"
/trunk/scripts/script.php
New file
0,0 → 1,87
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* script
*
* Description : initialise le chargement et l'exécution des scripts
* Fichier d'origine jelix-scripts par Jouanneau Laurent
* copyright 2005-2007 Jouanneau laurent
* link http://www.jelix.org
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
// Récupération de la config générale
require dirname(__FILE__).DIRECTORY_SEPARATOR.'scripts.conf.php';
 
// Gestion de l'auto chargement des classes
function __autoload($classe)
{
// Gestion des fichiers pésent dans le path
$fichier = $classe.'.php';
if (file_exists($fichier)) {
require_once $fichier;
}
 
// Gestion des classes PEAR
$fichier = ES_CHEMIN_PEAR;
if (!substr_count($classe, '_') > 0) {
$fichier .= $classe;
} else {
 
$tab_chemin = explode('_', $classe);
foreach ($tab_chemin as $c => $v) {
$fichier .= ($c == 0) ? $v.DS : $v;
}
}
$fichier .= '.php';
if (file_exists($fichier)) {
require_once $fichier;
}
// Gestion des classes principales des modules
$module = strtolower(str_replace(' ', '_', preg_replace('/([a-z])([A-Z])/', '$1 $2',$classe)));
$fichier = ES_CHEMIN_MODULE.$module.DS.$classe.'.class.php';
if (file_exists($fichier)) {
require_once $fichier;
}
// Gestion des bibliothèques des scripts
foreach ($GLOBALS['chemins_autoload'] as $chemin) {
$fichiers = array( $chemin.$classe.'.class.php',
$chemin.$classe.'.php');
foreach ($fichiers as $fichier) {
if (file_exists($fichier)) {
require_once $fichier;
break;
}
}
}
}
 
/**
* récupération du nom de la commande et éventuellement du nom de l'application
*/
if ($_SERVER['argc'] < 2){
die("Erreur: pas de commande. Voir '".$_SERVER['argv'][0]." help'.\n");
}
 
$argv = $_SERVER['argv'];
$script_nom = array_shift($argv); // shift le nom du script
$commande_nom = array_shift($argv); // prend le nom de la commande
 
// Chargement de la commande
$Script = Script::charger($commande_nom);
$parametres = Script::getParametres($argv);
 
// Lancement de la commande
$Script->initialiser($parametres);
$Script->executer();
 
?>
/trunk/scripts/bibliotheque/Script.php
New file
0,0 → 1,71
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Script
*
* Description : Fabrique permettant de charger les scripts
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
 
class Script {
/** Niveau de message de type LOG */
const LOG = 0;
/** Niveau de message de type ERREUR */
const ERREUR = 1;
/** Niveau de message de type AVERTISSEMENT */
const AVERTISSEMENT = 2;
/** Niveau de message de type INFORMATION */
const INFO = 3;
public static function getCode($niveau) {
$txt_niveaux = array('LOG', 'ERREUR','AVERTISSEMENT', 'INFO');
return $txt_niveaux[$niveau];
}
public static function charger($commande_nom) {
$classe_nom = implode('', array_map('ucfirst', explode('_', strtolower($commande_nom))));
$fichier_script = ES_CHEMIN_MODULE.$commande_nom.DS.$classe_nom.'.php';
if (!file_exists($fichier_script)){
trigger_error("Erreur : script '$fichier_script' inconnu!\n", E_USER_ERROR);
}
require_once $fichier_script;
if (!class_exists( $classe_nom)) {
trigger_error("Erreur: impossible de trouver la classe de la commande : $classe_nom\n", E_USER_ERROR);
}
$Script = new $classe_nom($commande_nom);
return $Script;
}
public static function getParametres($argv) {
$parametres = array();
// Récupération des options
while(count($argv)) {
if (isset($argv[1]) && $argv[1]{0} != '-') {
$param = array_shift($argv);
$parametres[$param] = array_shift($argv);
} elseif (!isset($argv[1]) || $argv[1]{0} == '-') {
$parametres[array_shift($argv)] = null;
} else {
trigger_error("Erreur: valeur manquante pour le paramêtre '".$argv[0]."' \n", E_USER_ERROR);
}
}
return $parametres;
}
public static function setAutoloadChemin($chemin) {
if (is_array($chemin)) {
$GLOBALS['chemins_autoload'] = array_unique(array_merge($GLOBALS['chemins_autoload'], $chemin));
} else {
$GLOBALS['chemins_autoload'][] = $chemin;
}
}
}
?>
/trunk/scripts/bibliotheque/ScriptCommande.php
New file
0,0 → 1,575
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* ScriptCommande
*
* Description : classe abstraite des scripts
* Fichier d'origine jelix-scripts par Jouanneau Laurent
* copyright 2005-2007 Jouanneau laurent
* link http://www.jelix.org
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id: ScriptCommande.class.php 1948 2009-09-03 14:12:02Z Jean-Pascal MILCENT $
*/
// +-------------------------------------------------------------------------------------------------------------------+
// TODO : supprimer les classe getStaticIni(), getStaticParam() et getStaticNom(). Utiliser une seule méthode qui gère les deux méthodes d'appel.
/**
* classe representant une commande
*/
abstract class ScriptCommande {
 
public $nom;
public $parametres;
/**
* Paramêtres disponible pour la ligne de commande
* le tableau se construit de la forme suivnate :
* - clé = nom du paramêtre '-foo'
* - value = contient un nouveau tableau composé de cette façaon :
* - booléen: true si le paramêtre est obligatoire
* - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
* - string: description du contenu du paramêtre
* Les paramêtres optionels devraient être déclaré à la fin du tableau.
* Le dernier parametre du tableau peut avoir la valeur '...',
* il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
* @var array
*/
private $_parametres_autorises = array( '-p' => array(true, true, 'Projet, le nom utiliser pour le fichier ini'),
'-a' => array(true, true, 'Action à réaliser'),
'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'),
'-t' => array(false, '', 'Test sur un nombre de ligne...'));
/**
* Contient les valeurs des paramêtres récupérés de la ligne de commande :
* le tableau se construit de la forme suivnate :
* - clé = nom du paramêtre '-foo'
* - valeur = la valeur récupérée sur la ligne de commande
* @var array
*/
private $_parametres;
 
private static $_static_nom;
private static $_static_parametres;
private static $_static_ini;
private static $log = '';
private static $log_fichier;
private static $log_resource;
private static $log_fichier_ecraser = false;
 
public $syntaxhelp = '';
public $help = 'Aucune aide pour cette commande';
 
function __construct($commande_nom) {
$this->setNom($commande_nom);
}
public function __destruct() {
if (isset(self::$log_resource)) {
if (fclose(self::$log_resource)) {
self::$log_resource = null;
}
}
}
public function getNom() {
return $this->nom;
}
public static function getStaticNom() {
return self::$_static_nom;
}
private function setNom($script_nom) {
$this->nom = $script_nom;
self::$_static_nom = $script_nom;
}
public static function getLog() {
return self::$log;
}
public static function setLog($l) {
self::$log .= $l;
}
public function initialiser($plc) {
// Récupération des paramêtres autorisés par le script
$this->setParamAutorises($this->parametres);
// Vérification et récupération des paramêtres de la ligne de commande
if ($parametres = $this->verifierParametres($plc, $this->getParamAutorises())) {
$this->setParam($parametres);
}
// Tableaux des emplacements des fichiers ini à rechercher et à charger dans l'ordre du tableau
$projet_prefixe = '';
if (preg_match('/^([^_]+)/', $this->getParam('p'), $match)) {
$projet_prefixe = $match[1];
}
$tab_fichiers_ini = array( ES_CHEMIN_CONFIG.'bdd.ini', // Paramêtres de la base de données
ES_CHEMIN_CONFIG.'commun.ini', // Paramêtres communs aux différents projets
ES_CHEMIN_CONFIG.$this->getParam('p').'.ini',// Ancien emplacement du fichier ini du projet, dans le dossier configuration global
$this->getModuleChemin().$this->getParam('p').'.ini',
$this->getModuleChemin().DS.'configurations'.DS.$this->getParam('p').'.ini');
// Chargement des fichiers ini généraux
for ($i = 0; $i < 2 ; $i++) {
if (!$this->parserFichierIni($tab_fichiers_ini[$i])) {
$e = "Le fichier $tab_fichiers_ini[$i] est introuvable\n";
trigger_error($e, E_USER_WARNING);
}
}
// Chargement du fichier ini du projet
$erreur_ini_projet = true;
for ($i = 2; $i < 7 ; $i++) {
if ($this->parserFichierIni($tab_fichiers_ini[$i])) {
$erreur_ini_projet = false;
}
}
if ($erreur_ini_projet) {
$e = "Le fichier .ini du projet est introuvable : \n".$tab_fichiers_ini[2]."\n".$tab_fichiers_ini[3]."\n";
trigger_error($e, E_USER_WARNING);
}
}
 
abstract public function executer();
 
protected function getModuleChemin($shouldexist = true) {
$chemin = ES_CHEMIN_MODULE.$this->getNom().DS;
if (!file_exists($chemin) && $shouldexist) {
trigger_error("Erreur: le module '".$this->getNom()."' n'existe pas ($chemin)\n", E_USER_ERROR);
}
return $chemin;
}
private function verifierParametres($p_ligne, $p_autorise) {
//print_r($p_ligne);
// Récupération des paramêtres
foreach ($p_autorise as $p_nom => $p_val) {
if (count($p_ligne) == 0) {
if ($p_val[0]) {
trigger_error("Erreur: paramêtre manquant '".$p_nom."' \n", E_USER_WARNING);
}
}
if ($p_nom == '...') {
$parametres['...'] = array();
foreach($p_ligne as $arg) {
$parametres['...'][] = $arg;
}
$p_ligne = array();
break;
} else {
if (isset($p_ligne[$p_nom])) {
// Attribution de la valeur issue de la ligne de commande
$parametres[ltrim($p_nom, '-')] = $p_ligne[$p_nom];
unset($p_ligne[$p_nom]);
} else {
// Attribution de la valeur par défaut
if ($p_val[1] !== true) {
$parametres[ltrim($p_nom, '-')] = $p_val[1];
}
}
}
}
// Gestion de l'excédant de paramêtres
if (count($p_ligne)) {
trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
}
return $parametres;
}
protected function setParamAutorises($param) {
if (!is_null($param)) {
foreach ($param as $c => $v) {
if (isset($this->_parametres_autorises[$c])) {
trigger_error("Erreur: le module '".$this->getNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
} else {
$this->_parametres_autorises[$c] = $v;
}
}
}
}
protected function getParamAutorises($param = null) {
if (!is_null($param)) {
if (isset($this->_parametres_autorises['-'.$param])) {
return $this->_parametres_autorises['-'.$param];
} else if (isset($this->_parametres_autorises[$param])) {
return $this->_parametres_autorises[$param];
} else {
trigger_error("Erreur: le module '".$this->getNom()."' n'a pas défini le paramêtre '$param'\n", E_USER_WARNING);
return false;
}
} else {
return $this->_parametres_autorises;
}
}
protected function setParam($params = array(), $val = null) {
if (is_array($params)) {
$this->_parametres = $params;
self::$_static_parametres = $params;
} else if (!is_array($params) && !is_null($val)) {
$this->_parametres[$params] = $val;
self::$_static_parametres[$params] = $val;
} else {
return false;
}
}
protected function getParam($param = null) {
if (!is_null($param)) {
if (isset($this->_parametres['-'.$param])) {
return $this->_parametres['-'.$param];
} else if (isset($this->_parametres[$param])) {
return $this->_parametres[$param];
} else {
trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
return false;
}
} else {
return $this->_parametres;
}
}
protected static function getStaticParam($param = null) {
if (!is_null($param)) {
if (isset(self::$_static_parametres['-'.$param])) {
return self::$_static_parametres['-'.$param];
} else if (isset(self::$_static_parametres[$param])) {
return self::$_static_parametres[$param];
} else {
trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
return false;
}
} else {
return self::$_static_parametres;
}
}
protected function getIni($nom) {
if (isset($this->_ini[$nom])) {
return $this->_ini[$nom];
} else {
return false;
}
}
protected static function getStaticIni($nom) {
if (isset(self::$_static_ini[$nom])) {
return self::$_static_ini[$nom];
} else {
return false;
}
}
protected function parserFichierIni($fichier_ini) {
if (file_exists($fichier_ini)) {
$aso_ini = parse_ini_file($fichier_ini);
foreach ($aso_ini as $cle => $val) {
if (preg_match('/^php:(.+)$/', $val, $correspondances)) {
eval('$this->$cle = '.$correspondances[1].';');
eval('$this->_ini[$cle] = '.$correspondances[1].';');
} else if (preg_match('/^php-static:(.+)$/', $val, $correspondances)) {
eval('self::$'.$cle.' = '.$correspondances[1].';');
eval('$this->_ini[$cle] = '.$correspondances[1].';');
} else {
// Ancienne forme : compatibilité avec les anciens scripts...
$this->$cle = $val;
// Nouvelle forme : utilisation de la méthode getInit().
$this->_ini[$cle] = $val;
}
}
self::$_static_ini = $this->_ini;
return true;
} else {
return false;
}
}
// Log Resource
/**
* Lit la valeur de l'attribut Log Resource.
* Utilise le motif de conception (= design pattern) Singleton.
*
* @access public
* @param string le préfixe du nom de fichier à créer.
* @return string retourne le Log Resource.
*/
public static function getLogResource() {
if (!isset(self::$log_resource)) {
if (file_exists(self::getLogFichier()) && !self::$log_fichier_ecraser) {
// Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier
// n'existe pas, on tente de le créer.
self::$log_resource = fopen(self::getLogFichier(), 'a');
} else {
//Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille
// du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
self::$log_resource = fopen(self::getLogFichier(), 'w');
$entete_utf8 = "\xEF\xBB\xBF";
if (!fwrite(self::$log_resource, $entete_utf8)) {
echo "Erreur écriture dans le fichier de log lors de l'ajout de l'entête UTF8.\n";
}
}
}
return self::$log_resource;
}
 
// Log Fichier
/**
* Lit la valeur de l'attribut Log Fichier.
* Utilise le motif de conception (= design pattern) Singleton.
*
* @access public
* @return string retourne le nom du fichier de log.
*/
public static function getLogFichier() {
if (!isset(self::$log_fichier)) {
if (self::getStaticIni('projet_nom') && self::getStaticIni('version') && self::getStaticIni('sous_version')) {
$fichier = self::getStaticIni('projet_nom').'_'.
self::getStaticNom().'_'.
self::getStaticParam('a').'_'.
'v'.self::getStaticIni('version').'_'.self::getStaticIni('sous_version');
} else {
$fichier = self::getStaticNom().'_'.self::getStaticParam('a');
}
if (!self::$log_fichier_ecraser) {
$fichier .= '_'.date('Y-m-j_H:i:s', time());
}
$fichier .= '.log';
// Ajout du chemin vers le fichier de log et stockage dans variable static
self::$log_fichier = self::getStaticIni('log_chemin').$fichier;
}
return self::$log_fichier;
}
/**
* Retourne un message d'avertissement formaté.
*
* @param string le message d'erreur avec des %s.
* @param array le tableau des paramêtres à insérer dans le message d'erreur.
* @param int le niveau de verbosité à dépasser pour afficher les messages.
* @return string le message d'erreur formaté.
*/
private function traiterMessage($message, $tab_arguments = array(), $niveau = 0) {
// Nous ajoutons dans le texte les infos provenant de la BDD (déjà encodées en UTF-8).
$texte = vsprintf($message, $tab_arguments);
if ($this->getParam('v') >= $niveau) {
$prefixe = '';
if ($this->getIni('projet_nom') && $this->getIni('version') && $this->getIni('sous_version')) {
$prefixe = $this->getIni('projet_nom').'v'.$this->getIni('version').'.'.$this->getIni('sous_version').'. ';
} else {
$prefixe = date('Y-m-j_H:i:s', time()).' - '.Script::getCode($niveau).' : ';
}
$log = $prefixe.$texte."\n";
echo $log;
self::setLog($log);
if (!fwrite($this->getLogResource(), $log)) {
trigger_error('Erreur écriture dans le fichier de log.'."\n", E_USER_WARNING);
}
}
return "\t".$texte."\n";
}
/**
* Retourne un message d'erreur après avoir écrit le message danns le fichier de log.
* Si le mode verbeux est inactivé, écrit le message dans le fichier de log.
* Si le mode verbeux de niveau 1 ou plus est activé, écrit le message dans le fichier de log et dans la console.
*
* @param string le message d'erreur avec des %s.
* @param array le tableau des paramêtres à insérer dans le message d'erreur.
* @return string le message d'erreur formaté.
*/
protected function traiterErreur($message, $tab_arguments = array()) {
$niveau = Script::ERREUR;
return $this->traiterMessage($message, $tab_arguments, $niveau);
}
/**
* Retourne un message d'avertissement formaté.
* Si le mode verbeux de niveau 1 est activé, écrit le message dans le fichier de log.
* Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log et dans la console.
*
* @param string le message d'erreur avec des %s.
* @param array le tableau des paramêtres à insérer dans le message d'erreur.
* @return string le message d'erreur formaté.
*/
protected function traiterAttention($message, $tab_arguments = array()) {
$niveau = Script::AVERTISSEMENT;
return $this->traiterMessage($message, $tab_arguments, $niveau);
}
/**
* Retourne un message d'information formaté.
* Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log.
* Si le mode verbeux de niveau 3 est activé, écrit le message dans le fichier de log et dans la console.
*
* @param string le message d'information avec des %s.
* @param array le tableau des paramêtres à insérer dans le message d'erreur.
* @param int le niveau de verbosité à dépasser pour afficher les messages.
* @return string le message d'erreur formaté.
*/
protected function afficher($message, $tab_arguments = array(), $niveau = null) {
if (is_null($niveau)) {
$niveau = Script::INFO;
}
$msg = $this->traiterMessage($message, $tab_arguments, $niveau);
return $msg ;
}
/**
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
*
* @param String $fichier le chemin du fichier du squelette
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette.
*
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
*/
public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
$sortie = false;
if (file_exists($fichier)) {
// Extraction des variables du tableau de données
extract($donnees);
// Démarage de la bufferisation de sortie
ob_start();
// Si les tags courts sont activés
if ((bool) @ini_get('short_open_tag') === true) {
// Simple inclusion du squelette
include $fichier;
} else {
// Sinon, remplacement des tags courts par la syntaxe classique avec echo
$html_et_code_php = self::traiterTagsCourts($fichier);
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
$html_et_code_php = '?>'.$html_et_code_php;
// Interprétation du html et du php dans le buffer
echo eval($html_et_code_php);
}
// Récupèration du contenu du buffer
$sortie = ob_get_contents();
// Suppression du buffer
@ob_end_clean();
} else {
$msg = "Le fichier du squelette '$fichier' n'existe pas.";
trigger_error($msg, E_USER_WARNING);
}
// Retourne le contenu
return $sortie;
}
/**
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
*
* @param String $chemin_squelette le chemin du fichier du squelette
*
* @return string le contenu du fichier du squelette php avec les tags courts remplacés.
*/
private static function traiterTagsCourts($chemin_squelette) {
$contenu = file_get_contents($chemin_squelette);
// Remplacement de tags courts par un tag long avec echo
$contenu = str_replace('<?=', '<?php echo ', $contenu);
// Ajout systématique d'un point virgule avant la fermeture php
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
return $contenu;
}
/**
* Créer et stocke du contenu dans un fichier.
*
* @param string le chemin et le nom du fichier.
* @param string le contenu à stocker dans le fichier.
* @return string le message d'erreur formaté.
*/
protected function creerFichier($fichier, $contenu, $compression = false) {
$e = null;
if ($compression) {
// Ajout de l'extension gz
if (substr($fichier, -3) != '.gz') {
$fichier = $fichier.'.gz';
}
// Début de l'écriture du fichier compressé
if ($resource = gzopen($fichier, 'w9')) {
if (!gzwrite($resource, $contenu)) {
$e = "Le contenu texte n'a pas pu être écrit dans le fichier compressé '$fichier'.";
}
if (!gzclose($resource)) {
$e = "Le fichier compressé '$fichier' n'a pas pu être fermé.";
}
} else {
$e = "Le fichier compressé '$fichier' n'a pas pu être ouvert.";
}
} else {
if ($resource = fopen($fichier, 'w')) {
if (!fwrite($resource, $contenu)) {
$e = "Le contenu texte n'a pas pu être écrit dans le fichier '$fichier'.";
}
if (!fclose($resource)) {
$e = "Le fichier '$fichier' n'a pas pu être fermé.";
}
} else {
$e = "Le fichier '$fichier' n'a pas pu être ouvert.";
}
}
if (is_null($e)) {
return true;
} else {
trigger_error($e, E_USER_WARNING);
return false;
}
}
/**
* Méthode permettant d'encoder de l'iso-8859-15 vers utf-8 un tableau de variables.
*
* @param mixed la chaine ou le tableau à encoder en utf-8 depuis l'iso-8859-15.
* @param string l'encodage d'origine si ce n'est pas ISO-8859-15.
* @return mixed la chaine ou le tableau encodé en utf-8.
* @access protected
*/
protected function encoderUtf8( &$val, $encodage = 'ISO-8859-15') {
//echo print_r($val, true)."\n";
if (is_array($val)) {
foreach ($val as $c => $v) {
$val[$c] = $this->encoderUtf8($v);
}
} else {
// Nous vérifions si nous avons un bon encodage UTF-8
if (!is_numeric($val) && !empty($val) && !$this->detecterUtf8($val)) {
// Les nombres, les valeurs vides et ce qui est déjà en UTF-8 ne sont pas encodés.
$val = mb_convert_encoding($val, 'UTF-8', $encodage);
}
}
return $val;
}
/**
* Méthode permettant de détecter réellement l'encodage utf8.
* mb_detect_encoding plante si la chaine de caractère se termine par un caractère accentué.
* Provient de PHPDIG.
*
* @param string la chaine à vérifier.
* @return bool true si c'est de l'utf8, sinon false.
* @access private
*/
private function detecterUtf8($str) {
if ($str === mb_convert_encoding(mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32')) {
return true;
} else {
return false;
}
}
}
?>
/trunk/.htaccess
2,6 → 2,8
AddDefaultCharset UTF-8
 
RewriteEngine On
# Nécessaire pour activer le redirection depuis /
RewriteRule ^$ interfaces/index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ interfaces/index.php