Changeset 99133 in spip-zone


Ignore:
Timestamp:
Aug 9, 2016, 5:52:29 PM (3 years ago)
Author:
marcimat@…
Message:

Ajout d'une fonction et méthode utile pour ajouter des champs extras sur des formulaires
spécifiques qui éditent aussi des objets éditoriaux, mais qui ne sont pas les formulaires
d'édition par défaut. Par exemple pour des formulaires d'inscription, ou des formulaires d'édition de profils d'auteur.

Cette fonction cextras_obtenir_saisies_champs_extras($objet, $options) retourne la liste des saisies
acceptées en modification par le visiteur en cours. Des options peuvent filtrer plus ou moins finement cette liste :

  • id_auteur : indique un auteur spécifique pour les tests d'autorisation (défaut : l'auteur en session)
  • autoriser : 'modifier' (par défaut) ou 'voir', qui correspond à exécuter l'autorisation qu'à l'auteur de modifier le champ. S'il n'a pas le droit, le champ ne sera pas retourné
  • whitelist : si renseigné, liste de noms de champs acceptés (les autres ne seront pas affichés)
  • blacklist : si renseigné, liste de noms de champs ignorés (ne seront pas affichés)

Les autorisations s'appliquent sur les champs qui restent après whitelist et blacklist.

Cette liste de saisies peut alors être injectées dans une clé retournée par le Charger
d'un formulaire CVT, et donc également par un pipeline formulaire_charger.

Cette clé peut être utilisée dans le HTML du formulaire directement avec la
balise #GENERER_SAISIE{#ENV{laclé}} ou en ajoutant le code résultant en PHP
via le pipeline formulaire_fond et l'inclusion inclure/generer_saisies.

Si cette clé vaut _champs_extras_saisies alors champs extras tentera automatiquement
d'ajouter les saisies dans le HTML du formulaire, si <!--extra--> est présent.
Cf cextras_formulaire_fond().

Notons que les saisies seront enregistrées en base de données (actuellement du moins)
SI le pipeline 'pre_edition' est appelé dans les traitements du formulaire pour la table
correspondante. C'est le cas si on appelle la fonction objet_modifier(). Mais ce n'est pas
le cas si seulement objet_inserer() est appelé.

Un exemple qui a inspiré cette fonction d'aide était de pouvoir ajouter des champs extras
sur le formulaire d'inscription aux newsletters du plugin mailsubscribers. Pour cela, appeler
dans un plugin le pipeline formulaire_charger tel que :

<pipeline nom="formulaire_charger" inclure="demo_pipelines.php" />

Dedans appeler la fonction pour récupérer les champs extras de l'objet mailsubscribers :

`
function demo_formulaire_charger($flux) {

if ($fluxargs?form? == 'newsletter_subscribe') {

include_spip('inc/cextras');
if ($saisies = cextras_obtenir_saisies_champs_extras('mailsubscribers')) {

$flux_champs_extras_saisies? = $saisies;

}

}
return $flux;

}
`

Ça fonctionne presque du premier coup… Sauf que visiblement ce formulaire d'inscription n'appelle objet_modifier
que lorsqu'on inscrit une seconde fois un courriel ; du coup, la première fois les champs extras ne semblent pas
pris en compte. Il faudrait ajouter un pipeline sur 'pre_insertion' en plus pour les insérer…
Cependant, ça fait déjà le job de récupérer les champs extras et de les ajouter au formulaire.

Location:
_plugins_/champs_extras_core/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/champs_extras_core/trunk/cextras_fonctions.php

    r90293 r99133  
    1818 *     <BOUCLE_x(TABLE)>
    1919 *     - #CHAMP_EXTRA{nom_du_champ}
    20  *     - #CHAMP_EXTRA{nom_du_champ,label}
     20 *     - #CHAMP_EXTRA{nom_du_champ, label}
    2121 *     </BOUCLE_x>
    2222 *     ```
  • _plugins_/champs_extras_core/trunk/cextras_pipelines.php

    r90297 r99133  
    345345 * @return array      Données du pipeline
    346346**/
    347 function cextras_revisions_chercher_label($flux){
     347function cextras_revisions_chercher_label($flux) {
    348348        $table = table_objet_sql($flux['args']['objet']);
    349349        $saisies_tables = champs_extras_objet($table);
     
    356356        return $flux;
    357357}
     358
     359
     360/**
     361 * Ajouter les saisies de champs extras sur des formulaires spécifiques
     362 *
     363 * Les champs extras s'ajoutent déjà automatiquement sur les formulaires d'édition
     364 * des objets éditoriaux. Pour d'autres formulaires plus spécifiques, tel
     365 * que des formulaires d'inscriptions, il est possible d'envoyer,
     366 * dans la partie 'charger' du formulaire en question la clé
     367 * `_champs_extras_saisies`, listant les saisies à afficher dedans.
     368 *
     369 * Elles seront ajoutées automatiquement à l'endroit où le code
     370 * html `<!--extra-->` est présent dans le formulaire.
     371 *
     372 * @see cextras_obtenir_saisies_champs_extras() qui aide à récupérer les saisies.
     373 *
     374 * @param array $flux
     375 * @return array
     376**/
     377function cextras_formulaire_fond($flux) {
     378        if (!empty($flux['args']['contexte']['_champs_extras_saisies'])) {
     379                $saisies = $flux['args']['contexte']['_champs_extras_saisies'];
     380
     381                // ajouter au formulaire
     382                $ajout = recuperer_fond('inclure/generer_saisies', array_merge($flux['args']['contexte'], array('saisies' => $saisies)));
     383
     384                // div par défaut en 3.1+, mais avant ul / li
     385                $balise = saisie_balise_structure_formulaire('ul');
     386                $flux['data'] = preg_replace(
     387                        '%(<!--extra-->)%is',
     388                        "<$balise class='editer-groupe champs_extras'>$ajout</$balise>\n" . '$1',
     389                        $flux['data']
     390                );
     391        }
     392        return $flux;
     393}
  • _plugins_/champs_extras_core/trunk/inc/cextras.php

    r91536 r99133  
    415415        }
    416416}
     417
     418
     419
     420/**
     421 * Retourne les saisies de champs extras d'un objet éditorial indiqué
     422 *
     423 * Les saisies sont filtrées, par défaut par l'autorisation de modifier chaque champs extras.
     424 * Des options peuvent modifier le comportement.
     425 *
     426 * @param string $objet
     427 *     Type de l'objet éditorial
     428 * @param array $options {
     429 *     @var int|null $id_auteur
     430 *         L'auteur testé pour les autorisations : null (par défaut) utilise l'auteur courant en session
     431 *     @var string $autoriser
     432 *         'voir' ou 'modifier' (par défaut) : type d'autorisation testé, appellera voirextra ou modifierextra…
     433 *     @var string[] $whitelist
     434 *         Liste blanche de noms de champs : ces champs seront à afficher, et uniquement eux (modulo l'autorisation sur chaque champ)
     435 *     @var string[] $blacklist
     436 *         Liste noire de noms de champs : ces champs ne seront pas affichés (quelque soit l'autorisation sur chaque champ)
     437 * }
     438 * @return array
     439 *     Liste de saisies, les champs extras sur l'objet indiqué
     440**/
     441function cextras_obtenir_saisies_champs_extras($objet, $options = array()) {
     442
     443        $options += array(
     444                'id_auteur' => null,
     445                'autoriser' => 'modifier',
     446                'whitelist' => array(),
     447                'blacklist' => array(),
     448        );
     449
     450        include_spip('cextras_pipelines');
     451        if ($saisies = champs_extras_objet( table_objet_sql($objet) )) {
     452
     453                // l'auteur pour l'autorisation
     454                $id_auteur = is_null($options['id_auteur']) ? session_get('id_auteur') : $options['id_auteur'];
     455
     456                // type d'autorisation
     457                if (!in_array($options['autoriser'], array('voir', 'modifier'))) {
     458                        $options['autoriser'] = 'modifier';
     459                }
     460
     461                // listes inclusions et exclusions
     462                $whitelist = array_unique(array_filter($options['whitelist']));
     463                $blacklist = array_unique(array_filter($options['blacklist']));
     464
     465                // Conserver uniquement les saisies souhaitées
     466                if (count($whitelist)) {
     467                        foreach ($saisies as $i => $saisie) {
     468                                if (empty($saisie['options']['nom']) or !in_array($saisie['options']['nom'], $whitelist)) {
     469                                        unset($saisies[$i]);
     470                                }
     471                        }
     472                }
     473
     474                // Enlever les saisies non souhaitées
     475                if (count($blacklist)) {
     476                        foreach ($saisies as $i => $saisie) {
     477                                if (in_array($saisie['options']['nom'], $blacklist)) {
     478                                        unset($saisies[$i]);
     479                                }
     480                        }
     481                }
     482
     483                // filtrer simplement les saisies que la personne en cours peut voir
     484                $saisies = champs_extras_autorisation($options['autoriser'], $objet, $saisies, array('id_objet' => $id_auteur));
     485
     486                if ($saisies) {
     487                        // pour chaque saisie presente, de type champs extras (hors fieldset et autres) ajouter un flag d'edition
     488                        $saisies = champs_extras_ajouter_drapeau_edition($saisies);
     489                        $valeurs['_saisies'] = $saisies;
     490                }
     491
     492        }
     493
     494        return $saisies;
     495}
     496
  • _plugins_/champs_extras_core/trunk/paquet.xml

    r91536 r99133  
    22        prefix="cextras"
    33        categorie="outil"
    4         version="3.7.1"
     4        version="3.8.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.1.*]"
     
    2222        <pipeline nom="pre_edition" inclure="cextras_pipelines.php" />
    2323        <pipeline nom="formulaire_verifier" inclure="cextras_pipelines.php" />
     24        <pipeline nom="formulaire_fond" inclure="cextras_pipelines.php" />
    2425        <pipeline nom="revisions_chercher_label" inclure="cextras_pipelines.php" />
    2526
Note: See TracChangeset for help on using the changeset viewer.