Browse Source

Nouvelle fonctionnalité : le constructeur de formulaire permet désormais de configurer par interface des options globales à l'affichage d'un formulaire. Ces options sont déjà prévues dans l'API, par ex pour personnaliser le texte du bouton ou pour activer le multi-étapes. Elles sont stockés dans une clé 'options' à la racine du tableau de description du formulaire. Pour avoir l'interface, le constructeur a besoin de connaître la liste des champs qu'on permet de configurer pour CET appel. En effet, suivant les contextes, ce ne sont pas forcément les mêmes options ! Si on est dans Formidable, ou dans Champs Extras, les mêmes choses ne sont pas pertinentes. C'est donc au plugin qui appelle le constructeur de décider quelles sont les options qu'il permet.

svn/root/tags/v3.18.0 v3.18.0
rastapopoulos@spip.org 4 years ago
parent
commit
f29b0c0695
  1. 25
      formulaires/construire_formulaire.html
  2. 354
      formulaires/construire_formulaire.php
  3. 1
      lang/saisies_fr.php
  4. 2
      paquet.xml

25
formulaires/construire_formulaire.html

@ -9,9 +9,29 @@
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<input type="submit" class="submit noscroll invisible" name="enregistrer" value="<:bouton_enregistrer:>" />
[(#ENV{_activer_options_globales}|oui)
[(#ENV{erreurs/configurer_globales}|non)
<div class="actions">
<button type="submit" class="submit" name="configurer_globales" value="oui">
<:saisies:construire_configurer_globales_label:>
</button>
</div>
]
[(#ENV{erreurs/configurer_globales}|oui)
<[(#DIV|sinon{ul})] class="editer-groupe en_configuration">
#GENERER_SAISIES{#ENV{erreurs/configurer_globales}}
<[(#DIV|sinon{li})] class="boutons">
<input type="hidden" name="enregistrer_globales" value="oui" />
<button type="submit" class="submit link noscroll" name="enregistrer_globales" value=""><:bouton_annuler:></button>
<input type="submit" class="submit noscroll" name="enregistrer" value="<:bouton_valider:>" />
</[(#DIV|sinon{li})]>
</[(#DIV|sinon{ul})]>
]
]
<[(#DIV|sinon{ul})] class="editer-groupe" id="deplacable">
<[(#DIV|sinon{li})] id="reinitialiser" class="actions_formulaire">
<button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
<img src="#CHEMIN{images/formulaire-reinitialiser-24.png}" alt="" />
@ -49,7 +69,6 @@
</BOUCLE_saisies_groupes_disponibles>
</[(#DIV|sinon{li})]>
</B_saisies_groupes_disponibles>
</[(#DIV|sinon{ul})]>

354
formulaires/construire_formulaire.php

@ -39,6 +39,17 @@ function formulaires_construire_formulaire_charger($identifiant, $formulaire_ini
foreach (array_keys($contexte['_saisies_par_nom']) as $nom) {
$contexte["saisie_modifiee_$nom"] = array();
}
// La liste des options globales qu'on peut configurer, si elles existent
if (isset($options['options_globales']) and is_array($options['options_globales'])) {
$contexte['_activer_options_globales'] = true;
if (isset($formulaire_actuel['options'])) {
$contexte['options_globales'] = $formulaire_actuel['options'];
}
else {
$contexte['options_globales'] = array();
}
}
// La liste des saisies
$saisies_disponibles = saisies_lister_disponibles();
@ -76,10 +87,14 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in
// l'une ou l'autre sera presente
$configurer_saisie = $enregistrer_saisie = '';
// Pas d'erreur si l'on ne demande rien
// On ne fait rien du tout si on n'est pas dans l'un de ces cas
if (
!($nom_ou_id = $configurer_saisie = _request('configurer_saisie')
or $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))
!(
$nom_ou_id = $configurer_saisie = _request('configurer_saisie')
or $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie')
or $configurer_globales = _request('configurer_globales')
or $enregistrer_globales = _request('enregistrer_globales')
)
) {
return $erreurs;
}
@ -88,184 +103,197 @@ function formulaires_construire_formulaire_verifier($identifiant, $formulaire_in
$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'];
// Gestion de la config globales
if ($configurer_globales or $enregistrer_globales) {
array_walk_recursive($options['options_globales'], 'construire_formulaire_transformer_nom', 'options_globales[@valeur@]');
$erreurs['configurer_globales'] = $options['options_globales'];
if ($enregistrer_globales) {
$vraies_erreurs = saisies_verifier($erreurs['configurer_globales']);
}
}
// Sinon c'est la gestion d'une saisie précise
else {
$saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
$nom = $nom_ou_id;
}
$noms_autorises = array_keys($saisies_actuelles);
// 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;
}
// 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();
// 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, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
$formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
$formulaire_config = $formulaire_config['saisies'];
$saisie = $saisies_actuelles[$nom_ou_id];
$formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
array_walk_recursive($formulaire_config, 'construire_formulaire_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']
),
)
);
}
// 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';
// 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',
$formulaire_config = saisies_inserer(
$formulaire_config,
array(
'saisie' => 'input',
'options' => array(
'modele' => '/^[\w]+$/'
'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
);
}
),
$chemin_nom
);
}
// liste des options de vérification
$verif_options = array();
// 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();
// 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();
// La vérification fichiers ne sert que pour la saisie fichiers, et réciproquement, cette saisies n'utilise que cette vérification
if ($saisie['saisie'] == 'fichiers') {
$liste_verifications = array('fichiers'=>$liste_verifications['fichiers']);
} else {
unset($liste_verifications['fichiers']);
}
uasort ($liste_verifications,'verifier_trier_par_titre');
$chemin_validation[] = 'saisies';
$chemin_validation[] = 1000000; // à la fin
// On construit la saisie à insérer et les fieldset des options
if ($saisie['saisie'] == 'fichiers') {
$saisie_liste_verif = array(
'saisie' => 'hidden',
'options' => array(
'nom' => "saisie_modifiee_${nom}[verifier][type]",
'defaut' => 'fichiers'
)
);
} else {
$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',
// La vérification fichiers ne sert que pour la saisie fichiers, et réciproquement, cette saisies n'utilise que cette vérification
if ($saisie['saisie'] == 'fichiers') {
$liste_verifications = array('fichiers'=>$liste_verifications['fichiers']);
} else {
unset($liste_verifications['fichiers']);
}
uasort ($liste_verifications,'verifier_trier_par_titre');
$chemin_validation[] = 'saisies';
$chemin_validation[] = 1000000; // à la fin
// On construit la saisie à insérer et les fieldset des options
if ($saisie['saisie'] == 'fichiers') {
$saisie_liste_verif = array(
'saisie' => 'hidden',
'options' => array(
'nom' => 'options',
'label' => $verif['titre'],
'conteneur_class' => "$type_verif options_verifier"
),
'saisies' => $verif['options']
'nom' => "saisie_modifiee_${nom}[verifier][type]",
'defaut' => 'fichiers'
)
);
} else {
$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()
)
);
array_walk_recursive($groupe, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
array_walk_recursive($groupe, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_${nom}[verifier][$type_verif]");
$verif_options[$type_verif] = $groupe;
}
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, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
array_walk_recursive($groupe, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_${nom}[verifier][$type_verif]");
$verif_options[$type_verif] = $groupe;
}
}
$verif_options = array_merge(array($saisie_liste_verif), $verif_options);
}
$verif_options = array_merge(array($saisie_liste_verif), $verif_options);
}
// Permettre d'intégrer des saisies et fieldset au formulaire de configuration.
// Si des vérifications sont à faire, elles seront prises en compte
// lors des tests de vérifications à l'enregistrement.
$formulaire_config = pipeline('saisies_construire_formulaire_config', array(
'data' => $formulaire_config,
'args' => array(
'identifiant' => $identifiant,
'action' => $enregistrer_saisie ? 'enregistrer' : 'configurer',
'options' => $options,
'nom' => $nom,
'saisie' => $saisie,
),
));
if ($enregistrer_saisie) {
// La saisie modifié
$saisie_modifiee = _request("saisie_modifiee_${nom}");//contient tous les paramètres de la saisie
// 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');
// Permettre d'intégrer des saisies et fieldset au formulaire de configuration.
// Si des vérifications sont à faire, elles seront prises en compte
// lors des tests de vérifications à l'enregistrement.
$formulaire_config = pipeline('saisies_construire_formulaire_config', array(
'data' => $formulaire_config,
'args' => array(
'identifiant' => $identifiant,
'action' => $enregistrer_saisie ? 'enregistrer' : 'configurer',
'options' => $options,
'nom' => $nom,
'saisie' => $saisie,
),
));
if ($enregistrer_saisie) {
// La saisie modifié
$saisie_modifiee = _request("saisie_modifiee_${nom}");//contient tous les paramètres de la saisie
// 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 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);
// 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['configurer_'.$nom] = $formulaire_config;
if ($enregistrer_saisie) {
// S'il y a des vraies erreurs au final
if ($enregistrer_globales or $enregistrer_saisie) {
if ($vraies_erreurs) {
$erreurs = array_merge($erreurs, $vraies_erreurs);
$erreurs['message_erreur'] = singulier_ou_pluriel(count($vraies_erreurs), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
@ -355,7 +383,17 @@ function formulaires_construire_formulaire_traiter($identifiant, $formulaire_ini
if ($supprimer_saisie = _request('supprimer_saisie')) {
$formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie);
}
// Si on enregistre la conf globale
if (_request('enregistrer_globales')) {
$options_globales = _request('options_globales');
if (is_array($options_globales)) {
spip_desinfecte($options_globales);
}
$formulaire_actuel['options'] = $options_globales;
}
// Si on enregistre la conf d'une saisie
if ($nom = _request('enregistrer_saisie')) {
// On récupère ce qui a été modifié

1
lang/saisies_fr.php

@ -26,6 +26,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.',
'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l’enregistrement de cette nouvelle version du formulaire.',
'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
'construire_configurer_globales_label' => 'Configurer les options globales',
'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.',

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="saisies"
categorie="outil"
version="3.17.0"
version="3.18.0"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="images/logo_saisie_48.png"

Loading…
Cancel
Save