Ignore:
Timestamp:
Apr 23, 2017, 9:39:26 AM (3 years ago)
Author:
jluc@…
Message:

refactorisation de la compilation, simplification des balises, squelettes de tests, désormais à tester

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/visiteur/trunk/visiteur_options.php

    r103173 r104057  
    22
    33/**
    4  * Outils SPIP supplémentaires pour une gestion efficace pour l'hébergement des accés aux données du visiteur courant
    5  * Balises #_VISITEUR_SI, #_VISITEUR_SI_EGAL, #_VISITEUR_SINON, #_VISITEUR_FINSI.
     4 * Outils SPIP supplémentaires pour une gestion efficace pour l'hébergement
     5 * des accés aux données du visiteur courant
     6 * Balises #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FIN
    67 *
    7  * @copyright   2016
     8 * @copyright   2016, 2017
     9 * @author              JLuc
    810 * @author              Marcimat
    9  * @author              JLuc
    1011 * @licence             GPL
    1112 *
     
    1314
    1415include_spip('inc/session');
     16include_spip ('inc/filtres');
     17// appeler appliquer_filtre dans le code compilé est une somptuosité superfétatoire
     18// todo : à la compilation appeler chercher_filtre pour savoir quelle est la fonction appelée par le filtre et insérer dans le code compilé un appel direct à cette fonction --> plus besoin d'inclure inc/filtres dans mes_options
    1519
    1620//
    17 // accés étendu aux données des visiteurs
     21// Accés étendu aux données des visiteurs
    1822//
    1923// Aucun test n'est fait en amont sur la présence ou non d'une session :
     
    2125// doit gérer cette éventualité et renvoyer null ou une valeur par défaut
    2226//
    23 // todo ? via pipeline
     27// todo : un pipeline à la spip
    2428//
    2529function extended_session_get ($champ) {
     
    4044}
    4145
    42 // une fonction pour le code de |?
    43 // (n'existe t elle pas déjà ? c'est l'inverse de choixsivide)
     46/*
     47 * Recevant un argument entre quotes (contenant par exemple un nom de filtre)
     48 * trim_quote enlève les espaces de début et fin *à l'intérieur* des quotes
     49 * ex : reçoit ' filtre ' (quotes comprises) et renvoie 'filtre'
     50*/
     51function trim_quote($f) {
     52        $f = trim($f);  // c'est pas ça l'important
     53        $l = strlen($f);
     54        if ((strpos($f,"'")!== 0) or (strrpos($f,"'")!== $l-1))
     55                return $f;
     56        $r = '\''.trim(substr($f, 1, $l-2)).'\'';
     57        return $r;
     58}
     59
     60// une fonction pour le code de |? (la négation de choixsivide)
    4461function choix_selon ($test, $sioui, $sinon) {
    4562        return $test ? $sioui : $sinon;
     
    4865define (V_OUVRE_PHP, "'<'.'" . '?php ');
    4966define (V_FERME_PHP, ' ?' . "'.'>'");
    50 define (V_VIRGULE_ARGUMENT, ' .\'","\'. ');
    5167
    52 function compile_appel_visiteur ($p, $champ) {
    53         $r = 'extended_session_get("\' . ' . $champ . ' . \'")';
     68// Appelé uniquement au recalcul pour la compilation
     69// $champ est entre quotes ''
     70// le code renvoyé sera inséré à l'intérieur d'un '...'
     71function compile_appel_visiteur ($p, $champ,$n=2) {
     72        $get_champ = "extended_session_get('.\"$champ\".')";
     73       
     74        // champ sans application de filtre
     75        if (!existe_argument_balise($n, $p))
     76                return $get_champ;
     77       
     78        // Application d'un filtre, récupéré entre quotes ''
     79        $filtre = trim_quote(interprete_argument_balise (2, $p));
    5480
    55         // S'il y a un filtre
    56         if (existe_argument_balise(2, $p)) {
    57                 $filtre = interprete_argument_balise (2, $p);
    58                 if ($filtre=="'?'")
    59                         $filtre = "'choix_selon'";
     81        if ($filtre=="'?'")
     82                $filtre = "'choix_selon'";
     83               
     84        // le filtre peut être appelé avec 0, un ou 2 arguments
     85        $arg_un = $arg_deux = $virgule_arg_un = $virgule_arg_deux = '';
     86       
     87        if (existe_argument_balise($n+1, $p)) {
     88                $arg_un = interprete_argument_balise($n+1, $p);
     89                $virgule_arg_un = ".', '.\"$arg_un\"";
     90        };
    6091
    61                 // le filtre peut être appelé avec 0, un ou 2 arguments
    62                 $arg_gauche = $arg_droite = '';
     92        // le filtre est il en fait un opérateur de comparaison ?
     93        if (in_array ($filtre, array ("'=='", "'!='", "'<'", "'<='", "'>'", "'>='"))) {
     94                $comparateur = trim ($filtre, "'");
     95                                                                               
     96                $r = "($get_champ $comparateur '.\"$arg_un\".')";
     97                // #_VISITEUR{nom,==,JLuc} donnera
     98                // '<'.'?php  echo (extended_session_get('."'nom'".') == '."'JLuc'".');  ?'.'>'
     99                // #_VISITEUR_SI{nom
     100                return $r;
     101        }
     102       
     103        if (existe_argument_balise($n+2, $p)) {
     104                $arg_deux = interprete_argument_balise($n+2, $p);
     105                $virgule_arg_deux = ".', '.\"$arg_deux\"";
     106        };
    63107
    64                 if (existe_argument_balise(3, $p))
    65                         $arg_gauche = V_VIRGULE_ARGUMENT . interprete_argument_balise(3, $p);
     108// produira par exemple ensuite :
     109// '<'.'?php  echo appliquer_filtre(extended_session_get('."'nom'".'), '."'strlen'".');  ?'.'>'
     110// ou '<'.'?php  echo appliquer_filtre( extended_session_get('."'nbreste'".'), '."'plus'" .', "'3'" .');  ?'.'>'
     111        $r = "appliquer_filtre($get_champ, '.\"$filtre\" $virgule_arg_un $virgule_arg_deux .')";
    66112
    67                 if (existe_argument_balise(4, $p))
    68                         $arg_droite = V_VIRGULE_ARGUMENT . interprete_argument_balise(4, $p);
    69                        
    70                 $r = 'appliquer_filtre(extended_session_get("\' . ' . $champ . ' . \'"),"\'. '. $filtre . $arg_gauche . $arg_droite . ' .\'")';
    71         }
    72113        return $r;
    73114}
    74115
     116//
     117// Définition des balises
     118// Attention : on ne peut PAS appliquer de filtre sur ces balises ni les utiliser dans une construction conditionnelle [avant(...) après]
     119// Pour appliquer un filtre, utiliser la syntaxe dédiée avec un argument d'appel de la balise
     120//
     121
     122/*
     123 * #_VISITEUR rend l'id_auteur si l'internaute est connecté
     124 * #_VISITEUR(champ) rend la valeur du champ de session étendue de l'internaute connecté
     125 * #_VISITEUR(champ, filtre[, arg1[, arg2]]) applique le filtre au champ de session étendue, avec 0, 1 ou 2 arguments supplémentaires et rend la valeur résultat
     126 */
    75127function balise__VISITEUR_dist($p) {
    76128        $champ = interprete_argument_balise(1, $p);
     
    79131        $p->code = V_OUVRE_PHP . ' echo '. compile_appel_visiteur($p, $champ). '; ' . V_FERME_PHP;
    80132        $p->interdire_scripts = false;
     133        // echo "On insèrera l'évaluation du code suivant : <pre>".$p->code."</pre>\n\n";
    81134        return $p;
    82135}
    83136
     137/*
     138 * #_VISITEUR_SI(champ) teste si le champ de session est non vide
     139 * #_VISITEUR_SI(champ, val) teste si le champ de session est égal à la valeur spécifiée
     140 * #_VISITEUR_SI(champ, val, operateur) teste si le champ de session se compare positivement à la valeur spécifiée
     141 *      selon l'opérateur spécifié, qui peut etre
     142 * - soit un comparateur : ==, <, >, >=, <=
     143 * - soit un filtre (nom de fonction) recevant 2 arguments : la valeur du champ et val. C'est le retour qui est alors testé.
     144 * Produit par exemple le code suivant :
     145 * '<'.'?php  echo extended_session_get('."'nom'".');  ?'.'>'
     146*/
    84147function balise__VISITEUR_SI_dist($p) {
    85148        $champ = interprete_argument_balise(1, $p);
    86149        if (!$champ)
    87150                $champ = "'id_auteur'";
    88         $p->code = V_OUVRE_PHP . 'if ('. compile_appel_visiteur($p, $champ). ') { ' . V_FERME_PHP;
     151
     152        $p->interdire_scripts = false;
     153
     154        // Appelé uniquement au recalcul
     155        $p->code = V_OUVRE_PHP . 'if ('.compile_appel_visiteur($p, $champ).') { ' . V_FERME_PHP;
     156        // echo "On insèrera l'évaluation du code suivant : <pre>".$p->code."</pre>\n\n";
     157        return $p;
     158}
     159
     160function balise__VISITEUR_SINON_dist($p) {
     161        $p->code="'<'.'" . '?php } else { ?' . "'.'>'";
    89162        $p->interdire_scripts = false;
    90163        return $p;
    91164}
    92165
    93 function balise__VISITEUR_FINSI_dist($p) {
     166function balise__VISITEUR_FIN_dist($p) {
    94167        $p->code="'<'.'" . '?php }; ?' . "'.'>'";
    95168        $p->interdire_scripts = false;
     
    97170}
    98171 
    99 function balise__VISITEUR_SINON_dist($p) {
    100         $p->code="'<'.'" . '?php } else { ?' . "'.'>'";
    101         $p->interdire_scripts = false;
    102         return $p;
    103 }
    104  
    105 //
    106 // il faudrait aussi < et <=, preg_match et d'autres
    107 // donc cette balise inadaptée est OBSOLÈTE dès sa première publication
    108 //
    109 function balise__VISITEUR_SI_EGAL_dist($p) {
    110 
    111         $champ = interprete_argument_balise(1, $p);
    112         $_val = interprete_argument_balise(2, $p);
    113         if (!$champ) {
    114                 $champ = "'id_auteur'";
    115         }
    116         $p->code="'<'.'" . '?php if (extended_session_get("\' . ' . $champ . ' . \'") == "\' . ' . $_val . '.\'") { ?' . "'.'>'";
    117         $p->interdire_scripts = false;
    118         return $p;
    119 }
Note: See TracChangeset for help on using the changeset viewer.