[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / saisies / inc / saisies.php
diff --git a/www/plugins/auto/saisies/inc/saisies.php b/www/plugins/auto/saisies/inc/saisies.php
new file mode 100644 (file)
index 0000000..63067bd
--- /dev/null
@@ -0,0 +1,379 @@
+<?php\r
+\r
+// Sécurité\r
+if (!defined('_ECRIRE_INC_VERSION')) return;\r
+\r
+/*\r
+ * Une librairie pour manipuler ou obtenir des infos sur un tableau de saisies\r
+ *\r
+ * saisies_lister_par_nom()\r
+ * saisies_lister_champs()\r
+ * saisies_lister_valeurs_defaut()\r
+ * saisies_charger_champs()\r
+ * saisies_chercher()\r
+ * saisies_supprimer()\r
+ * saisies_inserer()\r
+ * saisies_deplacer()\r
+ * saisies_modifier()\r
+ * saisies_verifier()\r
+ * saisies_comparer()\r
+ * saisies_generer_html()\r
+ * saisies_generer_vue()\r
+ * saisies_generer_nom()\r
+ * saisies_inserer_html()\r
+ * saisies_lister_disponibles()\r
+ * saisies_autonomes()\r
+ */\r
+\r
+// Différentes méthodes pour trouver les saisies\r
+include_spip('inc/saisies_lister');\r
+\r
+// Différentes méthodes pour manipuler une liste de saisies\r
+include_spip('inc/saisies_manipuler');\r
+\r
+// Les outils pour afficher les saisies et leur vue\r
+include_spip('inc/saisies_afficher');\r
+\r
+/*\r
+ * Cherche la description des saisies d'un formulaire CVT dont on donne le nom\r
+ *\r
+ * @param string $form Nom du formulaire dont on cherche les saisies\r
+ * @return array Retourne les saisies du formulaire sinon false\r
+ */\r
+function saisies_chercher_formulaire($form, $args){\r
+       if ($fonction_saisies = charger_fonction('saisies', 'formulaires/'.$form, true)\r
+               and $saisies = call_user_func_array($fonction_saisies, $args)\r
+               and is_array($saisies)\r
+               // On passe les saisies dans un pipeline normé comme pour CVT\r
+               and $saisies = pipeline(\r
+                       'formulaire_saisies',\r
+                       array(\r
+                               'args' => array('form' => $form, 'args' => $args),\r
+                               'data' => $saisies\r
+                       )\r
+               )\r
+               // Si c'est toujours un tableau après le pipeline\r
+               and is_array($saisies)\r
+       ){\r
+               return $saisies;\r
+       }\r
+       else{\r
+               return false;\r
+       }\r
+}\r
+\r
+/*\r
+ * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin\r
+ *\r
+ * @param array $saisies Un tableau décrivant les saisies\r
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant ou le nom de la saisie à chercher ou le chemin sous forme d'une liste de clés\r
+ * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin\r
+ * @return array Retourne soit la saisie, soit son chemin, soit null\r
+ */\r
+function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){\r
+\r
+       if (is_array($saisies) and $id_ou_nom_ou_chemin){\r
+               if (is_string($id_ou_nom_ou_chemin)){\r
+                       $nom = $id_ou_nom_ou_chemin;\r
+                       // identifiant ? premier caractere @\r
+                       $id = ($nom[0] == '@');\r
+\r
+                       foreach($saisies as $cle => $saisie){\r
+                               $chemin = array($cle);\r
+                               if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) {\r
+                                       return $retourner_chemin ? $chemin : $saisie;\r
+                               } elseif ($saisie['saisies'] and is_array($saisie['saisies']) and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) {\r
+                                       return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour;\r
+                               }\r
+\r
+                       }\r
+               }\r
+               elseif (is_array($id_ou_nom_ou_chemin)){\r
+                       $chemin = $id_ou_nom_ou_chemin;\r
+                       $saisie = $saisies;\r
+                       // On vérifie l'existence quand même\r
+                       foreach ($chemin as $cle){\r
+                               if (isset($saisie[$cle])) $saisie = $saisie[$cle];\r
+                               else return null;\r
+                       }\r
+                       // Si c'est une vraie saisie\r
+                       if ($saisie['saisie'] and $saisie['options']['nom'])\r
+                               return $retourner_chemin ? $chemin : $saisie;\r
+               }\r
+       }\r
+       \r
+       return null;\r
+}\r
+\r
+/*\r
+ * Génère un nom unique pour un champ d'un formulaire donné\r
+ *\r
+ * @param array $formulaire Le formulaire à analyser \r
+ * @param string $type_saisie Le type de champ dont on veut un identifiant \r
+ * @return string Un nom unique par rapport aux autres champs du formulaire\r
+ */\r
+function saisies_generer_nom($formulaire, $type_saisie){\r
+       $champs = saisies_lister_champs($formulaire);\r
+       \r
+       // Tant que type_numero existe, on incrémente le compteur\r
+       $compteur = 1;\r
+       while (array_search($type_saisie.'_'.$compteur, $champs) !== false)\r
+               $compteur++;\r
+       \r
+       // On a alors un compteur unique pour ce formulaire\r
+       return $type_saisie.'_'.$compteur;\r
+}\r
+\r
+/*\r
+ * Crée un identifiant Unique\r
+ * pour toutes les saisies donnees qui n'en ont pas \r
+ *\r
+ * @param Array $saisies Tableau de saisies\r
+ * @param Bool $regenerer_id Régénère un nouvel identifiant pour toutes les saisies ?\r
+ * @return Array Tableau de saisies complété des identifiants\r
+ */\r
+function saisies_identifier($saisies, $regenerer = false) {\r
+       if (!is_array($saisies)) {\r
+               return array();\r
+       }\r
+       foreach ($saisies as $k => $saisie) {\r
+               $saisies[$k] = saisie_identifier($saisie, $regenerer);\r
+       }\r
+       return $saisies;\r
+}\r
+\r
+/**\r
+ * Crée un identifiant Unique\r
+ * pour la saisie donnee si elle n'en a pas\r
+ * (et pour ses sous saisies éventuels)\r
+ *\r
+ * @param Array $saisie Tableau d'une saisie\r
+ * @param Bool $regenerer_id Régénère un nouvel identifiant pour la saisie ?\r
+ * @return Array Tableau de la saisie complété de l'identifiant\r
+**/\r
+function saisie_identifier($saisie, $regenerer = false) {\r
+       if (!isset($saisie['identifiant']) OR !$saisie['identifiant']) {\r
+               $saisie['identifiant'] = uniqid('@');\r
+       } elseif ($regenerer) {\r
+               $saisie['identifiant'] = uniqid('@');\r
+       }\r
+       if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) {\r
+               $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer);\r
+       }\r
+       return $saisie;\r
+}\r
+\r
+/*\r
+ * Vérifier tout un formulaire tel que décrit avec les Saisies\r
+ *\r
+ * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies\r
+ * @return array Retourne un tableau d'erreurs\r
+ */\r
+function saisies_verifier($formulaire){\r
+       include_spip('inc/verifier');\r
+       $erreurs = array();\r
+       $verif_fonction = charger_fonction('verifier','inc',true);\r
+       \r
+       $saisies = saisies_lister_par_nom($formulaire);\r
+       foreach ($saisies as $saisie){\r
+               $obligatoire = $saisie['options']['obligatoire'];\r
+               $champ = $saisie['options']['nom'];\r
+               $file = ($saisie['saisie'] == 'input' and $saisie['options']['type'] == 'file');\r
+               $verifier = $saisie['verifier'];\r
+\r
+               // Si le nom du champ est un tableau indexé, il faut parser !\r
+               if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)){\r
+                       $valeur = _request($separe[1]);\r
+                       preg_match_all('/\[([\w]+)\]/', $separe[2], $index);\r
+                       // On va chercher au fond du tableau\r
+                       foreach($index[1] as $cle){\r
+                               $valeur = $valeur[$cle];\r
+                       }\r
+               }\r
+               // Sinon la valeur est juste celle du nom\r
+               else\r
+                       $valeur = _request($champ);\r
+               \r
+               // On regarde d'abord si le champ est obligatoire\r
+               if ($obligatoire\r
+                       and $obligatoire != 'non'\r
+                       and (\r
+                               ($file and !$_FILES[$champ]['name'])\r
+                               or (!$file and (\r
+                                       is_null($valeur)\r
+                                       or (is_string($valeur) and trim($valeur) == '')\r
+                                       or (is_array($valeur) and count($valeur) == 0)\r
+                               ))\r
+                       )\r
+               )\r
+                       $erreurs[$champ] = _T('info_obligatoire');\r
+               \r
+               // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif\r
+               if (!$erreurs[$champ] and is_array($verifier) and $verif_fonction){\r
+                       // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur\r
+                       if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $verifier['options']))\r
+                               $erreurs[$champ] = $erreur_eventuelle;\r
+               }\r
+       }\r
+       \r
+       return $erreurs;\r
+}\r
+\r
+/*\r
+ * Transforme une chaine en tableau avec comme principe :\r
+ * - une ligne devient une case\r
+ * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur\r
+ *\r
+ * @param string $chaine Une chaine à transformer\r
+ * @return array Retourne un tableau PHP\r
+ */\r
+function saisies_chaine2tableau($chaine, $separateur="\n"){\r
+       if ($chaine and is_string($chaine)){\r
+               $tableau = array();\r
+               // On découpe d'abord en lignes\r
+               $lignes = explode($separateur, $chaine);\r
+               foreach ($lignes as $i=>$ligne){\r
+                       $ligne = trim(trim($ligne), '|');\r
+                       // Si ce n'est pas une ligne sans rien\r
+                       if ($ligne !== ''){\r
+                               // Si on trouve un découpage dans la ligne on fait cle|valeur\r
+                               if (strpos($ligne, '|') !== false){\r
+                                       list($cle,$valeur) = explode('|', $ligne, 2);\r
+                                       $tableau[$cle] = $valeur;\r
+                               }\r
+                               // Sinon on génère la clé\r
+                               else{\r
+                                       $tableau[$i] = $ligne;\r
+                               }\r
+                       }\r
+               }\r
+               return $tableau;\r
+       }\r
+       // Si c'est déjà un tableau on le renvoie tel quel\r
+       elseif (is_array($chaine)){\r
+               return $chaine;\r
+       }\r
+       else{\r
+               return array();\r
+       }\r
+}\r
+\r
+/*\r
+ * Transforme un tableau en chaine de caractères avec comme principe :\r
+ * - une case de vient une ligne de la chaine\r
+ * - chaque ligne est générée avec la forme cle|valeur\r
+ */\r
+function saisies_tableau2chaine($tableau){\r
+       if ($tableau and is_array($tableau)){\r
+               $chaine = '';\r
+       \r
+               foreach($tableau as $cle=>$valeur){\r
+                       $ligne = trim("$cle|$valeur");\r
+                       $chaine .= "$ligne\n";\r
+               }\r
+               $chaine = trim($chaine);\r
+       \r
+               return $chaine;\r
+       }\r
+       // Si c'est déjà une chaine on la renvoie telle quelle\r
+       elseif (is_string($tableau)){\r
+               return $tableau;\r
+       }\r
+       else{\r
+               return '';\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
+/**\r
+ * Passe une valeur en tableau d'élements si ce n'en est pas une\r
+ *\r
+ * entrée :\r
+ * cle|valeur\r
+ * cle|valeur\r
+ *\r
+ * Sinon :\r
+ * valeur,valeur\r
+ *\r
+ * @param mixed $valeur\r
+ * @return array Tableau de valeurs\r
+**/\r
+function saisies_valeur2tableau($valeur, $sinon_separateur="") {\r
+       if (is_array($valeur)) {\r
+               return $valeur;\r
+       }\r
+       \r
+       if (!strlen($valeur)) {\r
+               return array();\r
+       }\r
+       \r
+       $t = saisies_chaine2tableau($valeur);\r
+       if (count($t) > 1) {\r
+               return $t;\r
+       }\r
+\r
+       // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule\r
+       // et a donc une cle est 0 dans ce cas la d'ailleurs\r
+       if (isset($t[0])) {\r
+               $t = saisies_chaine2tableau($t[0], ',');\r
+       }\r
+       \r
+       return $t;\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+ * Génère une page d'aide listant toutes les saisies et leurs options\r
+ */\r
+function saisies_generer_aide(){\r
+       // On a déjà la liste par saisie\r
+       $saisies = saisies_lister_disponibles();\r
+       \r
+       // On construit une liste par options\r
+       $options = array();\r
+       foreach ($saisies as $type_saisie=>$saisie){\r
+               $options_saisie = saisies_lister_par_nom($saisie['options'], false);\r
+               foreach ($options_saisie as $nom=>$option){\r
+                       // Si l'option n'existe pas encore\r
+                       if (!isset($options[$nom])){\r
+                               $options[$nom] = _T_ou_typo($option['options']);\r
+                       }\r
+                       // On ajoute toujours par qui c'est utilisé\r
+                       $options[$nom]['utilisee_par'][] = $type_saisie;\r
+               }\r
+               ksort($options_saisie);\r
+               $saisies[$type_saisie]['options'] = $options_saisie;\r
+       }\r
+       ksort($options);\r
+       \r
+       return recuperer_fond(\r
+               'inclure/saisies_aide',\r
+               array(\r
+                       'saisies' => $saisies,\r
+                       'options' => $options\r
+               )\r
+       );\r
+}\r
+\r
+/*\r
+ * Le tableau de saisies a-t-il une option afficher_si ?\r
+ *\r
+ * @param array $saisies Un tableau de saisies\r
+ * @return boolean\r
+ */\r
+\r
+function saisies_afficher_si($saisies) {\r
+       $saisies = saisies_lister_par_nom($saisies,true);\r
+       // Dès qu'il y a au moins une option afficher_si, on l'active\r
+       foreach ($saisies as $saisie) {\r
+               if (isset($saisie['options']['afficher_si']))\r
+                       return true;\r
+       }\r
+       return false;\r
+}\r
+\r
+?>\r