function action_associer_champ_sql_comme_champ_extra($table, $champ) { // recuperer la description du champ include_spip('inc/cextras'); include_spip('inc/iextras'); $champs = extras_champs_anormaux(); if (isset($champs[$table][$champ])) { $sql = $champs[$table][$champ]; $saisies = iextras_champs_extras_definis($table); include_spip('inc/saisies'); $saisies_sql = saisies_lister_disponibles_sql(); $type_saisie = 'textarea'; $saisies = saisies_inserer($saisies, array('saisie' => $type_saisie, 'options' => array_merge($saisies_sql[$type_saisie]['defaut']['options'], array('nom' => $champ, 'label' => ucfirst($champ))))); // sauver ecrire_meta('champs_extras_' . $table, serialize($saisies)); // supprimer la session d'edition du formulaire pour le remettre a zero session_set('constructeur_formulaire_champs_extras_' . $table, null); } }
/** * 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; }
/** * 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 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"); //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) { $champ_options = 'options'; } if($formidable_yaml>0) { $champ_options = 'saisies'; } //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); $formulaire_actuel = saisies_inserer($formulaire_actuel, $info_saisie); } return $formulaire_actuel; }
/** * Ajouter les saisies SQL et de recherche * sur les options de config d'une saisie (de champs extras) * * @param array * @return array **/ function iextras_saisies_construire_formulaire_config($flux) { if (strpos($flux['args']['identifiant'], 'constructeur_formulaire_champs_extras_') === 0) { $table = substr($flux['args']['identifiant'], strlen('constructeur_formulaire_champs_extras_')); $name = $flux['args']['nom']; $formulaire_actuel = $flux['data']; $type_saisie = $flux['args']['saisie']['saisie']; // 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'] = saisies_inserer($flux['data'], 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 modifie le type de vérification du nom du champ (regexp > nom_champ_extra) // Cette vérification crée une erreur si le nom est déjà utilisé par SPIP ou un plugin, et si c'est un mot clé SQL // // - on ajoute les options techniques $saisies_sql = saisies_lister_disponibles_sql(); if (isset($saisies_sql[$type_saisie])) { // Modification du type de vérification // Normalement le premier champ du premier onglet if ($flux['data'][0]['saisies'][0]['verifier']['type'] == 'regex') { $flux['data'][0]['saisies'][0]['verifier']['type'] = 'nom_champ_extra'; $flux['data'][0]['saisies'][0]['verifier']['options']['table'] = $table; } // Ajout de l'onglet Technique // 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'] = saisies_inserer($flux['data'], 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 formidable_generer_saisie_configurable($saisie, $env) { // On récupère le nom $nom = $saisie['options']['nom']; $identifiant = $saisie['identifiant']; // On cherche si ya un formulaire de config $formulaire_config = isset($env['erreurs']['configurer_' . $nom]) ? $env['erreurs']['configurer_' . $nom] : ""; // On ajoute une classe if (!isset($saisie['options']['li_class'])) { $saisie['options']['li_class'] = ''; // initialisation } $saisie['options']['li_class'] .= ' configurable'; // On ajoute l'option "tout_afficher" $saisie['options']['tout_afficher'] = 'oui'; // On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée if (!$env['erreurs']) { $saisie = saisies_inserer_html($saisie, recuperer_fond('formulaires/inc-construire_formulaire-actions', array('nom' => $nom, 'identifiant' => $identifiant, 'formulaire_config' => $formulaire_config, 'deplacable' => $env['_chemin_ui'])), 'debut'); } // On ajoute une ancre pour s'y déplacer $saisie = saisies_inserer_html($saisie, "\n<a id=\"configurer_{$nom}\"></a>\n", 'debut'); // Si ya un form de config on l'ajoute à la fin if (is_array($formulaire_config)) { // On double l'environnement $env2 = $env; // On ajoute une classe $saisie['options']['li_class'] .= ' en_configuration'; // 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'])) { $nb_champs_masques = count(saisies_lister_champs($saisie['saisies'])); $saisie['saisies'] = array(array('saisie' => 'explication', 'options' => array('nom' => 'truc', 'texte' => _T('saisies:construire_info_nb_champs_masques', array('nb' => $nb_champs_masques))))); } // On va ajouter le champ pour la position if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_{$nom}[options][description]", true))) { $chemin_description = array(0); $formulaire_config = saisies_inserer($formulaire_config, array('saisie' => 'fieldset', 'options' => array('nom' => "saisie_modifiee_{$nom}[options][description]", 'label' => _T('saisies:option_groupe_description')), 'saisies' => array()), 0); } $chemin_description[] = 'saisies'; $chemin_description[] = '0'; // tout au début $formulaire_config = saisies_inserer($formulaire_config, array('saisie' => 'position_construire_formulaire', 'options' => array('nom' => "saisie_modifiee_{$nom}[position]", 'label' => _T('saisies:construire_position_label'), 'explication' => _T('saisies:construire_position_explication'), 'formulaire' => $env['_contenu'], 'saisie_a_positionner' => $nom)), $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) { // 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 { $env2["saisie_modifiee_{$nom}"] = $env2['_saisies_par_nom'][$nom]; // il n'y a pas toujours de verification... if (isset($env2["saisie_modifiee_{$nom}"]['verifier'])) { $env2["saisie_modifiee_{$nom}"]['verifier'][$env2["saisie_modifiee_{$nom}"]['verifier']['type']] = $env2["saisie_modifiee_{$nom}"]['verifier']['options']; } } $env2['fond_generer'] = 'inclure/generer_saisies'; $saisie = saisies_inserer_html($saisie, '<div class="formulaire_configurer"><ul class="formulaire_configurer-contenus">' . recuperer_fond('inclure/generer_saisies', $env2) . '<li class="boutons"> <input type="hidden" name="enregistrer_saisie" value="' . $nom . '" /> <button type="submit" class="submit link" name="enregistrer_saisie" value="">' . _T('bouton_annuler') . '</button> <input type="submit" class="submit" name="enregistrer" value="' . _T('bouton_valider') . '" /> </li>' . '</ul></div>', 'fin'); } // On génère le HTML de la saisie $html = saisies_generer_html($saisie, $env); return $html; }
/** * 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; }