* @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ 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`, cet.`help` "; 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; } }