Changeset 39317 in spip-zone


Ignore:
Timestamp:
Jul 17, 2010, 2:46:21 PM (9 years ago)
Author:
marcimat@…
Message:

Permettre à des plugins étendant des objets dans des tables distinctes, tel que spip_auteurs_elargis et spip_auteurs, ou le plugin «comptes et contacts» de pouvoir aussi étendre leurs tables via le plugin champs extras.

De la sorte, on permet l'utilisation de préfixe sur les champs à écrire et à récupérer, mais c'est aux plugins ayant besoin de cette utilisation d'appeler les pipelines adéquats (formulaire_verifier, editer_contenu_objet) en transmettant l'argument 'prefixe_champs_extras'

Location:
_plugins_/champs_extras2/core
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/champs_extras2/core/cextras_pipelines.php

    r36166 r39317  
    7070// des squelettes de champs extras
    7171// en fonction des parametres donnes dans la classe ChampExtra
    72 function cextras_creer_contexte($c, $contexte_flux) {
     72function cextras_creer_contexte($c, $contexte_flux, $prefixe='') {
    7373        $contexte = array();
    74         $contexte['champ_extra'] = $c->champ;
     74        $nom_champ = $prefixe . $c->champ;
     75        $contexte['champ_extra'] = $nom_champ;
    7576        $contexte['label_extra'] = _T($c->label);
    7677        $contexte['precisions_extra'] = _T($c->precisions);
     
    8081        $contexte['verifier_extra'] = $c->verifier;
    8182        $contexte['verifier_options_extra'] = $c->verifier_options;
    82         $contexte['valeur_extra'] = $contexte_flux[$c->champ];
     83        $contexte['valeur_extra'] = $contexte_flux[$nom_champ];
    8384        $contexte['enum_extra'] = $c->enum;
    8485        // ajouter 'erreur_extra' dans le contexte s'il y a une erreur sur le champ
    8586        if (isset($contexte_flux['erreurs'])
    8687        and is_array($contexte_flux['erreurs'])
    87         and array_key_exists($c->champ, $contexte_flux['erreurs'])) {
    88                 $contexte['erreur_extra'] = $contexte_flux['erreurs'][$c->champ];
     88        and array_key_exists($nom_champ, $contexte_flux['erreurs'])) {
     89                $contexte['erreur_extra'] = $contexte_flux['erreurs'][$nom_champ];
    8990        }
    9091
     
    9495
    9596// recuperation d'une saisie interne
    96 function ce_calculer_saisie_interne($c, $contexte) {
     97function ce_calculer_saisie_interne($c, $contexte, $prefixe='') {
    9798        // le contexte possede deja l'entree SQL,
    9899        // calcule par le pipeline formulaire_charger.
    99         $contexte = cextras_creer_contexte($c, $contexte);
     100        $contexte = cextras_creer_contexte($c, $contexte, $prefixe);
    100101
    101102        // calculer le bon squelette et l'ajouter
     
    104105                // si on ne sait pas, on se base sur le contenu
    105106                // pour choisir ligne ou bloc
    106                 $f = strstr($contexte[$c->champ], "\n")
     107                $f = strstr($contexte[$prefixe . $c->champ], "\n")
    107108                        ? 'extra-saisies/bloc'
    108109                        : 'extra-saisies/ligne';
     
    113114
    114115// en utilisant le plugin "saisies"
    115 function ce_calculer_saisie_externe($c, $contexte) {
    116 
    117         $contexte['nom'] = $c->champ;
     116function ce_calculer_saisie_externe($c, $contexte, $prefixe='') {
     117       
     118        $nom_champ = $prefixe . $c->champ;
     119        $contexte['nom'] = $nom_champ;
    118120        $contexte['type_saisie'] = $c->type;
    119121        $contexte['label'] = _T($c->label);
    120         if (isset($contexte[$c->champ]) and $contexte[$c->champ]) {
    121                 $contexte['valeur'] = $contexte[$c->champ];
     122        if (isset($contexte[$nom_champ]) and $contexte[$nom_champ]) {
     123                $contexte['valeur'] = $contexte[$nom_champ];
    122124        }
    123125
     
    194196                $inserer_saisie = '';
    195197
     198                // Il peut arriver qu'un prefixe soit appliqué sur les noms de champs de formulaire
     199                // (mais pas en base) ceci pour permettre d'inserer les champs de formulaire d'un objet dans
     200                // le formulaire d'un autre objet, en prefixant tous ses champs, par exemple
     201                // pour spip_auteurs_elargis et spip_auteurs. Dans ce cas il ne pourra pas y avoir
     202                // conflits si spip_auteurs a un champ extra 'nom' et spip_auteurs_elargis aussi.
     203                // La contrainte est que le formulaire inseré doit appeler le pipeline 'editer_contenu_objet'
     204                // en lui indiquant quel est le prefixe utilisé d'une part, et d'autre part
     205                // il faut qu'il s'occupe lui même d'ajouter les données via
     206                // le pipeline formulaire_charger de spip_auteurs (pour cet exemple) avec les bons prefixe.
     207                if (isset($flux['args']['prefixe_champs_extras']) and $prefixe = $flux['args']['prefixe_champs_extras']) {
     208                        $inserer_saisie .= "<input type='hidden' name='prefixe_champs_extras_".$c->type."' value='$prefixe' />\n";
     209                } else {
     210                        $prefixe = '';
     211                }
     212
     213               
    196214                foreach ($extras as $c) {
    197215
     
    206224
    207225                                if ($c->saisie_externe) {
    208                                         list($f, $contexte) = ce_calculer_saisie_externe($c, $flux['args']['contexte']);
     226                                        list($f, $contexte) = ce_calculer_saisie_externe($c, $flux['args']['contexte'], $prefixe);
    209227                                } else {
    210                                         list($f, $contexte) = ce_calculer_saisie_interne($c, $flux['args']['contexte']);
     228                                        list($f, $contexte) = ce_calculer_saisie_interne($c, $flux['args']['contexte'], $prefixe);
    211229                                }
     230                                // Si un prefixe de champ est demande par le pipeline
     231                                // par exemple pour afficher et completer un objet différent dans
     232                                // le formulaire d'un premier objet (ex: spip_auteurs_etendus et spip_auteurs)
     233                                // l'indiquer !
    212234                                $saisie = recuperer_fond($f, $contexte);
    213235
     
    215237                                // (cas des checkbox multiples quand on renvoie vide
    216238                                //  qui n'envoient rien de rien, meme pas un array vide)
    217                                 $saisie .= '<input type="hidden" name="cextra_'.$c->champ.'" value="1" />';
     239                                $saisie .= '<input type="hidden" name="cextra_' . $prefixe . $c->champ.'" value="1" />';
    218240
    219241                                // ajouter la saisie.
     
    237259        // recuperer les champs crees par les plugins
    238260        if ($extras = cextras_get_extras_match($flux['args']['table'])) {
     261                // recherchons un eventuel prefixe utilise pour poster les champs
     262                $type = objet_type(table_objet($flux['args']['table']));
     263                $prefixe = _request('prefixe_champs_extras_' . $type);
     264                if (!$prefixe) {
     265                        $prefixe = '';
     266                }
    239267                foreach ($extras as $c) {
    240                         if (_request('cextra_'.$c->champ)) {
    241                                 $extra = _request($c->champ);
     268                        if (_request('cextra_' . $prefixe . $c->champ)) {
     269                                $extra = _request($prefixe . $c->champ);
    242270                                if (is_array($extra))
    243271                                        $extra = join(',',$extra);
    244                                 $flux['data'][$c->champ] = corriger_caracteres($extra);
     272                                $flux['data'][$prefixe . $c->champ] = corriger_caracteres($extra);
    245273                        }
    246274                }
     
    300328                // des champs extras correspondent ?
    301329                if ($extras = cextras_get_extras_match($type)) {
    302                
     330
     331                        // Il peut arriver qu'un prefixe soit appliqué sur les noms de champs de formulaire
     332                        // La contrainte est que le formulaire inseré doit appeler le pipeline 'formulaire_verifier'
     333                        // avec le bon type d'objet (en indiquant le prefixe) et concaténer ainsi les résultats
     334                        if (isset($flux['args']['prefixe_champs_extras'])
     335                        and $prefixe = $flux['args']['prefixe_champs_extras']) {
     336                        } else {
     337                                $prefixe = '';
     338                        }
     339                                       
    303340                        include_spip('inc/autoriser');
    304341
     
    329366                                {       
    330367                                        if ($c->obligatoire AND !_request($c->champ)) {
    331                                                 $flux['data'][$c->champ] = _T('info_obligatoire');
     368                                                $flux['data'][$prefixe . $c->champ] = _T('info_obligatoire');
    332369                                        } elseif ($c->verifier AND $verifier) {
    333                                                 if ($erreur = $verifier(_request($c->champ), $c->verifier, $c->verifier_options)) {
    334                                                         $flux['data'][$c->champ] = $erreur;
     370                                                if ($erreur = $verifier(_request($prefixe . $c->champ), $c->verifier, $c->verifier_options)) {
     371                                                        $flux['data'][$prefixe . $c->champ] = $erreur;
    335372                                                }
    336373                                        }
  • _plugins_/champs_extras2/core/plugin.xml

    r37180 r39317  
    33        <auteur>Matthieu Marcillaud, Fil</auteur>
    44        <licence>GNU/GPL</licence>
    5         <version>1.5.3</version>
     5        <version>1.6.0</version>
    66        <description><multi>
    77        [fr]Creer de nouveaux champs aux objets d'&eacute;dition de SPIP
Note: See TracChangeset for help on using the changeset viewer.