* @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.`id`, ce.`project`,ce.`project_id`, ce.field_id, ce.`data_type`, ce.`is_mandatory`, ce.`unit`, ce.`is_visible`, ". "cet.extended_field_id, cet.`label`, cet.`description`, cet.`default_value`, cet.`error_message`, cet.`language_iso_code`, cet.`help` "; public function __construct($config) { 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 = $ce.field_id ". ' -- '.__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") { $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} = ".Cel::db()->proteger($id_element_lie) : ""; $requete .= ' -- '.__FILE__.':'.__LINE__; $resultat = Cel::db()->requeter($requete); return $resultat; } /** * A créer voir ajouterParProjet * * */ public function ajouter($parametres) { return 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); } /** * 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 modifierParProjet(Array $champs_etendus, $langue) { if (! $champs_etendus) return TRUE; // le tableau ... vide à été inséré // pour chaque champ étendu foreach ($champs_etendus['ce'] as $num_champ => $champ_etendu) { $modif_ce = "UPDATE {$this->table_champs_etendus} ce join {$this->table_champs_etendus_trad} cet"; $modif_ce .= " on field_id = `extended_field_id` and ce.`project` = cet.`project` and ". "`language_iso_code` = ".Cel::db()->proteger($langue)." SET "; // pour chaque valeur de la table extended_field foreach ($champs_etendus['ce'][0] as $num_colonne => $colonne) { $modif_ce .= "ce.".$num_colonne." = ".Cel::db()->proteger($champ_etendu[$num_colonne]).", "; } // pour chaque valeur de la table extended_field_traduction foreach ($champs_etendus['cet'][0] as $num_colonne_t => $colonne_t) { $modif_ce .= "cet.".$num_colonne_t." = ".Cel::db()->proteger($champs_etendus['cet'][$num_champ][$num_colonne_t]).", "; } $modif_ce = rtrim($modif_ce, ", "); $modif_ce .= " WHERE ce.{$this->champ_id} = ".Cel::db()->proteger($champ_etendu['field_id']); $modif_ce .= " AND ce.project = ".Cel::db()->proteger($champ_etendu['project']).";"; $modif = Cel::db()->executer($modif_ce); } 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') { if ($projet !== "") { $requeteProjetType = "SELECT type FROM `project_settings` WHERE `project` = '".$projet."';"; $resultat = Cel::db()->executerRequete($requeteProjetType); if ($resultat == array() || $resultat[0]['type'] == "") { $requeteProjet = " AND ce.project = '".$projet."' AND cet.project = '".$projet."' "; } else { $type = $resultat[0]['type']; $requeteProjet = " AND ce.project = '".$type."' AND cet.project = '".$type."' "; } } else { $requeteProjet = ""; } $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."' ".$requeteProjet; $requete .= ' -- '.__FILE__.':'.__LINE__; //echo $requete;exit; $groupes_champs = Cel::db()->executerRequete($requete); return $groupes_champs; } /** * Formate de la même façon que l'ancien service les données de consulterProjetChampsEtendus */ public function consulterGroupesChampsEtendusPredefinis($groupe = "", $langue = 'fr') { $groupes = array(); $groupes_champs = $this->consulterProjetChampsEtendus($groupe, $langue); $cle_groupe = ''; $infos_groupe = null; foreach ($groupes_champs as $groupe_champ) { // les champs sont ordonnés par groupe, ce qui permet de les assembler // séquentiellement en créeant un nouveau groupe lorsque la clé // de groupe du champ actuel est différénte de la précédente if ($cle_groupe != $groupe_champ['project']) { if($infos_groupe != null) { $groupes[] = $infos_groupe; } $infos_groupe = array(); $cle_groupe = $groupe_champ['project']; } if (empty($infos_groupe)) { $infos_groupe = array( 'cle' => $groupe_champ['project_id'], 'nom' => $groupe_champ['project'], 'champs' => array() ); } $infos_groupe['champs'][$groupe_champ['field_id']] = array( 'id' => $groupe_champ['id'], 'cle' => $groupe_champ['field_id'], 'label' => $groupe_champ['label'], 'type' => $groupe_champ['type_champ'], 'valeur' => $groupe_champ['valeur_champ'], 'options' => array( 'invisible' => $groupe_champ['invisible'], 'prive' => $groupe_champ['prive']) ); } // Ajout du dernier groupe, qui serait ignoré sinon, étant donné que l'ajout // au tableau se fait au début de la boucle //TODO: voir si on ne peut pas simplifier ça if (!empty($infos_groupe)) { $groupes[] = $infos_groupe; } return $groupes; } /** * Renvoie le catalogue des champs étendus */ public function consulterCatalogueChampsEtendusPredefinis($ordonner_par_cle = false, $groupe = "") { $requete = 'SELECT ce.id as id, ce.field_id as cle, cet.`label` as label, "0" as invisible, "0" as prive '. "FROM {$this->table_champs_etendus} ce ". "INNER JOIN {$this->table_champs_etendus_trad} cet ON ce.field_id = cet.extended_field_id "; if ($groupe !== "") $requete .= " WHERE project = ".$groupe; $requete .= ' -- '.__FILE__.':'.__LINE__; $catalogue = Cel::db()->executerRequete($requete); $infos_champs = array(); if ($catalogue != false) { foreach ($catalogue as $champ) { $champ_fmt = array( 'id' => $champ['id'], 'cle' => $champ['cle'], 'label' => $champ['label'], 'options' => array( 'invisible' => "0", 'prive' => "0") ); if ($ordonner_par_cle) { $infos_champs[$champ_fmt['cle']] = $champ_fmt; } else { $infos_champs[] = $champ_fmt; } } } return $infos_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; } }