/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"> </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"> </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 |