Changeset 112440 in spip-zone for _plugins_/saisies/trunk


Ignore:
Timestamp:
Nov 15, 2018, 12:48:41 PM (4 weeks ago)
Author:
root
Message:

<!> gros changement
Lors de saisies_verifier():

  • vérifier que la valeur postée correspond aux valeurs définies comme

possibles lors de création de la saisie (pour éviter que des gens
modifient les valeurs possibles via par ex un inspecteur html)

  • soit une des valeurs définies dans data pour les radio, cases, select, etc
  • soit une valeur fixée pour les hidden, mais aussi pour les input readonly etc.
  • concrètement appelle à une fonction

saisies_verifier_valeurs_acceptables() qui appelle
<type-de-la-saisie>_verifier_valeurs_acceptables()

  • cette dernière fonction est définie dans un fichier

saisies/<type-de-la-saisie>.php

  • elle peut s'appuyer sur les fonctions
    • saisies_verifier_gel_saisie() qui retourne true si la saisie est en readonly ou bien en disabled avec post
    • saisies_trouver_data() qui renvoie l'option data ou datas de la saisie, formatée sous forme de tableau

Pour le moment, on applique cela uniquement aux saisies:

  • avec un .yaml
  • qui ne concernent pas des objets en BDD

Ce qui devrait couvrir une grosse partie des cas.

Testé avec 19 formulaires Formidable.
Comme toutefois cela pourrait potentiellement casser certains formulaires mal fichus,
on passe en 4.0.0 par sécurité.

On ajoute un peu de narcissime dans paquet.xml

Location:
_plugins_/saisies/trunk
Files:
11 added
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/inc/saisies.php

    r112428 r112440  
    224224                // Tout type de saisie, sauf fichiers
    225225                else {
    226                         // Si le nom du champ est un tableau indexé, il faut parser !
    227                         if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
    228                                 $valeur = _request($separe[1]);
    229                                 preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
    230                                 // On va chercher au fond du tableau
    231                                 foreach ($index[1] as $cle) {
    232                                         $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;
    233                                 }
    234                         } else {
    235                                 // Sinon la valeur est juste celle du nom
    236                                 $valeur = _request($champ);
    237                         }
     226                        $valeur = saisies_request($champ);
    238227                }
    239228
     
    304293                }
    305294        }
     295        // Vérifier que les valeurs postées sont acceptables, à savoir par exemple que pour un select, ce soit ce qu'on a proposé.
     296        $erreurs = saisies_verifier_valeurs_acceptables($saisies, $erreurs);
    306297
    307298        // Last but not least, on passe nos résultats à un pipeline
     
    318309
    319310        return $erreurs;
     311}
     312
     313/**
     314 * Vérifier que les valeurs postées sont acceptables,
     315 * c'est-à-dire qu'elles ont été proposées lors de la conception de la saisie.
     316 * Typiquement pour une saisie radio, vérifier que les gens n'ont pas postée une autre fleur.
     317 * @param $saisies array tableau général des saisies, déjà aplati, classé par nom de champ
     318 * @param $erreurs array tableau des erreurs
     319 * @return array table des erreurs modifiés
     320**/
     321function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
     322        foreach ($saisies as $saisie => $description) {
     323                $type = $description['saisie'];
     324
     325                // Pas la peine de vérifier si par ailleurs il y a déjà une erreur
     326                if (isset($erreurs[$saisie])) {
     327                        continue;
     328                }
     329                //Il n'y a rien à vérifier sur une description / fieldset
     330                if (in_array($description['saisie'], array('explication','fieldset'))) {
     331                        continue;
     332                }
     333                if (include_spip("saisies/$type")) {
     334                        $f = $type.'_valeurs_acceptables';
     335                        if (function_exists($f)) {
     336                                $valeur = saisies_request($saisie);
     337                                if (!$f($valeur, $description)) {
     338                                        $erreurs[$saisie] = _T("saisies:erreur_valeur_inacceptable");
     339                                        spip_log("Tentative de poste de valeur innaceptable pour $saisie de type $type. Valeur postée : ".print_r(_request($saisie), true), "saisies"._LOG_AVERTISSEMENT);
     340                                }
     341                        } else {
     342                                spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_AVERTISSEMENT);
     343                        }
     344                } else {
     345                        spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_AVERTISSEMENT);
     346                }
     347        }
     348        return $erreurs;
     349}
     350
     351/**
     352 * Trouve le résultat d'une saisie (_request())
     353 * en tenant compte du fait que la saisie peut être décrit sous forme de sous entrées d'un tableau
     354 * @param string $champ nom du champ de la saisie, y compris avec crochets pour sous entrées
     355 * return string|array résultat du _request()
     356**/
     357function saisies_request($champ) {
     358        if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
     359                $valeur = _request($separe[1]);
     360                preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
     361                // On va chercher au fond du tableau
     362                foreach ($index[1] as $cle) {
     363                        $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;
     364                }
     365        } else {
     366                // Sinon la valeur est juste celle du champ
     367                $valeur = _request($champ);
     368        }
     369        return $valeur;
     370}
     371/**
     372 * Trouve le champ datas ou datas (pour raison historique)
     373 * parmis les paramètres d'une saisie
     374 * et le retourne après avoir l'avoir transformé en tableau si besoin
     375 * @param array $description description de la saisie
     376 * @bool $disable_choix : si true, supprime les valeurs contenu dans l'option disable_choix des data
     377 * @return array data
     378**/
     379function saisies_trouver_data($description, $disable_choix = false) {
     380        $options = $description['options'];
     381        if (isset($options['data'])) {
     382                $data = $options['data'];
     383        } elseif (isset($options['datas'])) {
     384                $data = $options['datas'];
     385        } else {
     386                $data = array();//normalement on peut pas mais bon
     387        }
     388        $data = saisies_chaine2tableau($data);
     389
     390        if ($disable_choix == true and isset($options['disable_choix'])) {
     391                $disable_choix = array_flip(explode(',',$options['disable_choix']));
     392                $data = array_diff_key($data,$disable_choix);
     393        }
     394        return $data;
    320395}
    321396
  • _plugins_/saisies/trunk/inc/saisies_lister.php

    r112310 r112440  
    454454        return $saisies_autonomes;
    455455}
     456
     457/**
     458 * Indique si une saisie à sa valeur gelée
     459 * - soit par option disabled avec envoi cachée
     460 * - soit par option readonly
     461 * @param array $description description de la saisie
     462 * @return bool true si gélée, false sinon)
     463**/
     464function saisies_verifier_gel_saisie($description) {
     465        $options = $description['options'];
     466        //As t-on bloqué d'une manière ou d'une autre la valeur postée?
     467        if ((
     468                isset($options['readonly'])
     469                and $options['readonly']
     470        )
     471        or (
     472                isset($options['disable'])
     473                and isset($options['disable_avec_post'])
     474                and $options['disable']
     475                and $options['disable_avec_post']
     476        )
     477        ) {
     478                return true;
     479        } else {
     480                return false;
     481        }
     482}
  • _plugins_/saisies/trunk/lang/saisies_fr.php

    r112090 r112440  
    4141        'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies',
    4242        'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
     43        'erreur_valeur_inacceptable' => 'Valeur postée non acceptable.',
    4344
    4445        // I
  • _plugins_/saisies/trunk/paquet.xml

    r112429 r112440  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.7.2"
     4        version="4.0.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
     
    1313        <auteur lien="https://contrib.spip.net/Joseph">Joseph</auteur>
    1414        <auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
     15        <auteur>Maïeul</auteur>
    1516        <licence>GNU/GPL</licence>
    1617
  • _plugins_/saisies/trunk/saisies/hidden.html

    r101125 r112440  
    22        #ENV*{inserer_debut}
    33        [(#ENV{tout_afficher}|!={oui}|oui)
     4        [<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
    45        <input type="hidden"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}"[ (#ENV*{attributs})] />
    56        ]
    67        [(#ENV{tout_afficher}|!={oui}|non)
    78        [<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
     9        [<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
    810        <input type="text"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}" readonly="readonly" />
    911        ]
    10        
    1112        #ENV*{inserer_fin}
    1213</[(#ENV{saisies_base_conteneur,#DIV|sinon{li}})]>
Note: See TracChangeset for help on using the changeset viewer.