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; }
/** * Importe une description de champs extras donnée * * @param array $description * description des champs extras (table sql => liste des champs extras) * @param string $message * message de retour, rempli par cette fonction * @param bool $fusionner_doublons * true si on fusionne les champs présents dans la sauvegarde et aussi présents sur le site. False pour les ignorer. * @return bool * true si tout s'est bien passé, false sinon **/ function iextras_importer_description($description, &$message, $fusionner_doublons = false) { include_spip('inc/iextras'); include_spip('inc/saisies'); include_spip('inc/texte'); include_spip('inc/cextras'); $tables_sql_presentes = array_keys(lister_tables_objets_sql()); $message = ''; $nbt = count($description); $message .= "{{Fichier importé :}}\n"; $message .= "- {$nbt} objets éditoriaux.\n"; $nbc = 0; foreach ($description as $table => $saisies) { $nbc += count($saisies); } $message .= "- {$nbc} champs extras.\n"; foreach ($description as $table => $saisies) { if (!in_array($table, $tables_sql_presentes)) { $message .= "\nTable {{ {$table} }} absente sur le site\n"; $message .= count($saisies) . " champs extras ignorés !!\n"; continue; } $champs_presents = $champs_futurs = iextras_champs_extras_definis($table); $champs_presents_par_nom = saisies_lister_par_nom($champs_presents); $objet = objet_type($table); $titre = _T(objet_info($objet, 'texte_objets')); $message .= "\n{{ {$titre} :}}\n"; $message .= count($saisies) . " champs extras\n"; foreach ($saisies as $saisie) { $nom = isset($saisie['options']['nom']) ? $saisie['options']['nom'] : ''; if (!$nom) { $message .= "- !! Saisie sans nom ignorée\n"; continue; } // champ déjà présent ? if (isset($champs_presents_par_nom[$nom])) { if ($fusionner_doublons) { $message .= "- {{ {$nom} :}} modifié (déjà présent)\n"; $champs_futurs = saisies_modifier($champs_futurs, $nom, $saisie); } else { $message .= "- {{ {$nom} :}} ignoré (déjà présent)\n"; } } else { $message .= "- {{ {$nom} :}} ajouté\n"; $champs_futurs = saisies_inserer($champs_futurs, $saisie); } } $diff = saisies_comparer_par_identifiant($champs_presents, $champs_futurs); // ajouter les nouveaux champs; if ($diff['ajoutees']) { $message .= count($diff['ajoutees']) . " champs ajoutés.\n"; champs_extras_creer($table, $diff['ajoutees']); } // modifier les champs modifies; if ($diff['modifiees']) { $message .= count($diff['modifiees']) . " champs modifiés.\n"; $anciennes = saisies_lister_par_identifiant($champs_presents); $anciennes = array_intersect_key($anciennes, $diff['modifiees']); champs_extras_modifier($table, $diff['modifiees'], $anciennes); } // enregistrer la nouvelle config if ($diff['ajoutees'] or $diff['modifiees']) { ecrire_meta("champs_extras_" . $table, serialize($champs_futurs)); } else { $message .= "Aucune modification !\n"; } } $message = propre($message); return true; }