diff --git a/action/deplacer_saisie.php b/action/deplacer_saisie.php index 5bee2b1a..eeea9ee6 100644 --- a/action/deplacer_saisie.php +++ b/action/deplacer_saisie.php @@ -5,8 +5,10 @@ * * @package SPIP\Saisies\Action */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de déplacement de saisies dans le constructeur de formulaires @@ -24,19 +26,19 @@ function action_deplacer_saisie_dist() { $formulaire_actuel = session_get($session); if (!$formulaire_actuel) { - return ""; + return ''; } include_spip('inc/saisies'); - + $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel); if (!isset($saisies_actuelles[$identifiant])) { - return ""; + return ''; } // tester @id et [@id] (fieldset) - if ($ou and !isset($saisies_actuelles[$ou]) and !isset($saisies_actuelles[ substr($ou,1,-1) ])) { - return ""; + if ($ou and !isset($saisies_actuelles[$ou]) and !isset($saisies_actuelles[ substr($ou, 1, -1) ])) { + return ''; } // on deplace ou c'est demande... @@ -45,4 +47,3 @@ function action_deplacer_saisie_dist() { // On sauve tout ca $formulaire_actuel = session_set($session, $formulaire_actuel); } - diff --git a/balise/configurer_saisie.php b/balise/configurer_saisie.php index f362eed3..75dabf45 100644 --- a/balise/configurer_saisie.php +++ b/balise/configurer_saisie.php @@ -6,7 +6,9 @@ */ // Sécurité -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise `#CONFIGURER_SAISIE` @@ -14,11 +16,11 @@ if (!defined("_ECRIRE_INC_VERSION")) return; * @uses Pile::recuperer_et_supprimer_argument_balise() * @uses Pile::creer_et_ajouter_argument_balise() * @see balise_INCLURE_dist() - * + * * @param Champ $p * @return Champ **/ -function balise_CONFIGURER_SAISIE_dist($p){ +function balise_CONFIGURER_SAISIE_dist($p) { // On recupere le premier argument : le nom de la saisie $saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); @@ -40,5 +42,3 @@ function balise_CONFIGURER_SAISIE_dist($p){ } } - - diff --git a/balise/generer_saisies.php b/balise/generer_saisies.php index 6a37f128..cf8242d6 100644 --- a/balise/generer_saisies.php +++ b/balise/generer_saisies.php @@ -1,4 +1,4 @@ -param[0]`. - * + * * `param[0][0]` vaut toujours '' (ou presque ?) * * @see balise_SAISIE_dist() Pour un exemple d'utilisation @@ -34,7 +36,7 @@ class Pile { /** * Récupère un argument de balise - * + * * @param int $pos * @param Champ $p * @return mixed|null Élément de l'AST représentant l'argument s'il existe @@ -62,7 +64,7 @@ class Pile { } if (!isset($p->param[0][$pos])) { return null; - } + } if ($pos == 0) { array_shift($p->param[0]); } else { @@ -79,7 +81,7 @@ class Pile { * * @uses Pile::recuperer_argument_balise() * @uses Pile::supprimer_argument_balise() - * + * * @param int $pos * @param Champ $p * @return mixed|null Élément de l'AST représentant l'argument s'il existe @@ -95,7 +97,7 @@ class Pile { * Ajoute un argument de balise * * Empile l'argument à la suite des arguments déjà existants pour la balise - * + * * @param mixed $element Élément de l'AST représentant l'argument à ajouter * @param Champ $p * @return Champ @@ -122,11 +124,11 @@ class Pile { * ``` * $nom = Pile::creer_argument_balise(nom); // {nom} * $nom = Pile::creer_argument_balise(nom, 'coucou'); // {nom=coucou} - * + * * $balise = Pile::creer_balise('BALISE'); * $nom = Pile::creer_argument_balise(nom, $balise); // {nom=#BALISE} * ``` - * + * * @param string $nom * Nom de l'argument * @param string|object $valeur @@ -138,26 +140,24 @@ class Pile { $s = new Texte; $s->texte = $nom; $s->ligne=0; - + // si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres if (is_object($valeur)) { $valeur = array($valeur); } - + $res = null; - + // {nom} if (is_null($valeur)) { $res = array($s); - } - // {nom=coucou} - elseif (is_string($valeur)) { + } elseif (is_string($valeur)) { + // {nom=coucou} $s->texte .= "=$valeur"; $res = array($s); - } - // {nom=#BALISE} - elseif (is_array($valeur)) { - $s->texte .= "="; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :) + } elseif (is_array($valeur)) { + // {nom=#BALISE} + $s->texte .= '='; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :) $res = array_merge(array($s), $valeur); } @@ -170,7 +170,7 @@ class Pile { * * @uses Pile::creer_argument_balise() * @uses Pile::ajouter_argument_balise() - * + * * @param Champ $p * @param string $nom * Nom de l'argument @@ -179,7 +179,7 @@ class Pile { * @return Champ **/ static function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) { - $new = Pile::creer_argument_balise($nom, $valeur); + $new = Pile::creer_argument_balise($nom, $valeur); return Pile::ajouter_argument_balise($new, $p); } @@ -191,10 +191,10 @@ class Pile { * @example * ``` * // Crée : #ENV*{titre} - * $titre = Pile::recuperer_argument_balise(1, $p); // $titre, 1er argument de la balise actuelle + * $titre = Pile::recuperer_argument_balise(1, $p); // $titre, 1er argument de la balise actuelle * $env = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*')); * ``` - * + * * @param string $nom * Nom de la balise * @param array $opt @@ -205,8 +205,8 @@ class Pile { include_spip('public/interfaces'); $b = new Champ; $b->nom_champ = strtoupper($nom); - foreach ($opt as $o=>$val) { - if (property_exists($b,$o)) { + foreach ($opt as $o => $val) { + if (property_exists($b, $o)) { if ($o == 'param') { array_unshift($val, ''); $b->$o = array($val); @@ -229,7 +229,7 @@ class Pile { * La balise `#SAISIE` est un raccourci pour une écriture plus compliquée de la balise `#INCLURE`. * La balise calcule une série de paramètre récupérer et à transmettre à `#INCLURE`, * en fonction des valeurs des 2 premiers paramètres transmis. - * + * * Les autres arguments sont transmis tels quels à la balise `#INCLURE`. * * Ainsi `#SAISIE{input,nom,label=Nom,...}` exécutera l'équivalent de @@ -270,5 +270,3 @@ function balise_SAISIE_dist($p) { return balise_INCLURE_dist($p); } } - - diff --git a/balise/voir_saisie.php b/balise/voir_saisie.php index 8ed9f945..f2030033 100644 --- a/balise/voir_saisie.php +++ b/balise/voir_saisie.php @@ -8,23 +8,25 @@ // Sécurité -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise `#VOIR_SAISIE` qui retourne le code HTML de la vue d'une saisie indiquée * * Cette balise incluera le squelette `saisies-vues/_base.html` et lui-même `saisies-vues/{type}.html` - * + * * @syntaxe `#VOIR_SAISIE{type,nom[,option=valeur,...]}` * @uses Pile::recuperer_et_supprimer_argument_balise() * @uses Pile::creer_et_ajouter_argument_balise() * @uses Pile::creer_balise() * @see balise_INCLURE_dist() - * + * * @param Champ $p * @return Champ */ -function balise_VOIR_SAISIE_dist ($p) { +function balise_VOIR_SAISIE_dist($p) { // on recupere les parametres sans les traduire en code d'execution php $type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); @@ -42,7 +44,7 @@ function balise_VOIR_SAISIE_dist ($p) { // on appelle la balise #INCLURE // avec les arguments ajoutes - if(function_exists('balise_INCLURE')) { + if (function_exists('balise_INCLURE')) { return balise_INCLURE($p); } else { return balise_INCLURE_dist($p); diff --git a/balise/voir_saisies.php b/balise/voir_saisies.php index 482c418d..ed8fd939 100644 --- a/balise/voir_saisies.php +++ b/balise/voir_saisies.php @@ -1,4 +1,4 @@ -$formulaire_config)); $formulaire_config = $formulaire_config['saisies']; - + // Si la saisie possede un identifiant, on l'ajoute // au formulaire de configuration pour ne pas le perdre en route if (isset($saisie['identifiant']) and $saisie['identifiant']) { @@ -117,11 +119,10 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in ) ); } - + // S'il y a l'option adéquat, on ajoute le champ pour modifier le nom if (isset($options['modifier_nom']) and $options['modifier_nom'] - and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true)) - { + and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true)) { $chemin_nom[] = 'saisies'; $chemin_nom[] = '0'; @@ -151,12 +152,12 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in $verif_options = array(); // S'il y a un groupe "validation" alors on va construire le formulaire des vérifications - if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)){ + if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)) { include_spip('inc/verifier'); $liste_verifications = verifier_lister_disponibles(); $chemin_validation[] = 'saisies'; $chemin_validation[] = 1000000; // à la fin - + // On construit la saisie à insérer et les fieldset des options $saisie_liste_verif = array( 'saisie' => 'selection', @@ -169,10 +170,10 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in ) ); - foreach ($liste_verifications as $type_verif => $verif){ + foreach ($liste_verifications as $type_verif => $verif) { $saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre']; // Si le type de vérif a des options, on ajoute un fieldset - if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])){ + if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])) { $groupe = array( 'saisie' => 'fieldset', 'options' => array( @@ -204,32 +205,31 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in ), )); - if ($enregistrer_saisie){ + if ($enregistrer_saisie) { // La saisie modifié $saisie_modifiee = _request("saisie_modifiee_${nom}"); // On cherche les erreurs de la configuration $vraies_erreurs = saisies_verifier($formulaire_config); // Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie if (isset($options['modifier_nom']) and $options['modifier_nom'] - and isset($options['nom_unique']) and $options['nom_unique']) - { + and isset($options['nom_unique']) and $options['nom_unique']) { $nom_modifie = $saisie_modifiee['options']['nom']; - if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie)) + if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie)) { $vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique'); + } } // On regarde s'il a été demandé un type de vérif if (isset($saisie_modifiee['verifier']['type']) - and (($type_verif = $saisie_modifiee['verifier']['type']) != '') - and $verif_options[$type_verif]) - { + and (($type_verif = $saisie_modifiee['verifier']['type']) != '') + and $verif_options[$type_verif]) { // On ne vérifie que les options du type demandé $vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies'])); } } // On insère chaque saisie des options de verification - if ($verif_options){ - foreach ($verif_options as $saisie_verif){ + if ($verif_options) { + foreach ($verif_options as $saisie_verif) { $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation); } } @@ -250,23 +250,23 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in return $erreurs; } -function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial=array(), $options=array()){ +function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial = array(), $options = array()) { include_spip('inc/saisies'); $retours = array(); $saisies_disponibles = saisies_lister_disponibles(); - + // On ajoute un préfixe devant l'identifiant $identifiant = 'constructeur_formulaire_'.$identifiant; // On récupère le formulaire à son état actuel $formulaire_actuel = session_get($identifiant); - + // Si on demande à ajouter un groupe - if ($ajouter_saisie = _request('ajouter_groupe_saisie')){ + if ($ajouter_saisie = _request('ajouter_groupe_saisie')) { $formulaire_actuel = saisies_groupe_inserer($formulaire_actuel, $ajouter_saisie); } - + // Si on demande à ajouter une saisie - if ($ajouter_saisie = _request('ajouter_saisie')){ + if ($ajouter_saisie = _request('ajouter_saisie')) { $nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie); $saisie = array( 'saisie' => $ajouter_saisie, @@ -275,49 +275,40 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini ) ); // S'il y a des valeurs par défaut pour ce type de saisie, on les ajoute - if (($defaut = $saisies_disponibles[$ajouter_saisie]['defaut']) and is_array($defaut)){ + if (($defaut = $saisies_disponibles[$ajouter_saisie]['defaut']) and is_array($defaut)) { $defaut = _T_ou_typo($defaut, 'multi'); - //Compatibilite PHP<5.3.0 + //Compatibilite PHP<5.3.0 //source : http://www.php.net/manual/en/function.array-replace-recursive.php#92574 - if (!function_exists('array_replace_recursive')) - { - function array_replace_recursive($array, $array1) - { - function recurse($array, $array1) - { - foreach ($array1 as $key => $value) - { + if (!function_exists('array_replace_recursive')) { + function array_replace_recursive($array, $array1) { + function recurse($array, $array1) { + foreach ($array1 as $key => $value) { // create new key in $array, if it is empty or not an array - if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key]))) - { + if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key]))) { $array[$key] = array(); } // overwrite the value in the base array - if (is_array($value)) - { + if (is_array($value)) { $value = recurse($array[$key], $value); } $array[$key] = $value; } return $array; } - + // handle the arguments, merge one by one $args = func_get_args(); $array = $args[0]; - if (!is_array($array)) - { + if (!is_array($array)) { return $array; } - for ($i = 1; $i < count($args); $i++) - { - if (is_array($args[$i])) - { + for ($i = 1; $i < count($args); $i++) { + if (is_array($args[$i])) { $array = recurse($array, $args[$i]); } } - return $array; + return $array; } } $saisie = array_replace_recursive($saisie, $defaut); @@ -327,38 +318,37 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini // Si on demande à dupliquer une saisie if ($dupliquer_saisie = _request('dupliquer_saisie')) { - $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie); + $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie); } - + // Si on demande à supprimer une saisie - if ($supprimer_saisie = _request('supprimer_saisie')){ + if ($supprimer_saisie = _request('supprimer_saisie')) { $formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie); } - + // Si on enregistre la conf d'une saisie - if ($nom = _request('enregistrer_saisie')){ + if ($nom = _request('enregistrer_saisie')) { // On récupère ce qui a été modifié $saisie_modifiee = _request("saisie_modifiee_$nom"); - + // On regarde s'il y a une position à modifier - if (isset($saisie_modifiee['position'])){ + if (isset($saisie_modifiee['position'])) { $position = $saisie_modifiee['position']; unset($saisie_modifiee['position']); // On ne déplace que si ce n'est pas la même chose - if ($position != $nom) + if ($position != $nom) { $formulaire_actuel = saisies_deplacer($formulaire_actuel, $nom, $position); + } } - + // On regarde s'il y a des options de vérification à modifier if (isset($saisie_modifiee['verifier']['type']) - and ($type_verif = $saisie_modifiee['verifier']['type']) != '') - { + and ($type_verif = $saisie_modifiee['verifier']['type']) != '') { $saisie_modifiee['verifier'] = array( 'type' => $type_verif, 'options' => $saisie_modifiee['verifier'][$type_verif] ); - } - else { + } else { unset($saisie_modifiee['verifier']); } @@ -367,17 +357,18 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini if (isset($saisie_modifiee['verifier']['options']) and $saisie_modifiee['verifier']['options']) { $saisie_modifiee['verifier']['options'] = array_filter($saisie_modifiee['verifier']['options'], 'saisie_option_contenu_vide'); } - + // On désinfecte à la main - if (is_array($saisie_modifiee['options'])) + if (is_array($saisie_modifiee['options'])) { spip_desinfecte($saisie_modifiee['options']); - + } + // On modifie enfin $formulaire_actuel = saisies_modifier($formulaire_actuel, $nom, $saisie_modifiee); } // Si on demande à réinitialiser - if (_request('reinitialiser') == 'oui'){ + if (_request('reinitialiser') == 'oui') { $formulaire_actuel = $formulaire_initial; } @@ -392,26 +383,26 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini // À utiliser avec un array_walk_recursive() // Applique une transformation à la @valeur@ de tous les champs "nom" d'un formulaire, y compris loin dans l'arbo -function formidable_transformer_nom(&$valeur, $cle, $transformation){ - if ($cle == 'nom' and is_string($valeur)){ +function formidable_transformer_nom(&$valeur, $cle, $transformation) { + if ($cle == 'nom' and is_string($valeur)) { $valeur = str_replace('@valeur@', $valeur, $transformation); } } // Préparer une saisie pour la transformer en truc configurable -function formidable_generer_saisie_configurable($saisie, $env){ +function formidable_generer_saisie_configurable($saisie, $env) { // On récupère le nom $nom = $saisie['options']['nom']; - $identifiant = isset($saisie['identifiant']) ? $saisie['identifiant'] : ""; + $identifiant = isset($saisie['identifiant']) ? $saisie['identifiant'] : ''; // On cherche si ya un formulaire de config - $formulaire_config = isset($env['erreurs']['configurer_'.$nom]) ? $env['erreurs']['configurer_'.$nom] : ""; + $formulaire_config = isset($env['erreurs']['configurer_'.$nom]) ? $env['erreurs']['configurer_'.$nom] : ''; // On ajoute une classe if (!isset($saisie['options']['conteneur_class'])) { $saisie['options']['conteneur_class'] = ''; // initialisation } // Compat ancien nom li_class if (isset($saisie['options']['li_class'])) { - $saisie['options']['conteneur_class'] .= " " . $saisie['options']['li_class']; // initialisation + $saisie['options']['conteneur_class'] .= ' ' . $saisie['options']['li_class']; // initialisation } $saisie['options']['conteneur_class'] .= ' configurable'; @@ -426,7 +417,7 @@ function formidable_generer_saisie_configurable($saisie, $env){ 'formulaires/inc-construire_formulaire-actions', array( 'nom' => $nom, - 'identifiant' => $identifiant, + 'identifiant' => $identifiant, 'formulaire_config' => $formulaire_config, 'deplacable' => $env['_chemin_ui'] ) @@ -443,7 +434,7 @@ function formidable_generer_saisie_configurable($saisie, $env){ ); // Si ya un form de config on l'ajoute à la fin - if (is_array($formulaire_config)){ + if (is_array($formulaire_config)) { // On double l'environnement $env2 = $env; // On ajoute une classe @@ -451,9 +442,9 @@ function formidable_generer_saisie_configurable($saisie, $env){ // Si possible on met en readonly $saisie['options']['readonly'] = 'oui'; - + // On vire les sous-saisies s'il y en a - if (isset($saisie['saisies']) and $saisie['saisies'] and is_array($saisie['saisies'])){ + if (isset($saisie['saisies']) and $saisie['saisies'] and is_array($saisie['saisies'])) { $nb_champs_masques = count(saisies_lister_champs($saisie['saisies'])); $saisie['saisies'] = array( array( @@ -465,9 +456,9 @@ function formidable_generer_saisie_configurable($saisie, $env){ ) ); } - + // On va ajouter le champ pour la position - if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))){ + if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))) { $chemin_description = array(0); $formulaire_config = saisies_inserer( $formulaire_config, @@ -498,22 +489,21 @@ function formidable_generer_saisie_configurable($saisie, $env){ ), $chemin_description ); - + $env2['saisies'] = $formulaire_config; - + // Un test pour savoir si on prend le _request ou bien $erreurs_test = $env['erreurs']; unset($erreurs_test['configurer_'.$nom]); unset($erreurs_test['positionner']); unset($erreurs_test['message_erreur']); - if ($erreurs_test){ + if ($erreurs_test) { // Là aussi on désinfecte à la main if (isset($env2["saisie_modifiee_$nom"]['options']) and is_array($env2["saisie_modifiee_$nom"]['options'])) { spip_desinfecte($env2["saisie_modifiee_$nom"]['options']); } - } - else{ + } else { $env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom]; // il n'y a pas toujours de verification... if (isset($env2["saisie_modifiee_$nom"]['verifier'])) { @@ -521,7 +511,7 @@ function formidable_generer_saisie_configurable($saisie, $env){ = $env2["saisie_modifiee_$nom"]['verifier']['options']; } } - + $env2['fond_generer'] = 'inclure/generer_saisies'; $saisie = saisies_inserer_html( $saisie, @@ -554,7 +544,7 @@ function formidable_generer_saisie_configurable($saisie, $env){ **/ function saisie_option_contenu_vide($var) { if (!$var) { - if (is_string($var) AND strlen($var)) { + if (is_string($var) and strlen($var)) { return true; } return false; @@ -562,29 +552,29 @@ function saisie_option_contenu_vide($var) { return true; } -function saisies_groupe_inserer($formulaire_actuel, $saisie){ +function saisies_groupe_inserer($formulaire_actuel, $saisie) { include_spip('inclure/configurer_saisie_fonctions'); - + //le groupe de saisies - $saisies_charger_infos = saisies_charger_infos($saisie,$saisies_repertoire = "saisies/groupes"); - + $saisies_charger_infos = saisies_charger_infos($saisie, $saisies_repertoire = 'saisies/groupes'); + //le tableau est-il en options ou en saisies ? $classique_yaml=count($saisies_charger_infos['options']); $formidable_yaml=count($saisies_charger_infos['saisies']); - if($classique_yaml>0) { + if ($classique_yaml>0) { $champ_options = 'options'; } - if($formidable_yaml>0) { + if ($formidable_yaml>0) { $champ_options = 'saisies'; } - - //les champs du groupe - foreach($saisies_charger_infos[$champ_options] as $info_saisie){ + + //les champs du groupe + foreach ($saisies_charger_infos[$champ_options] as $info_saisie) { unset($info_saisie['identifiant']); $saisies_disponibles = saisies_lister_disponibles(); $construire_nom = $info_saisie[$champ_options]['nom'] ? $info_saisie[$champ_options]['nom'] : $info_saisie['saisie']; - $nom = $info_saisie[$champ_options]['nom'] = saisies_generer_nom($formulaire_actuel,$construire_nom); - + $nom = $info_saisie[$champ_options]['nom'] = saisies_generer_nom($formulaire_actuel, $construire_nom); + $formulaire_actuel = saisies_inserer($formulaire_actuel, $info_saisie); } return $formulaire_actuel; diff --git a/formulaires/saisies_cvt.php b/formulaires/saisies_cvt.php index ac5eb147..c71bb7bc 100644 --- a/formulaires/saisies_cvt.php +++ b/formulaires/saisies_cvt.php @@ -1,9 +1,11 @@ 'input', @@ -37,4 +39,3 @@ function formulaires_saisies_cvt_saisies_dist(){ ) ); } - diff --git a/inc/saisies.php b/inc/saisies.php index 53853efd..ad7a3e8d 100644 --- a/inc/saisies.php +++ b/inc/saisies.php @@ -1,517 +1,512 @@ - array('form' => $form, 'args' => $args), - 'data' => $saisies - ) - ) - // Si c'est toujours un tableau après le pipeline - and is_array($saisies) - ){ - return $saisies; - } - else{ - return false; - } -} - -/** - * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin - * - * @param array $saisies Un tableau décrivant les saisies - * @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 - * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin - * @return array Retourne soit la saisie, soit son chemin, soit null - */ -function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){ - - if (is_array($saisies) and $id_ou_nom_ou_chemin){ - if (is_string($id_ou_nom_ou_chemin)){ - $nom = $id_ou_nom_ou_chemin; - // identifiant ? premier caractere @ - $id = ($nom[0] == '@'); - - foreach($saisies as $cle => $saisie){ - $chemin = array($cle); - // notre saisie est la bonne ? - if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) { - return $retourner_chemin ? $chemin : $saisie; - // sinon a telle des enfants ? et si c'est le cas, cherchons dedans - } elseif (isset($saisie['saisies']) and is_array($saisie['saisies']) and $saisie['saisies'] - and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) { - return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour; - } - - } - } - elseif (is_array($id_ou_nom_ou_chemin)){ - $chemin = $id_ou_nom_ou_chemin; - $saisie = $saisies; - // On vérifie l'existence quand même - foreach ($chemin as $cle){ - if (isset($saisie[$cle])) $saisie = $saisie[$cle]; - else return null; - } - // Si c'est une vraie saisie - if ($saisie['saisie'] and $saisie['options']['nom']) - return $retourner_chemin ? $chemin : $saisie; - } - } - - return null; -} - -/** - * Génère un nom unique pour un champ d'un formulaire donné - * - * @param array $formulaire - * Le formulaire à analyser - * @param string $type_saisie - * Le type de champ dont on veut un identifiant - * @return string - * Un nom unique par rapport aux autres champs du formulaire - */ -function saisies_generer_nom($formulaire, $type_saisie){ - $champs = saisies_lister_champs($formulaire); - - // Tant que type_numero existe, on incrémente le compteur - $compteur = 1; - while (array_search($type_saisie.'_'.$compteur, $champs) !== false) - $compteur++; - - // On a alors un compteur unique pour ce formulaire - return $type_saisie.'_'.$compteur; -} - -/** - * Crée un identifiant Unique - * pour toutes les saisies donnees qui n'en ont pas - * - * @param Array $saisies Tableau de saisies - * @param Bool $regenerer Régénère un nouvel identifiant pour toutes les saisies ? - * @return Array Tableau de saisies complété des identifiants - */ -function saisies_identifier($saisies, $regenerer = false) { - if (!is_array($saisies)) { - return array(); - } - foreach ($saisies as $k => $saisie) { - $saisies[$k] = saisie_identifier($saisie, $regenerer); - } - return $saisies; -} - -/** - * Crée un identifiant Unique - * pour la saisie donnee si elle n'en a pas - * (et pour ses sous saisies éventuels) - * - * @param Array $saisie Tableau d'une saisie - * @param Bool $regenerer Régénère un nouvel identifiant pour la saisie ? - * @return Array Tableau de la saisie complété de l'identifiant -**/ -function saisie_identifier($saisie, $regenerer = false) { - if (!isset($saisie['identifiant']) OR !$saisie['identifiant']) { - $saisie['identifiant'] = uniqid('@'); - } elseif ($regenerer) { - $saisie['identifiant'] = uniqid('@'); - } - if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) { - $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer); - } - return $saisie; -} - -/** - * Vérifier tout un formulaire tel que décrit avec les Saisies - * - * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies - * @param bool $saisies_masquees_nulles Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a NULL. Cette valeur NULL est transmise à traiter (via set_request). - * @return array Retourne un tableau d'erreurs - */ -function saisies_verifier($formulaire, $saisies_masquees_nulles=true){ - include_spip('inc/verifier'); - $erreurs = array(); - $verif_fonction = charger_fonction('verifier','inc',true); - - if ($saisies_masquees_nulles) - $formulaire = saisies_verifier_afficher_si($formulaire); - - $saisies = saisies_lister_par_nom($formulaire); - foreach ($saisies as $saisie){ - $obligatoire = isset($saisie['options']['obligatoire']) ? $saisie['options']['obligatoire'] : ''; - $champ = $saisie['options']['nom']; - $file = ($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file'); - $verifier = isset($saisie['verifier']) ? $saisie['verifier'] : false; - - // Si le nom du champ est un tableau indexé, il faut parser ! - if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)){ - $valeur = _request($separe[1]); - preg_match_all('/\[([\w]+)\]/', $separe[2], $index); - // On va chercher au fond du tableau - foreach($index[1] as $cle){ - $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null; - } - } - // Sinon la valeur est juste celle du nom - else - $valeur = _request($champ); - - // Pour la saisie "destinataires" il faut filtrer si jamais on a mis un premier choix vide - if ($saisie['saisie'] == 'destinataires') { - $valeur = array_filter($valeur); - } - - // On regarde d'abord si le champ est obligatoire - if ($obligatoire - and $obligatoire != 'non' - and ( - ($file and !$_FILES[$champ]['name']) - or (!$file and ( - is_null($valeur) - or (is_string($valeur) and trim($valeur) == '') - or (is_array($valeur) and count($valeur) == 0) - )) - ) - ) { - $erreurs[$champ] = - (isset($saisie['options']['erreur_obligatoire']) and $saisie['options']['erreur_obligatoire']) - ? $saisie['options']['erreur_obligatoire'] - : _T('info_obligatoire'); - } - - // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif - if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verif_fonction){ - $normaliser = null; - // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur - $options = isset($verifier['options']) ? $verifier['options'] : array(); - if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) { - $erreurs[$champ] = $erreur_eventuelle; - // S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST - } elseif (!is_null($normaliser)) { - set_request($champ, $normaliser); - } - } - } - - return $erreurs; -} - -/** - * Applatie une description tabulaire - * @param string $tab Le tableau à aplatir - * @return $nouveau_tab - */ -function saisies_aplatir_tableau($tab){ - $nouveau_tab = array(); - foreach($tab as $entree=>$contenu){ - if (is_array($contenu)) { - foreach ($contenu as $cle => $valeur) { - $nouveau_tab[$cle] = $valeur; - } - } else { - $nouveau_tab[$entree] = $contenu; - } - } - return $nouveau_tab; -} - -/** - * Applatie une description chaînée, en supprimant les sous-groupes. - * @param string $chaine La chaîne à aplatir - * @return $chaine - */ -function saisies_aplatir_chaine($chaine){ - return trim(preg_replace("#(?:^|\n)(\*(?:.*)|/\*)\n#i","\n",$chaine)); -} - -/** - * Transforme une chaine en tableau avec comme principe : - * - * - une ligne devient une case - * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur - * - si la ligne commence par * alors on commence un sous-tableau - * - si la ligne est égale à /*, alors on fini le sous-tableau - * - * @param string $chaine Une chaine à transformer - * @param string $separateur Séparateur utilisé - * @return array Retourne un tableau PHP - */ -function saisies_chaine2tableau($chaine, $separateur="\n"){ - if ($chaine and is_string($chaine)){ - $tableau = array(); - $soustab = False; - // On découpe d'abord en lignes - $lignes = explode($separateur, $chaine); - foreach ($lignes as $i=>$ligne){ - $ligne = trim(trim($ligne), '|'); - // Si ce n'est pas une ligne sans rien - if ($ligne !== ''){ - // si ca commence par * c'est qu'on va faire un sous tableau - if (strpos($ligne,"*")===0) { - $soustab=True; - $soustab_cle = _T_ou_typo(substr($ligne,1), 'multi'); - if (!isset($tableau[$soustab_cle])){ - $tableau[$soustab_cle] = array(); - } - } - elseif ($ligne=="/*") {//si on finit sous tableau - $soustab=False; - } - else{//sinon c'est une entrée normale - // Si on trouve un découpage dans la ligne on fait cle|valeur - if (strpos($ligne, '|') !== false) { - list($cle,$valeur) = explode('|', $ligne, 2); - // permettre les traductions de valeurs au passage - if ($soustab == True){ - $tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi'); - } else { - $tableau[$cle] = _T_ou_typo($valeur, 'multi'); - } - } - // Sinon on génère la clé - else{ - if ($soustab == True) { - $tableau[$soustab_cle][$i] = _T_ou_typo($ligne,'multi'); - } else { - $tableau[$i] = _T_ou_typo($ligne,'multi'); - } - } - } - } - } - return $tableau; - } - // Si c'est déjà un tableau on lui applique _T_ou_typo (qui fonctionne de manière récursive avant de le renvoyer - elseif (is_array($chaine)){ - return _T_ou_typo($chaine, 'multi'); - } else { - return array(); - } -} - -/** - * Transforme un tableau en chaine de caractères avec comme principe : - * - * - une case de vient une ligne de la chaine - * - chaque ligne est générée avec la forme cle|valeur - * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef - * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau. - * - * @param array $tableau Tableau à transformer - * @return string Texte représentant les données du tableau - */ -function saisies_tableau2chaine($tableau){ - if ($tableau and is_array($tableau)){ - $chaine = ''; - $avant_est_tableau = False; - foreach($tableau as $cle=>$valeur){ - if (is_array($valeur)){ - $avant_est_tableau = True; - $ligne=trim("*$cle"); - $chaine .= "$ligne\n"; - $chaine .= saisies_tableau2chaine($valeur)."\n"; - } - else{ - if ($avant_est_tableau == True){ - $avant_est_tableau = False; - $chaine.="/*\n"; - } - $ligne = trim("$cle|$valeur"); - $chaine .= "$ligne\n"; - } - } - $chaine = trim($chaine); - - return $chaine; - } - // Si c'est déjà une chaine on la renvoie telle quelle - elseif (is_string($tableau)){ - return $tableau; - } - else{ - return ''; - } -} - - - - -/** - * Transforme une valeur en tableau d'élements si ce n'est pas déjà le cas - * - * @param mixed $valeur - * @return array Tableau de valeurs -**/ -function saisies_valeur2tableau($valeur) { - if (is_array($valeur)) { - return $valeur; - } - - if (!strlen($valeur)) { - return array(); - } - - $t = saisies_chaine2tableau($valeur); - if (count($t) > 1) { - return $t; - } - - // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule - // et a donc une cle est 0 dans ce cas la d'ailleurs - if (isset($t[0])) { - $t = saisies_chaine2tableau($t[0], ','); - } - - return $t; -} - - -/** - * Pour les saisies multiples (type checkbox) proposant un choix alternatif, - * retrouve à partir des data de choix proposés - * et des valeurs des choix enregistrés - * le texte enregistré pour le choix alternatif. - * - * @param array $data - * @param array $valeur - * @return string choix_alternatif -**/ -function saisies_trouver_choix_alternatif($data,$valeur) { - if (!is_array($valeur)) { - $valeur = saisies_chaine2tableau($valeur) ; - } - if (!is_array($data)) { - $data = saisies_chaine2tableau($data) ; - } - $choix_theorique = array_keys($data); - $choix_alternatif = array_values(array_diff($valeur,$choix_theorique)); - return $choix_alternatif[0];//on suppose que personne ne s'est amusé à proposer deux choix alternatifs -} - -/** - * Génère une page d'aide listant toutes les saisies et leurs options - * - * Retourne le résultat du squelette `inclure/saisies_aide` auquel - * on a transmis toutes les saisies connues. - * - * @return string Code HTML - */ -function saisies_generer_aide(){ - // On a déjà la liste par saisie - $saisies = saisies_lister_disponibles(); - - // On construit une liste par options - $options = array(); - foreach ($saisies as $type_saisie=>$saisie){ - $options_saisie = saisies_lister_par_nom($saisie['options'], false); - foreach ($options_saisie as $nom=>$option){ - // Si l'option n'existe pas encore - if (!isset($options[$nom])){ - $options[$nom] = _T_ou_typo($option['options']); - } - // On ajoute toujours par qui c'est utilisé - $options[$nom]['utilisee_par'][] = $type_saisie; - } - ksort($options_saisie); - $saisies[$type_saisie]['options'] = $options_saisie; - } - ksort($options); - - return recuperer_fond( - 'inclure/saisies_aide', - array( - 'saisies' => $saisies, - 'options' => $options - ) - ); -} - -/** - * Le tableau de saisies a-t-il une option afficher_si ? - * - * @param array $saisies Un tableau de saisies - * @return boolean - */ - -function saisies_afficher_si($saisies) { - $saisies = saisies_lister_par_nom($saisies,true); - // Dès qu'il y a au moins une option afficher_si, on l'active - foreach ($saisies as $saisie) { - if (isset($saisie['options']['afficher_si'])) - return true; - } - return false; -} - - -/** - * Le tableau de saisies a-t-il une option afficher_si_remplissage ? - * - * @param array $saisies Un tableau de saisies - * @return boolean - */ -function saisies_afficher_si_remplissage($saisies) { - $saisies = saisies_lister_par_nom($saisies,true); - // Dès qu'il y a au moins une option afficher_si_remplissage, on l'active - foreach ($saisies as $saisie) { - if (isset($saisie['options']['afficher_si_remplissage'])) - return true; - } - return false; -} - + array('form' => $form, 'args' => $args), + 'data' => $saisies + ) + ) + // Si c'est toujours un tableau après le pipeline + and is_array($saisies) + ) { + return $saisies; + } else { + return false; + } +} + +/** + * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin + * + * @param array $saisies Un tableau décrivant les saisies + * @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 + * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin + * @return array Retourne soit la saisie, soit son chemin, soit null + */ +function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin = false) { + if (is_array($saisies) and $id_ou_nom_ou_chemin) { + if (is_string($id_ou_nom_ou_chemin)) { + $nom = $id_ou_nom_ou_chemin; + // identifiant ? premier caractere @ + $id = ($nom[0] == '@'); + + foreach ($saisies as $cle => $saisie) { + $chemin = array($cle); + // notre saisie est la bonne ? + if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) { + return $retourner_chemin ? $chemin : $saisie; + // sinon a telle des enfants ? et si c'est le cas, cherchons dedans + } elseif (isset($saisie['saisies']) and is_array($saisie['saisies']) and $saisie['saisies'] + and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) { + return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour; + } + } + } elseif (is_array($id_ou_nom_ou_chemin)) { + $chemin = $id_ou_nom_ou_chemin; + $saisie = $saisies; + // On vérifie l'existence quand même + foreach ($chemin as $cle) { + if (isset($saisie[$cle])) { + $saisie = $saisie[$cle]; + } else { + return null; + } + } + // Si c'est une vraie saisie + if ($saisie['saisie'] and $saisie['options']['nom']) { + return $retourner_chemin ? $chemin : $saisie; + } + } + } + + return null; +} + +/** + * Génère un nom unique pour un champ d'un formulaire donné + * + * @param array $formulaire + * Le formulaire à analyser + * @param string $type_saisie + * Le type de champ dont on veut un identifiant + * @return string + * Un nom unique par rapport aux autres champs du formulaire + */ +function saisies_generer_nom($formulaire, $type_saisie) { + $champs = saisies_lister_champs($formulaire); + + // Tant que type_numero existe, on incrémente le compteur + $compteur = 1; + while (array_search($type_saisie.'_'.$compteur, $champs) !== false) { + $compteur++; + } + + // On a alors un compteur unique pour ce formulaire + return $type_saisie.'_'.$compteur; +} + +/** + * Crée un identifiant Unique + * pour toutes les saisies donnees qui n'en ont pas + * + * @param Array $saisies Tableau de saisies + * @param Bool $regenerer Régénère un nouvel identifiant pour toutes les saisies ? + * @return Array Tableau de saisies complété des identifiants + */ +function saisies_identifier($saisies, $regenerer = false) { + if (!is_array($saisies)) { + return array(); + } + foreach ($saisies as $k => $saisie) { + $saisies[$k] = saisie_identifier($saisie, $regenerer); + } + return $saisies; +} + +/** + * Crée un identifiant Unique + * pour la saisie donnee si elle n'en a pas + * (et pour ses sous saisies éventuels) + * + * @param Array $saisie Tableau d'une saisie + * @param Bool $regenerer Régénère un nouvel identifiant pour la saisie ? + * @return Array Tableau de la saisie complété de l'identifiant +**/ +function saisie_identifier($saisie, $regenerer = false) { + if (!isset($saisie['identifiant']) or !$saisie['identifiant']) { + $saisie['identifiant'] = uniqid('@'); + } elseif ($regenerer) { + $saisie['identifiant'] = uniqid('@'); + } + if (isset($saisie['saisies']) and is_array($saisie['saisies'])) { + $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer); + } + return $saisie; +} + +/** + * Vérifier tout un formulaire tel que décrit avec les Saisies + * + * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies + * @param bool $saisies_masquees_nulles Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a NULL. Cette valeur NULL est transmise à traiter (via set_request). + * @return array Retourne un tableau d'erreurs + */ +function saisies_verifier($formulaire, $saisies_masquees_nulles = true) { + include_spip('inc/verifier'); + $erreurs = array(); + $verif_fonction = charger_fonction('verifier', 'inc', true); + + if ($saisies_masquees_nulles) { + $formulaire = saisies_verifier_afficher_si($formulaire); + } + + $saisies = saisies_lister_par_nom($formulaire); + foreach ($saisies as $saisie) { + $obligatoire = isset($saisie['options']['obligatoire']) ? $saisie['options']['obligatoire'] : ''; + $champ = $saisie['options']['nom']; + $file = ($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file'); + $verifier = isset($saisie['verifier']) ? $saisie['verifier'] : false; + + // Si le nom du champ est un tableau indexé, il faut parser ! + if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) { + $valeur = _request($separe[1]); + preg_match_all('/\[([\w]+)\]/', $separe[2], $index); + // On va chercher au fond du tableau + foreach ($index[1] as $cle) { + $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null; + } + } else { + // Sinon la valeur est juste celle du nom + $valeur = _request($champ); + } + + // Pour la saisie "destinataires" il faut filtrer si jamais on a mis un premier choix vide + if ($saisie['saisie'] == 'destinataires') { + $valeur = array_filter($valeur); + } + + // On regarde d'abord si le champ est obligatoire + if ($obligatoire + and $obligatoire != 'non' + and ( + ($file and !$_FILES[$champ]['name']) + or (!$file and ( + is_null($valeur) + or (is_string($valeur) and trim($valeur) == '') + or (is_array($valeur) and count($valeur) == 0) + )) + ) + ) { + $erreurs[$champ] = + (isset($saisie['options']['erreur_obligatoire']) and $saisie['options']['erreur_obligatoire']) + ? $saisie['options']['erreur_obligatoire'] + : _T('info_obligatoire'); + } + + // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif + if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verif_fonction) { + $normaliser = null; + // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur + $options = isset($verifier['options']) ? $verifier['options'] : array(); + if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) { + $erreurs[$champ] = $erreur_eventuelle; + // S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST + } elseif (!is_null($normaliser)) { + set_request($champ, $normaliser); + } + } + } + + return $erreurs; +} + +/** + * Applatie une description tabulaire + * @param string $tab Le tableau à aplatir + * @return $nouveau_tab + */ +function saisies_aplatir_tableau($tab) { + $nouveau_tab = array(); + foreach ($tab as $entree => $contenu) { + if (is_array($contenu)) { + foreach ($contenu as $cle => $valeur) { + $nouveau_tab[$cle] = $valeur; + } + } else { + $nouveau_tab[$entree] = $contenu; + } + } + return $nouveau_tab; +} + +/** + * Applatie une description chaînée, en supprimant les sous-groupes. + * @param string $chaine La chaîne à aplatir + * @return $chaine + */ +function saisies_aplatir_chaine($chaine) { + return trim(preg_replace("#(?:^|\n)(\*(?:.*)|/\*)\n#i", "\n", $chaine)); +} + +/** + * Transforme une chaine en tableau avec comme principe : + * + * - une ligne devient une case + * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur + * - si la ligne commence par * alors on commence un sous-tableau + * - si la ligne est égale à /*, alors on fini le sous-tableau + * + * @param string $chaine Une chaine à transformer + * @param string $separateur Séparateur utilisé + * @return array Retourne un tableau PHP + */ +function saisies_chaine2tableau($chaine, $separateur = "\n") { + if ($chaine and is_string($chaine)) { + $tableau = array(); + $soustab = false; + // On découpe d'abord en lignes + $lignes = explode($separateur, $chaine); + foreach ($lignes as $i => $ligne) { + $ligne = trim(trim($ligne), '|'); + // Si ce n'est pas une ligne sans rien + if ($ligne !== '') { + // si ca commence par * c'est qu'on va faire un sous tableau + if (strpos($ligne, '*') === 0) { + $soustab=true; + $soustab_cle = _T_ou_typo(substr($ligne, 1), 'multi'); + if (!isset($tableau[$soustab_cle])) { + $tableau[$soustab_cle] = array(); + } + } elseif ($ligne == '/*') {//si on finit sous tableau + $soustab=false; + } else { + //sinon c'est une entrée normale + // Si on trouve un découpage dans la ligne on fait cle|valeur + if (strpos($ligne, '|') !== false) { + list($cle,$valeur) = explode('|', $ligne, 2); + // permettre les traductions de valeurs au passage + if ($soustab == true) { + $tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi'); + } else { + $tableau[$cle] = _T_ou_typo($valeur, 'multi'); + } + } else { + // Sinon on génère la clé + if ($soustab == true) { + $tableau[$soustab_cle][$i] = _T_ou_typo($ligne, 'multi'); + } else { + $tableau[$i] = _T_ou_typo($ligne, 'multi'); + } + } + } + } + } + return $tableau; + } elseif (is_array($chaine)) { + // Si c'est déjà un tableau on lui applique _T_ou_typo (qui fonctionne de manière récursive avant de le renvoyer + return _T_ou_typo($chaine, 'multi'); + } else { + return array(); + } +} + +/** + * Transforme un tableau en chaine de caractères avec comme principe : + * + * - une case de vient une ligne de la chaine + * - chaque ligne est générée avec la forme cle|valeur + * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef + * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau. + * + * @param array $tableau Tableau à transformer + * @return string Texte représentant les données du tableau + */ +function saisies_tableau2chaine($tableau) { + if ($tableau and is_array($tableau)) { + $chaine = ''; + $avant_est_tableau = false; + foreach ($tableau as $cle => $valeur) { + if (is_array($valeur)) { + $avant_est_tableau = true; + $ligne=trim("*$cle"); + $chaine .= "$ligne\n"; + $chaine .= saisies_tableau2chaine($valeur)."\n"; + } else { + if ($avant_est_tableau == true) { + $avant_est_tableau = false; + $chaine.="/*\n"; + } + $ligne = trim("$cle|$valeur"); + $chaine .= "$ligne\n"; + } + } + $chaine = trim($chaine); + + return $chaine; + } elseif (is_string($tableau)) { + // Si c'est déjà une chaine on la renvoie telle quelle + return $tableau; + } else { + return ''; + } +} + +/** + * Transforme une valeur en tableau d'élements si ce n'est pas déjà le cas + * + * @param mixed $valeur + * @return array Tableau de valeurs +**/ +function saisies_valeur2tableau($valeur) { + if (is_array($valeur)) { + return $valeur; + } + + if (!strlen($valeur)) { + return array(); + } + + $t = saisies_chaine2tableau($valeur); + if (count($t) > 1) { + return $t; + } + + // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule + // et a donc une cle est 0 dans ce cas la d'ailleurs + if (isset($t[0])) { + $t = saisies_chaine2tableau($t[0], ','); + } + + return $t; +} + +/** + * Pour les saisies multiples (type checkbox) proposant un choix alternatif, + * retrouve à partir des data de choix proposés + * et des valeurs des choix enregistrés + * le texte enregistré pour le choix alternatif. + * + * @param array $data + * @param array $valeur + * @return string choix_alternatif +**/ +function saisies_trouver_choix_alternatif($data, $valeur) { + if (!is_array($valeur)) { + $valeur = saisies_chaine2tableau($valeur) ; + } + if (!is_array($data)) { + $data = saisies_chaine2tableau($data) ; + } + $choix_theorique = array_keys($data); + $choix_alternatif = array_values(array_diff($valeur, $choix_theorique)); + return $choix_alternatif[0];//on suppose que personne ne s'est amusé à proposer deux choix alternatifs +} + +/** + * Génère une page d'aide listant toutes les saisies et leurs options + * + * Retourne le résultat du squelette `inclure/saisies_aide` auquel + * on a transmis toutes les saisies connues. + * + * @return string Code HTML + */ +function saisies_generer_aide() { + // On a déjà la liste par saisie + $saisies = saisies_lister_disponibles(); + + // On construit une liste par options + $options = array(); + foreach ($saisies as $type_saisie => $saisie) { + $options_saisie = saisies_lister_par_nom($saisie['options'], false); + foreach ($options_saisie as $nom => $option) { + // Si l'option n'existe pas encore + if (!isset($options[$nom])) { + $options[$nom] = _T_ou_typo($option['options']); + } + // On ajoute toujours par qui c'est utilisé + $options[$nom]['utilisee_par'][] = $type_saisie; + } + ksort($options_saisie); + $saisies[$type_saisie]['options'] = $options_saisie; + } + ksort($options); + + return recuperer_fond( + 'inclure/saisies_aide', + array( + 'saisies' => $saisies, + 'options' => $options + ) + ); +} + +/** + * Le tableau de saisies a-t-il une option afficher_si ? + * + * @param array $saisies Un tableau de saisies + * @return boolean + */ + +function saisies_afficher_si($saisies) { + $saisies = saisies_lister_par_nom($saisies, true); + // Dès qu'il y a au moins une option afficher_si, on l'active + foreach ($saisies as $saisie) { + if (isset($saisie['options']['afficher_si'])) { + return true; + } + } + return false; +} + + +/** + * Le tableau de saisies a-t-il une option afficher_si_remplissage ? + * + * @param array $saisies Un tableau de saisies + * @return boolean + */ +function saisies_afficher_si_remplissage($saisies) { + $saisies = saisies_lister_par_nom($saisies, true); + // Dès qu'il y a au moins une option afficher_si_remplissage, on l'active + foreach ($saisies as $saisie) { + if (isset($saisie['options']['afficher_si_remplissage'])) { + return true; + } + } + return false; +} diff --git a/inc/saisies_afficher.php b/inc/saisies_afficher.php index 4e7e3488..88aa017b 100644 --- a/inc/saisies_afficher.php +++ b/inc/saisies_afficher.php @@ -155,9 +155,8 @@ function saisies_generer_html($champ, $env = array()) { } $contexte = array_merge($env, $contexte); - } - // Sinon on ne sélectionne que quelques éléments importants - else { + } else { + // Sinon on ne sélectionne que quelques éléments importants // On récupère la liste des erreurs $contexte['erreurs'] = $env['erreurs']; // On récupère la langue de l'objet si existante @@ -177,13 +176,11 @@ function saisies_generer_html($champ, $env = array()) { foreach ($index[1] as $cle) { $contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null; } - } - // Sinon la valeur est juste celle du nom si elle existe - elseif (isset($contexte['nom']) and isset($env[$contexte['nom']])) { + } elseif (isset($contexte['nom']) and isset($env[$contexte['nom']])) { + // Sinon la valeur est juste celle du nom si elle existe $contexte['valeur'] = $env[$contexte['nom']]; - } - // Sinon rien - else { + } else { + // Sinon rien $contexte['valeur'] = null; } @@ -268,18 +265,16 @@ function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array() // On regarde en priorité s'il y a un tableau listant toutes les valeurs if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])) { $contexte['valeur'] = $env['valeurs'][$contexte['nom']]; - } - // Si le nom du champ est un tableau indexé, il faut parser ! - elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)) { + } elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)) { + // Si le nom du champ est un tableau indexé, il faut parser ! $contexte['valeur'] = $env[$separe[1]]; preg_match_all('/\[([\w]+)\]/', $separe[2], $index); // On va chercher au fond du tableau foreach ($index[1] as $cle) { $contexte['valeur'] = $contexte['valeur'][$cle]; } - } - // Sinon la valeur est juste celle du nom - else { + } else { + // Sinon la valeur est juste celle du nom // certains n'ont pas de nom (fieldset) $contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : ''; } diff --git a/inc/saisies_manipuler.php b/inc/saisies_manipuler.php index e4983902..0894e067 100644 --- a/inc/saisies_manipuler.php +++ b/inc/saisies_manipuler.php @@ -140,17 +140,15 @@ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) { if (!$ou) { $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin); $chemin = array(count($saisies)); - } - // Si l'endroit est entre crochet, c'est un conteneur - elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)) { + } elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)) { + // Si l'endroit est entre crochet, c'est un conteneur $parent = $match[1]; // Si dans les crochets il n'y a rien, on met à la fin du formulaire if (!$parent) { $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin); $chemin = array(count($saisies)); - } - // Sinon on vérifie que ce conteneur existe - elseif (saisies_chercher($saisies, $parent, true)) { + } elseif (saisies_chercher($saisies, $parent, true)) { + // Sinon on vérifie que ce conteneur existe // S'il existe on supprime la saisie et on recherche la nouvelle position $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin); $parent = saisies_chercher($saisies, $parent, true); @@ -158,9 +156,8 @@ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) { } else { $chemin = false; } - } - // Sinon ça sera devant un champ - else { + } else { + // Sinon ça sera devant un champ // On vérifie que le champ existe if (saisies_chercher($saisies, $ou, true)) { // S'il existe on supprime la saisie @@ -205,8 +202,7 @@ function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs) { $modifs['options']['nom'] = $parent[$position]['options']['nom']; } // On récupère les enfants tels quels s'il n'y a pas des enfants dans la modif - if ( - !isset($modifs['saisies']) + if (!isset($modifs['saisies']) and isset($parent[$position]['saisies']) and is_array($parent[$position]['saisies']) ) { diff --git a/inclure/configurer_saisie_fonctions.php b/inclure/configurer_saisie_fonctions.php index da20293d..07e988f6 100644 --- a/inclure/configurer_saisie_fonctions.php +++ b/inclure/configurer_saisie_fonctions.php @@ -1,17 +1,20 @@ 'input', 'options' => array( @@ -28,10 +31,9 @@ function construire_configuration_saisie($saisie, $avec_nom='non'){ ) ) ); - } - else + } + } else { $configuration_saisie = array(); - + } return $configuration_saisie; } - diff --git a/saisies-vues/selecteur_article_fonctions.php b/saisies-vues/selecteur_article_fonctions.php index 5556cf98..9dbb831c 100644 --- a/saisies-vues/selecteur_article_fonctions.php +++ b/saisies-vues/selecteur_article_fonctions.php @@ -1,3 +1,7 @@ 3 OR ($version[0]==3 AND $version[1]>0)) + static $is_div = null; + if (is_null($is_div)) { + $version = explode('.', $GLOBALS['spip_version_branche']); + if ($version[0] > 3 or ($version[0] == 3 and $version[1] > 0)) { $is_div = true; + } + } + if ($is_div) { + return 'div'; } - if ($is_div) return "div"; return $tag; } // variante plus simple a ecrire dans les squelettes // [(#DIV|sinon{ul})] if (!function_exists('balise_DIV_dist') - and $version = explode(".",$GLOBALS['spip_version_branche']) - and ($version[0]>3 OR ($version[0]==3 AND $version[1]>0))){ - function balise_DIV_dist($p){ + and $version = explode('.', $GLOBALS['spip_version_branche']) + and ($version[0]>3 or ($version[0]==3 and $version[1] > 0))) { + function balise_DIV_dist($p) { $p->code = "'div'"; $p->interdire_scripts = false; return $p; @@ -59,11 +64,13 @@ if (!function_exists('balise_DIV_dist') * @param string|array $env * @return string */ -function saisie_traitement_vue($valeur,$env){ - if (is_string($env)) +function saisie_traitement_vue($valeur, $env) { + if (is_string($env)) { $env = unserialize($env); - if (!function_exists('propre')) + } + if (!function_exists('propre')) { include_spip('inc/texte'); + } $valeur = trim($valeur); @@ -73,9 +80,8 @@ function saisie_traitement_vue($valeur,$env){ if ($valeur and !isset($env['traitements'])) { if (in_array($env['type_saisie'], array('textarea'))) { $valeur = propre($valeur); - } - else { - $valeur = "

" . typo($valeur) . "

"; + } else { + $valeur = '

' . typo($valeur) . '

'; } } @@ -84,7 +90,7 @@ function saisie_traitement_vue($valeur,$env){ /** * Passer un nom en une valeur compatible avec une classe css - * + * * - toto => toto, * - toto/truc => toto_truc, * - toto[truc] => toto_truc @@ -98,7 +104,7 @@ function saisie_nom2classe($nom) { /** * Passer un nom en une valeur compatible avec un `name` de formulaire - * + * * - toto => toto, * - toto/truc => toto[truc], * - toto[truc] => toto[truc] @@ -123,24 +129,25 @@ function saisie_nom2name($nom) { * ``` * #GLOBALS{debut_intertitre} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code php de la balise. **/ function balise_GLOBALS_dist($p) { - if (function_exists('balise_ENV')) + if (function_exists('balise_ENV')) { return balise_ENV($p, '$GLOBALS'); - else + } else { return balise_ENV_dist($p, '$GLOBALS'); + } } /** * Liste les éléments du sélecteur générique triés * * Les éléments sont triés par objets puis par identifiants - * + * * @example * L'entrée : * 'rubrique|3,rubrique|5,article|2' @@ -178,7 +185,7 @@ function picker_selected_par_objet($selected) { // on remet tout en file $liste = array(); - foreach ($res as $objet=>$ids) { + foreach ($res as $objet => $ids) { foreach ($ids as $id) { $liste[] = array('objet' => $objet, 'id_objet' => $id); } @@ -197,19 +204,18 @@ function picker_selected_par_objet($selected) { * 'url_edit' : l'url d'édition de l'objet ; * 'texte_objets' : le nom humain de l'objet éditorial. */ -function lister_tables_objets_edit() -{ - include_spip('base/abstract_sql'); +function lister_tables_objets_edit() { + include_spip('base/abstract_sql'); - $objets = lister_tables_objets_sql(); - $objets_edit = array(); + $objets = lister_tables_objets_sql(); + $objets_edit = array(); - foreach ($objets as $objet => $definition) { - if (isset($definition['editable']) and isset($definition['url_edit']) and $definition['url_edit'] != '') { - $objets_edit[$objet] = array('type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']); - } - } - $objets_edit = array_filter($objets_edit); + foreach ($objets as $objet => $definition) { + if (isset($definition['editable']) and isset($definition['url_edit']) and $definition['url_edit'] != '') { + $objets_edit[$objet] = array('type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']); + } + } + $objets_edit = array_filter($objets_edit); - return $objets_edit; + return $objets_edit; } diff --git a/saisies_options.php b/saisies_options.php index 53401a02..390b5bc7 100644 --- a/saisies_options.php +++ b/saisies_options.php @@ -7,15 +7,16 @@ **/ // Sécurité -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Pouvoir forcer l'utilisation de formulaire de type SPIP 3 if (!defined('_SAISIE_TAG_3')) { define('_SAISIE_TAG_3', false); } - -if (!function_exists('_T_ou_typo')){ +if (!function_exists('_T_ou_typo')) { /** * une fonction qui regarde si $texte est une chaine de langue * de la forme <:qqch:> @@ -29,26 +30,26 @@ if (!function_exists('_T_ou_typo')){ * @return mixed * Retourne la valeur éventuellement modifiée. */ - function _T_ou_typo($valeur, $mode_typo='toujours') { + function _T_ou_typo($valeur, $mode_typo = 'toujours') { // Si la valeur est bien une chaine (et pas non plus un entier déguisé) - if (is_string($valeur) and !intval($valeur)){ + if (is_string($valeur) and !intval($valeur)) { // Si la chaine est du type <:truc:> on passe à _T() - if (preg_match('/^\<:(.*?):\>$/', $valeur, $match)) + if (preg_match('/^\<:(.*?):\>$/', $valeur, $match)) { $valeur = _T($match[1]); - // Sinon on la passe a typo() - else { - if (!in_array($mode_typo, array('toujours', 'multi', 'jamais'))) + } else { + // Sinon on la passe a typo() + if (!in_array($mode_typo, array('toujours', 'multi', 'jamais'))) { $mode_typo = 'toujours'; - - if ($mode_typo == 'toujours' or ($mode_typo == 'multi' and strpos($valeur, '') !== false)){ + } + + if ($mode_typo == 'toujours' or ($mode_typo == 'multi' and strpos($valeur, '') !== false)) { include_spip('inc/texte'); $valeur = typo($valeur); } } - } - // Si c'est un tableau, on reapplique la fonction récursivement - elseif (is_array($valeur)){ - foreach ($valeur as $cle => $valeur2){ + } elseif (is_array($valeur)) { + // Si c'est un tableau, on reapplique la fonction récursivement + foreach ($valeur as $cle => $valeur2) { $valeur[$cle] = _T_ou_typo($valeur2, $mode_typo); } } @@ -56,4 +57,3 @@ if (!function_exists('_T_ou_typo')){ return $valeur; } } - diff --git a/saisies_pipelines.php b/saisies_pipelines.php index ef945048..3c76b480 100644 --- a/saisies_pipelines.php +++ b/saisies_pipelines.php @@ -7,15 +7,17 @@ **/ // Sécurité -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Ajoute les scripts JS et CSS de saisies dans l'espace privé * - * @param string $flux + * @param string $flux * @return string **/ -function saisies_header_prive($flux){ +function saisies_header_prive($flux) { $js = find_in_path('javascript/saisies.js'); $flux .= "\n\n"; $css = generer_url_public('saisies.css'); @@ -30,39 +32,38 @@ function saisies_header_prive($flux){ * * Ajoute également de quoi gérer le datepicker de la saisie date si * celle-ci est utilisée dans la page. - * - * @param string $flux + * + * @param string $flux * @return string **/ -function saisies_affichage_final($flux){ - if ( - $GLOBALS['html'] // si c'est bien du HTML - and ($p = strpos($flux,"")) !== false // et qu'on a au moins une saisie - and strpos($flux,' quelque part - ){ +function saisies_affichage_final($flux) { + if ($GLOBALS['html'] // si c'est bien du HTML + and ($p = strpos($flux, '')) !== false // et qu'on a au moins une saisie + and strpos($flux, ' quelque part + ) { // On insère la CSS devant le premier trouvé - if (!$pi = strpos($flux, " de saisies } $css = generer_url_public('saisies.css'); $ins_css = "\n\n"; - if (strpos($flux,"saisie_date")!==false){//si on a une saisie de type date, on va charger les css de jquery_ui - include_spip("jqueryui_pipelines"); - if (function_exists("jqueryui_dependances")){ - $ui_plugins = jqueryui_dependances(array("jquery.ui.datepicker")); - $theme_css = "jquery.ui.theme"; - $ui_css_dir = "css"; + if (strpos($flux, 'saisie_date') !==false) {//si on a une saisie de type date, on va charger les css de jquery_ui + include_spip('jqueryui_pipelines'); + if (function_exists('jqueryui_dependances')) { + $ui_plugins = jqueryui_dependances(array('jquery.ui.datepicker')); + $theme_css = 'jquery.ui.theme'; + $ui_css_dir = 'css'; // compatibilité SPIP 3.1 et jQuery UI 1.11 - $version = explode(".",$GLOBALS['spip_version_branche']); - if ($version[0]>3 OR ($version[0]==3 AND $version[1]>0)) { - $theme_css = "theme"; - $ui_css_dir = "css/ui"; + $version = explode('.', $GLOBALS['spip_version_branche']); + if ($version[0] > 3 or ($version[0] == 3 and $version[1] > 0)) { + $theme_css = 'theme'; + $ui_css_dir = 'css/ui'; } - array_push($ui_plugins,$theme_css); - foreach ($ui_plugins as $ui_plug){ + array_push($ui_plugins, $theme_css); + foreach ($ui_plugins as $ui_plug) { $ui_plug_css = find_in_path("$ui_css_dir/$ui_plug.css"); - if (strpos($flux,"$ui_css_dir/$ui_plug.css")===false){// si pas déjà chargé + if (strpos($flux, "$ui_css_dir/$ui_plug.css") === false) {// si pas déjà chargé $ins_css .= "\n\n"; } } @@ -86,13 +87,13 @@ function saisies_affichage_final($flux){ * Recherche une fonction `formulaires_XX_saisies_dist` et l'utilise si elle * est présente. Cette fonction doit retourner une liste de saisies dont on se * sert alors pour calculer les champs utilisés dans le formulaire. - * - * @param array $flux + * + * @param array $flux * @return array **/ -function saisies_formulaire_charger($flux){ +function saisies_formulaire_charger($flux) { // Si le flux data est inexistant, on quitte : Le CVT d'origine a décidé de ne pas continuer - if (!is_array($flux['data'])){ + if (!is_array($flux['data'])) { return $flux; } @@ -118,15 +119,15 @@ function saisies_formulaire_charger($flux){ * qu'il n'y a pas de squelette spécifique pour afficher le HTML du formulaire, * alors on utilise le formulaire générique intégré au plugin saisie, qui calculera le HTML * à partir de la déclaration des saisies indiquées. - * + * * @see saisies_formulaire_charger() - * + * * @param array $flux * @return array **/ -function saisies_styliser($flux){ +function saisies_styliser($flux) { // Si on cherche un squelette de formulaire - if (strncmp($flux['args']['fond'],'formulaires/',12)==0 + if (strncmp($flux['args']['fond'], 'formulaires/', 12) == 0 // Et qu'il y a des saisies dans le contexte and isset($flux['args']['contexte']['_saisies']) // Et que le fichier choisi est vide ou n'existe pas @@ -134,7 +135,7 @@ function saisies_styliser($flux){ and $ext = $flux['args']['ext'] and lire_fichier($flux['data'].'.'.$ext, $contenu_squelette) and !trim($contenu_squelette) - ){ + ) { $flux['data'] = preg_replace("/\.$ext$/", '', find_in_path("formulaires/inc-saisies-cvt.$ext")); } @@ -149,25 +150,24 @@ function saisies_styliser($flux){ * * @see saisies_formulaire_charger() * @uses saisies_verifier() - * + * * @param array $flux * Liste des erreurs du formulaire * @return array * iste des erreurs */ -function saisies_formulaire_verifier($flux){ +function saisies_formulaire_verifier($flux) { // Il faut que la fonction existe et qu'elle retourne bien un tableau include_spip('inc/saisies'); $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']); if ($saisies) { // On ajoute au contexte les champs à déclarer $erreurs = saisies_verifier($saisies); - if ($erreurs and !isset($erreurs['message_erreur'])) + if ($erreurs and !isset($erreurs['message_erreur'])) { $erreurs['message_erreur'] = _T('saisies:erreur_generique'); + } $flux['data'] = array_merge($erreurs, $flux['data']); } return $flux; } - -