/trunk/jrest/services/CelWidgetManager.php |
---|
25,15 → 25,47 |
class CelWidgetManager extends Cel { |
// certains paramètres apparaissent plusieurs fois car ils ont des alias |
// dans certains widgets |
// correspondance entre les champs de l'interface et les champs de la BD (format 2018 / 2019) |
private $parametres_autorises = array( |
'projet' => 'projet', |
'type' => 'type', |
'esttype' => 'est_type', |
'langue' => 'langue', |
'order' => 'order' |
'projet' => 'project', |
'type' => 'type', |
'esttype' => 'istype', |
'langue' => 'language', |
'order' => 'order' |
); |
private $correspondance_config_widget= array( |
'projet' => 'project', |
'langue' => 'language', |
'titre' => 'title', |
'logo' => 'logo', |
'description' => 'description', |
'type' => 'type', |
'est_type' => 'is_type', |
'style_css' => 'css_style', |
'image_fond' => 'image_font', |
'date_creation' => 'date_created', |
'type_especes' => 'taxo_restriction_type', |
'referentiel' => 'taxo_restriction_value', |
'type_localisation' => 'location_type', |
'localisation' => 'location', |
'milieux' => 'environments', |
'motscles' => 'project_tag_name' |
); |
private $correspondance_champs_etendus = array( |
"key" => "field_id", |
"element" => "data_type", |
"mandatory" => "is_mandatory", |
"unit" => "unit" |
); |
private $correspondance_champs_etendus_trad = array( |
"key" => "extended_field_id", |
"name" => "label", |
"description" => "description", |
"fieldValues" => "default_value" |
); |
public function getRessource() { |
return $this->getElement(array()); |
42,54 → 74,74 |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
switch(@strtolower($params[0])) { |
public function getElement($params = array()) { |
switch(@strtolower($params[0])) { |
case 'widget': |
$this->getWidget(); |
break; |
case 'champsetendus'; |
$this->getChampsEtendus(); |
break; |
default: |
$this->getWidget(); |
} |
} |
public function createElement($requeteDonnees) { |
unset($requeteDonnees['signup_submit']); |
if (isset($requeteDonnees['champs-supp'])) { |
$gestionchamps = new GestionChampsEtendus2($this->config); |
$champs = $this->traiterCorrespondanceChampsEtendusInterfaceBD($requeteDonnees); //var_dump($champs);exit; |
$liste = $gestionchamps->ajouterParProjet($champs); |
unset($requeteDonnees['champs-supp']); |
} |
$requeteDonnees['est_type'] = (isset($requeteDonnees['est_type']) && $requeteDonnees['est_type']== "on") ? '1' : '0'; |
$manager = new GestionWidget($this->config); |
$requeteDonnees = $this->traiterCorresponceConfigWidgetInterfaceBD($requeteDonnees); |
$retour = $manager->ajouterWidget($requeteDonnees); |
$this->envoyerJson($retour); |
} |
public function updateElement($uid,$params) { |
$retour = ""; |
if (isset($params['projet']) && isset($params['langue'])) { |
$manager = new GestionWidget($this->config); |
$params['est_type'] = (isset($params['est_type']) && $params['est_type']== "on") ? '1' : '0'; |
$retour = $manager->modifierWidget($params['projet'], $params['langue'], $params); |
$requeteDonnees = $this->traiterCorresponceConfigWidgetInterfaceBD($params); |
$retour = $manager->modifierWidget($params['projet'], $params['langue'], $requeteDonnees); |
} |
$this->envoyerJson($retour); |
return "ff"; |
} |
private function getWidget() { |
$criteres = $this->traiterParametresAutorises($_GET); |
$criteres = $this->traiterParametresAutorises($_GET); |
$manager = new GestionWidget($this->config); |
$liste = $manager->obtenirWidget($criteres); |
$liste = $this->traiterCorresponceConfigWidgetBDInterface($liste); |
$this->envoyerJson($liste); |
} |
private function getChampsEtendus() { |
$champs = new GestionChampsEtendus2($this->config); |
$projet = (isset($_GET['projet'])) ? $_GET['projet'] : ""; |
$langue = (isset($_GET['langue'])) ? $_GET['langue'] : "fr"; |
$liste = $champs->consulterProjetChampsEtendus($projet, $langue); |
$liste = $this->traiterCorrespondanceChampsEtendusBDInterface($liste); |
$this->envoyerJson($liste); |
} |
protected function traiterParametresAutorises(Array $parametres) { |
$parametres_traites = array(); |
foreach($parametres as $cle => $valeur) { |
if(is_string($valeur) && !trim($valeur)) continue; |
if(isset($this->parametres_autorises[$cle])) { |
98,7 → 150,91 |
} |
return $parametres_traites; |
} |
protected function traiterCorresponceConfigWidgetBDInterface(Array $widgets) { |
$parametres_traites = array(); |
$corresp = array_flip($this->correspondance_config_widget); |
foreach($widgets as $id => $widget) { |
foreach($widget as $cle => $valeur) { |
if(is_string($valeur) && !trim($valeur)) continue; |
if(isset($corresp[$cle])) { |
$parametres_traites[$id][$corresp[$cle]] = $valeur; |
} |
} |
} |
return $parametres_traites; |
} |
protected function traiterCorresponceConfigWidgetInterfaceBD(Array $parametres) { |
$parametres_traites = array(); |
$corresp = $this->correspondance_config_widget; |
foreach($parametres as $cle => $valeur) { |
if(is_string($valeur) && !trim($valeur)) continue; |
if(isset($corresp[$cle])) { |
$parametres_traites[$corresp[$cle]] = $valeur; |
} |
} |
return $parametres_traites; |
} |
protected function traiterCorrespondanceChampsEtendusInterfaceBD(Array $champsinterface) { |
$champsrequete = array(); $i = 0; |
$champssupp = json_decode($champsinterface['champs-supp'], true); |
// pour chaque champs-supp, mettre correspondance extended field et extended field trad |
foreach ($champssupp as $champ) { |
$champsrequete['ce'][$i]['project'] = $champsrequete['cet'][$i]['project'] = $champsinterface['projet']; |
$champsrequete['cet'][$i]['language_iso_code'] = $champsinterface['langue']; |
// pour la table extended fiels champs interface => champs bd |
foreach ($this->correspondance_champs_etendus as $ci => $ce) { |
if (isset($champ[$ci]) && $champ[$ci] != "") { |
$champsrequete['ce'][$i][$ce] = $champ[$ci]; |
} else { |
if ($ci == "mandatory") { |
$champsrequete['ce'][$i][$ce] = "0"; |
} else { |
$champsrequete['ce'][$i][$ce] = ""; |
} |
} |
} |
// pour la table extended fiels trad champs interface => champs bd |
foreach ($this->correspondance_champs_etendus_trad as $cit => $cr) { |
if (isset($champ[$cit]) && is_array($champ[$cit])) { |
$champsrequete['cet'][$i][$cr] = json_encode($champ[$cit]); |
} elseif (isset($champ[$cit]) && $champ[$cit] != "") { |
$champsrequete['cet'][$i][$cr] = $champ[$cit]; |
} else { |
$champsrequete['cet'][$i][$cr] = ""; |
} |
} |
$i++; |
} |
return $champsrequete; |
} |
protected function traiterCorrespondanceChampsEtendusBDInterface(Array $champsrequete) { |
$champssupp = array(); $i = 0; |
foreach ($champsrequete as $champ) { |
$champssupp[$champ['project']]['projet'] = $champ['project']; |
$champssupp[$champ['project']]['langue'] = $champ['language_iso_code']; |
// pour la table extended fiels champs interface => champs bd |
foreach ($this->correspondance_champs_etendus as $ci => $ce) { |
if (isset($champ[$ce]) && $champ[$ce] != "") { |
$champssupp[$champ['project']]['champs-supp'][$i][$ci] = $champ[$ce]; |
} else { |
$champssupp[$champ['project']]['champs-supp'][$i][$ci]= ""; |
} |
} |
// pour la table extended fiels trad champs interface => champs bd |
foreach ($this->correspondance_champs_etendus_trad as $cet => $cr) { |
if (isset($champ[$cr]) && $champ[$cr] != "") { |
$champssupp[$champ['project']]['champs-supp'][$i][$cet]= $champ[$cr]; |
} else { |
$champssupp[$champ['project']]['champs-supp'][$i][$cet]=""; |
} |
}$i++; |
} |
return $champssupp; |
} |
} |
?> |
?> |
/trunk/jrest/bibliotheque/GestionWidget.php |
---|
24,8 → 24,8 |
* @return true ou false suivant le succès de l'opération |
*/ |
public function obtenirWidget($parametres = array()) { |
$requete_liste = "SELECT * FROM `cel_widgets_config` "; |
$order = (isset($parametres['ordre'])) ? $parametres['ordre'] : 'projet'; |
$requete_liste = "SELECT * FROM `project_settings` "; |
$order = (isset($parametres['ordre'])) ? $parametres['ordre'] : 'project'; |
if ($parametres != array()) { |
$requete_liste .= " WHERE "; |
foreach ($parametres as $champ => $valeur) { |
48,7 → 48,7 |
* @return true ou false suivant le succès de l'opération |
*/ |
public function ajouterWidget($parametres) { |
$requete_insertion = 'INSERT INTO cel_widgets_config '. |
$requete_insertion = 'INSERT INTO project_settings '. |
'('.implode(array_keys($parametres), ', ').') VALUES ("'.implode($parametres, '", "').'")'; |
$resultat_ajout = Cel::db()->executer($requete_insertion); |
$retour = true; |
70,13 → 70,13 |
* @return true ou false suivant le succès de l'opération |
*/ |
public function modifierWidget($projet, $langue, $parametres) { |
$requete_insertion = 'UPDATE cel_widgets_config SET '; |
$requete_insertion = 'UPDATE project_settings SET '; |
$modifs = array_map(function($value, $key) { |
return $key.'="'.$value.'"'; |
}, array_values($parametres), array_keys($parametres)); |
$requete_insertion .= implode(', ', $modifs).' WHERE projet = "'.$projet.'" AND langue = "'.$langue.'";' ; |
$requete_insertion .= implode(', ', $modifs).' WHERE project = "'.$projet.'" AND language = "'.$langue.'";' ; |
//print_r($requete_insertion); |
$resultat_ajout = Cel::db()->executer($requete_insertion); |
$retour = true; |
if ($resultat_ajout === false) { |
91,7 → 91,7 |
private function modifierTypeWidget($projet, $parametres) { |
$params_type = array('type_localisation', 'type_espece', 'milieux','champs_supp'); |
print_r(array_intersect_keys($parametres, $params_type));exit; |
//print_r(array_intersect_keys($parametres, $params_type));exit; |
} |
} |
/trunk/jrest/bibliotheque/GestionChampsEtendus2.php |
---|
New file |
0,0 → 1,246 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe de gestion de l'ajout, modification et suppression des champs supplémentaires des obs et images dans la nouvelle bd. |
* |
* @internal Mininum PHP version : 5.2 |
* @category CEL |
* @package Services |
* @subpackage Bibliothèques |
* @version 0.1 |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurelien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
class GestionChampsEtendus2 extends Cel { |
private $table_champs_etendus = "extended_field"; |
private $table_champs_etendus_trad = "extendedfield_translation"; |
private $champ_id = "field_id"; |
private $liste_champs = "ce.`project`, ce.field_id, ce.`data_type`, ce.`is_mandatory`, ce.`unit`, ". |
"cet.extended_field_id, cet.`label`, cet.`description`, cet.`default_value`, cet.`error_message`, cet.`language_iso_code` "; |
public function GestionChampsEtendus2($config, $mode) { |
parent::__construct($config); |
} |
/** |
* Renvoie true ou false suivant que l'element indiqué possède une valeur |
* pour la clé indiquée |
* |
* @param int $id_element_lie |
* @param string $cle |
* @param string $valeur |
* @return bool |
*/ |
public function existe($id_element_lie, $cle) { |
$id = Cel::db()->proteger($id_element_lie); |
$cle = Cel::db()->proteger($cle); |
$requete = 'SELECT COUNT(*) >= 1 AS existe '. |
"FROM {$this->table_champs_etendus} ". |
"WHERE {$this->champ_id} = $id ". |
" AND cle = $cle ". |
' -- '.__FILE__.':'.__LINE__;; |
$resultat = Cel::db()->requeter($requete); |
return ($resultat[0]['existe'] == '1'); |
} |
/** |
* Renvoie tous les champs étendus associé à l'élément passé en paramètre |
* |
* @param int $id_element_lie |
* @return array tableau associatif des champs de la table etendu |
*/ |
public function consulter($id_element_lie, $langue = "fr") { |
$id = Cel::db()->proteger($id_element_lie); |
$requete = 'SELECT {$this->liste_champs} '. |
"FROM {$this->table_champs_etendus} ce ". |
"INNER JOIN {$this->table_champs_etendus_trad} cet ON ce.field_id = cet.extended_field_id ". |
"WHERE cet.language_iso_code = '".$langue."' AND "; |
($id_element_lie != "") ? $requete .= " {$this->champ_id} = $id " : ""; |
$requete .= ' -- '.__FILE__.':'.__LINE__; |
$resultat = Cel::db()->requeter($requete); |
return $resultat; |
} |
/** |
* Ajoute un champ étendu. |
* Si la clé existe déjà, seule valeur du champ est mise à jour |
* |
* @param ChampEtendu $champ_etendu |
* @return bool true si l'ajout a eu lieu |
* |
* |
* |
*/ |
public function ajouter($parametres) { |
$id = Cel::db()->proteger($champ_etendu->id); |
$cle = Cel::db()->proteger($champ_etendu->cle); |
$valeur = Cel::db()->proteger($champ_etendu->valeur); |
$requete = "INSERT INTO {$this->table_champs_etendus} ". |
"( {$this->champ_id}, cle, valeur) ". |
"VALUES ($id, $cle, $valeur) ". |
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur) ". |
' -- '.__FILE__.':'.__LINE__; |
// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour |
// où l'on change de sgbd |
$ajout = Cel::db()->executer($requete); |
return ($ajout !== false); |
} |
/** |
* Ajoute plusieurs champs étendus à la fois. |
* Si la clé existe déjà, seule la valeur du champ est mise à jour |
* |
* @param array $champs_etendus tableau d'objets ChampEtendu |
* @return bool true si l'ajout a eu lieu |
*/ |
public function ajouterParProjet(Array $champs_etendus) { |
if (! $champs_etendus) return TRUE; // le tableau ... vide à été inséré |
// ajout dans la table extended_field |
$ajout_ce = "INSERT INTO extended_field "; |
$ajout_ce .= " (`".implode("`, `", array_keys($champs_etendus['ce'][0]))."`)"; |
$lignes = array(); |
foreach ($champs_etendus['ce'] as $champ_etendu) { |
$lignes[] = "('".implode("', '", $champ_etendu)."')"; |
} |
$ajout_ce = Cel::db()->executer($ajout_ce." VALUES ".implode(", ",$lignes)); |
// ajout dans extendedfield_trad |
$ajout_cet = "INSERT INTO extendedfield_translation "; |
$ajout_cet .= " (`".implode("`, `", array_keys($champs_etendus['cet'][0]))."`)"; |
$lignes = array(); |
foreach ($champs_etendus['cet'] as $champ_etendu) { |
$lignes[] = "('".implode("', '", $champ_etendu)."')"; |
} |
$ajout_cet = Cel::db()->executer($ajout_cet." VALUES ".implode(", ",$lignes)); |
return ($ajout_cet !== false); |
} |
/** |
* Modifie un champ étendu associé à l'élément passé en paramètre |
* |
* @param ChampEtendu $champ_etendu |
* @return bool true si la modification a eu lieu |
*/ |
public function modifier(ChampEtendu $champ_etendu) { |
$id = Cel::db()->proteger($champ_etendu->id); |
$cle = Cel::db()->proteger($champ_etendu->cle); |
$valeur = Cel::db()->proteger($champ_etendu->valeur); |
$requete = "UPDATE {$this->table_champs_etendus} ". |
"SET valeur = $valeur ". |
"WHERE cle = $cle". |
" AND {$this->champ_id} = $id ". |
' -- '.__FILE__.':'.__LINE__; |
$modif = Cel::db()->executer($requete); |
return ($modif !== false); |
} |
/** |
* Supprime le champ champ étendu associé à l'élément et au nom de clé passés en paramètre |
* |
* @param int $id_element_lie |
* @param string $cle |
* @return bool |
*/ |
public function supprimer($id_element_lie, $cle) { |
$id = Cel::db()->proteger($id_element_lie); |
$cle = Cel::db()->proteger($cle); |
$requete = "DELETE FROM {$this->table_champs_etendus} ". |
"WHERE cle = $cle ". |
"AND {$this->champ_id} = $id ". |
' -- '.__FILE__.':'.__LINE__; |
$suppr = Cel::db()->executer($requete); |
return ($suppr !== false); |
} |
/** |
* Supprime tous les champs champ étendu associés à l'élément passés en paramètre |
* |
* @param int $id_element_lie |
* @return bool |
*/ |
public function vider($id_element_lie) { |
$id = Cel::db()->proteger($id_element_lie); |
$requete = "DELETE FROM {$this->table_champs_etendus} ". |
"WHERE {$this->champ_id} = $id ". |
' -- '.__FILE__.':'.__LINE__; |
$suppr = Cel::db()->executer($requete); |
$requete = "DELETE FROM {$this->table_champs_etendus_trad} ". |
"WHERE {$this->champ_id} = $id ". |
' -- '.__FILE__.':'.__LINE__; |
$suppr = Cel::db()->executer($requete); |
return ($suppr !== false); |
} |
/** |
* Renvoie les champs étendus d'un projet |
*/ |
public function consulterProjetChampsEtendus($projet = "", $langue = 'fr') { |
$groupes = array(); |
$requete = "SELECT {$this->liste_champs} ". |
"FROM {$this->table_champs_etendus} ce ". |
"INNER JOIN {$this->table_champs_etendus_trad} cet ON ce.field_id = cet.extended_field_id AND ce.project = cet.project ". |
"WHERE cet.language_iso_code = '".$langue."' "; |
if ($projet !== "") $requete .= " AND ce.project = '".$projet."' AND cet.project = '".$projet."' "; |
$requete .= ' -- '.__FILE__.':'.__LINE__; //echo $requete;exit; |
$groupes_champs = Cel::db()->executerRequete($requete); |
return $groupes_champs; |
} |
/** |
* Transforme un label en clé. |
* Supprime tous les accents et caractères spéciaux. |
* Accole les mots pour créer un chatmot. |
* |
* @param string le label. |
* @return string la clé correspondante |
*/ |
public function transformerLabelEnCle($label) { |
//TODO: cette fonction est elle encore pertinente |
// maintenant que la notion de label est supprimée ? |
$cle = strtolower(trim($label)); |
// Suppression des mots inutiles |
$mots_a_remplacer = array(' le ', ' la ', ' les ', ' des ', ' de ', " l'", " d'", ' à ', ' au '); |
$cle = str_replace($mots_a_remplacer, ' ', $cle); |
// Remplacement parenthèses et crochets et leurs contenus |
$cle = preg_replace('/\([^)]+\)/', '', $cle); |
$cle = preg_replace('/\[[^\]]+\]/', '', $cle); |
// Remplacement des accents (voir : http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html ) |
$cle = htmlentities($cle, ENT_NOQUOTES, 'utf-8'); |
$cle = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $cle); |
$cle = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $cle); // pour les ligatures e.g. 'œ' |
$cle = preg_replace('/&[^;]+;/', '', $cle); // supprime les autres caractères |
// Suppression définitive de tout ce qui n'est pas ASCII |
$cle = preg_replace('/[^a-zA-Z0-9 ]/', ' ', $cle); |
$cle = preg_replace('/\s+/', ' ', $cle); |
// Accollement des mots |
$cle = ucwords($cle); |
$cle = str_replace(' ', '', $cle); |
$cle{0} = strtolower($cle{0}); |
return $cle; |
} |
} |