/** * Action de déplacement de saisies dans le constructeur de formulaires * * @return void **/ function action_deplacer_saisie_dist() { include_spip('inc/session'); $session = _request('session'); $identifiant = _request('saisie'); $ou = _request('ou'); // On récupère le formulaire à son état actuel $formulaire_actuel = session_get($session); if (!$formulaire_actuel) { return ''; } include_spip('inc/saisies'); $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel); if (!isset($saisies_actuelles[$identifiant])) { return ''; } // tester @id et [@id] (fieldset) if ($ou and !isset($saisies_actuelles[$ou]) and !isset($saisies_actuelles[substr($ou, 1, -1)])) { return ''; } // on deplace ou c'est demande... $formulaire_actuel = saisies_deplacer($formulaire_actuel, $identifiant, $ou); // On sauve tout ca $formulaire_actuel = session_set($session, $formulaire_actuel); }
function formulaires_editer_champs_extras_traiter_dist($objet, $redirect = '') { $retour = array('redirect' => $redirect); $table = table_objet_sql($objet); include_spip('inc/iextras'); $saisies = iextras_champs_extras_definis($table); $nouvelles_saisies = session_get('constructeur_formulaire_champs_extras_' . $table); $diff = saisies_comparer_par_identifiant($saisies, $nouvelles_saisies); $extras = array(); include_spip('inc/cextras'); // supprimer les champs supprimes champs_extras_supprimer($table, $diff['supprimees']); // ajouter les nouveaux champs; champs_extras_creer($table, $diff['ajoutees']); // modifier les champs modifies; if ($diff['modifiees']) { $anciennes = saisies_lister_par_identifiant($saisies); $anciennes = array_intersect_key($anciennes, $diff['modifiees']); champs_extras_modifier($table, $diff['modifiees'], $anciennes); } # champs_extras_modifier($table, # modifiees nouvelles, # modifiees anciennes); ecrire_meta("champs_extras_" . $table, serialize($nouvelles_saisies)); $retour['message_ok'] = 'Super !'; return $retour; }
/** * Prend la description complète du contenu d'un formulaire et retourne * les saisies "à plat" classées par identifiant unique. * * @param array $contenu Le contenu d'un formulaire * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets * * @return array Un tableau avec uniquement les saisies */ function saisies_lister_par_identifiant($contenu, $avec_conteneur = true) { $saisies = array(); if (is_array($contenu)) { foreach ($contenu as $ligne) { if (is_array($ligne)) { $enfants_presents = (isset($ligne['saisies']) and is_array($ligne['saisies'])); if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)) { $saisies[$ligne['identifiant']] = $ligne; } if ($enfants_presents) { $saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies'])); } } } } return $saisies; }
/** * Ajouter les saisies SQL et de recherche * sur les options de config d'une saisie (de champs extras) * * @param array * @return array **/ function iextras_formulaire_verifier($flux) { if ($flux['args']['form'] == 'construire_formulaire' AND strpos($flux['args']['args'][0], 'champs_extras_')===0 AND $nom_ou_id = _request('configurer_saisie') ) { // On ajoute le préfixe devant l'identifiant $identifiant = 'constructeur_formulaire_'.$flux['args']['args'][0]; // On récupère le formulaire à son état actuel $formulaire_actuel = session_get($identifiant); if ($nom_ou_id[0] == '@') { $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel); $name = $saisies_actuelles[$nom_ou_id]['options']['nom']; } else { $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel); $name = $nom_ou_id; } // saisie inexistante => on sort if (!isset($saisies_actuelles[$nom_ou_id])) { return $flux; } $nom = 'configurer_' . $name; $table = substr($flux['args']['args'][0], strlen('champs_extras_')); // on ajoute le fieldset de restrictions de champs // (des autorisations pre-reglées en quelque sorte) $saisies_restrictions = array(); // les restrictions de X ne peuvent apparaître que // si l'objet possede un Y. // secteurs -> id_secteur // branches -> id_rubrique // groupes -> id_groupe $desc = lister_tables_objets_sql($table); $types = array( 'secteurs' => 'id_secteur', 'branches' => 'id_rubrique', 'groupes' => 'id_groupe', ); foreach ($types as $type => $champ) { if (isset($desc['field'][$champ])) { $saisies_restrictions[] = array( 'saisie' => 'input', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][restrictions][$type]", 'label' => _T('iextras:label_restrictions_' . $type), 'explication' => _T('iextras:precisions_pour_restrictions_' . $type), 'defaut' => '', ) ); } } // ajout des restrictions voir | modifier par auteur $actions = array('voir', 'modifier'); foreach ($actions as $action) { $saisies_restrictions[] = array( 'saisie' => 'fieldset', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][restrictions][$action]", 'label' => _T('iextras:legend_restrictions_' . $action), ), 'saisies' => array( array( 'saisie' => 'radio', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][restrictions][$action][auteur]", 'label' => _T('iextras:label_restrictions_auteur'), 'defaut' => '', 'datas' => array( '' => _T('iextras:radio_restrictions_auteur_aucune'), 'admin' => _T('iextras:radio_restrictions_auteur_admin'), 'admin_complet' => _T('iextras:radio_restrictions_auteur_admin_complet'), 'webmestre' => _T('iextras:radio_restrictions_auteur_webmestre'), ) ) ) ) ); } $flux['data'][$nom] = saisies_inserer($flux['data'][$nom], array( 'saisie' => 'fieldset', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][restrictions]", 'label' => _T('iextras:legend_restriction'), ), 'saisies' => $saisies_restrictions )); // on récupère les informations de la saisie // pour savoir si c'est un champs éditable (il a une ligne SQL) // et dans ce cas, on ajoute les options techniques $type_saisie = $saisies_actuelles[$nom_ou_id]['saisie']; $saisies_sql = saisies_lister_disponibles_sql(); if (isset($saisies_sql[$type_saisie])) { // liste 'type_de_saisie' => 'Titre de la saisie' $liste_saisies = array(); foreach ($saisies_sql as $s=>$d) { $liste_saisies[$s] = $d['titre']; } $sql = $saisies_sql[$type_saisie]['defaut']['options']['sql']; $flux['data'][$nom] = saisies_inserer($flux['data'][$nom], array( 'saisie' => 'fieldset', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][options_techniques]", 'label' => _T('iextras:legend_options_techniques'), ), 'saisies' => array( array( 'saisie' => 'input', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][sql]", 'label' => _T('iextras:label_sql'), 'obligatoire' => 'oui', 'size' => 50, 'defaut' => $sql ) ), array( 'saisie' => 'oui_non', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][rechercher]", 'label' => _T('iextras:label_rechercher'), 'explication' => _T('iextras:precisions_pour_rechercher'), 'defaut' => '' ) ), array( 'saisie' => 'input', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][rechercher_ponderation]", 'label' => _T('iextras:label_rechercher_ponderation'), 'explication' => _T('iextras:precisions_pour_rechercher_ponderation'), 'defaut' => 2, 'afficher_si' => "@saisie_modifiee_${name}[options][rechercher]@ != ''", ) ), array( 'saisie' => 'radio', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][traitements]", 'label' => _T('iextras:label_traitements'), 'explication' => _T('iextras:precisions_pour_traitements'), 'defaut' => '', 'datas' => array( '' => _T('iextras:radio_traitements_aucun'), '_TRAITEMENT_TYPO' => _T('iextras:radio_traitements_typo'), '_TRAITEMENT_RACCOURCIS' => _T('iextras:radio_traitements_raccourcis'), ) ) ), array( 'saisie' => 'oui_non', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][versionner]", 'label' => _T('iextras:label_versionner'), 'explication' => _T('iextras:precisions_pour_versionner'), 'defaut' => '' ) ), array( 'saisie' => 'selection', 'options' => array( 'nom' => "saisie_modifiee_${name}[options][nouveau_type_saisie]", 'label' => _T('iextras:label_saisie'), 'explication' => _T('iextras:precisions_pour_nouvelle_saisie'), 'attention' => _T('iextras:precisions_pour_nouvelle_saisie_attention'), 'defaut' => $type_saisie, 'datas' => $liste_saisies ) ), ))); } } return $flux; }
function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial=array(), $options=array()){ include_spip('inc/saisies'); $erreurs = array(); // l'une ou l'autre sera presente $configurer_saisie = $enregistrer_saisie = ''; // Pas d'erreur si l'on ne demande rien if (!($nom_ou_id = $configurer_saisie = _request('configurer_saisie') OR $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))) { return $erreurs; } // 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); // On récupère les saisies actuelles, par identifiant ou par nom if ($nom_ou_id[0] == '@') { $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel); $nom = $saisies_actuelles[$nom_ou_id]['options']['nom']; } else { $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel); $nom = $nom_ou_id; } $noms_autorises = array_keys($saisies_actuelles); // le nom (ou identifiant) doit exister if (!in_array($nom_ou_id, $noms_autorises)) { return $erreurs; } // La liste des saisies $saisies_disponibles = saisies_lister_disponibles(); $saisie = $saisies_actuelles[$nom_ou_id]; $formulaire_config = $saisies_disponibles[$saisie['saisie']]['options']; array_walk_recursive($formulaire_config, 'formidable_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]"); $formulaire_config = saisie_identifier(array('saisies'=>$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']) { $formulaire_config = saisies_inserer( $formulaire_config, array( 'saisie' => 'hidden', 'options' => array( 'nom' => "saisie_modifiee_${nom}[identifiant]", 'defaut' => $saisie['identifiant'] ), ) ); } // 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)) { $chemin_nom[] = 'saisies'; $chemin_nom[] = '0'; $formulaire_config = saisies_inserer( $formulaire_config, array( 'saisie' => 'input', 'options' => array( 'nom' => "saisie_modifiee_${nom}[options][nom]", 'label' => _T('saisies:option_nom_label'), 'explication' => _T('saisies:option_nom_explication'), 'obligatoire' => 'oui', 'size' => 50 ), 'verifier' => array( 'type' => 'regex', 'options' => array( 'modele' => '/^[\w]+$/' ) ) ), $chemin_nom ); } // liste des options de vérification $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)){ 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', 'options' => array( 'nom' => "saisie_modifiee_${nom}[verifier][type]", 'label' => _T('saisies:construire_verifications_label'), 'option_intro' => _T('saisies:construire_verifications_aucune'), 'conteneur_class' => 'liste_verifications', 'datas' => array() ) ); 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'])){ $groupe = array( 'saisie' => 'fieldset', 'options' => array( 'nom' => 'options', 'label' => $verif['titre'], 'conteneur_class' => "$type_verif options_verifier" ), 'saisies' => $verif['options'] ); array_walk_recursive($groupe, 'formidable_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]"); $verif_options[$type_verif] = $groupe; } } $verif_options = array_merge(array($saisie_liste_verif), $verif_options); } 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']) { $nom_modifie = $saisie_modifiee['options']['nom']; 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]) { // 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){ $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation); } } $erreurs['configurer_'.$nom] = $formulaire_config; $erreurs['positionner'] = '#configurer_'.$nom; if ($enregistrer_saisie) { if ($vraies_erreurs) { $erreurs = array_merge($erreurs, $vraies_erreurs); } else { $erreurs = array(); } } else { $erreurs['message_erreur'] = ''; // on ne veut pas du message_erreur automatique } return $erreurs; }
/** * 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; }