/** * Déplace une saisie existante autre part * * @param array $saisies Un tableau décrivant les saisies * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer * @param string $ou Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur] * @return array Retourne le tableau modifié des saisies */ function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) { // On récupère le contenu de la saisie à déplacer $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin); // Si on l'a bien trouvé if ($saisie) { // On cherche l'endroit où la déplacer // Si $ou est vide, c'est à la fin de la racine if (!$ou) { $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin); $chemin = array(count($saisies)); } elseif (preg_match('/^\\[(@?[\\w]*)\\]$/', $ou, $match)) { $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)); } elseif (saisies_chercher($saisies, $parent, true)) { // 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); $chemin = array_merge($parent, array('saisies', 1000000)); } else { $chemin = false; } } else { // On vérifie que le champ existe if (saisies_chercher($saisies, $ou, true)) { // S'il existe on supprime la saisie $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin); // Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie $chemin = saisies_chercher($saisies, $ou, true); } else { $chemin = false; } } // Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace if ($chemin) { $saisies = saisies_inserer($saisies, $saisie, $chemin); } } return $saisies; }
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')){ $formulaire_actuel = saisies_groupe_inserer($formulaire_actuel, $ajouter_saisie); } // Si on demande à ajouter une saisie if ($ajouter_saisie = _request('ajouter_saisie')){ $nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie); $saisie = array( 'saisie' => $ajouter_saisie, 'options' => array( 'nom' => $nom ) ); // 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)){ $defaut = _T_ou_typo($defaut, 'multi'); //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) { // create new key in $array, if it is empty or not an array 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)) { $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)) { return $array; } for ($i = 1; $i < count($args); $i++) { if (is_array($args[$i])) { $array = recurse($array, $args[$i]); } } return $array; } } $saisie = array_replace_recursive($saisie, $defaut); } $formulaire_actuel = saisies_inserer($formulaire_actuel, $saisie); } // Si on demande à dupliquer une saisie if ($dupliquer_saisie = _request('dupliquer_saisie')) { $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie); } // Si on demande à supprimer une 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')){ // 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'])){ $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) $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']) != '') { $saisie_modifiee['verifier'] = array( 'type' => $type_verif, 'options' => $saisie_modifiee['verifier'][$type_verif] ); } else { unset($saisie_modifiee['verifier']); } // On récupère les options postées en enlevant les chaines vides $saisie_modifiee['options'] = array_filter($saisie_modifiee['options'], 'saisie_option_contenu_vide'); 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'])) 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'){ $formulaire_actuel = $formulaire_initial; } // On enregistre en session la nouvelle version du formulaire session_set($identifiant, $formulaire_actuel); // Le formulaire reste éditable $retours['editable'] = true; return $retours; }