Changeset 104057 in spip-zone


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

Location:
_plugins_/visiteur
Files:
9 added
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/visiteur/trunk/lang/paquet-visiteur_fr.php

    r99714 r104057  
    1010
    1111        // C
    12         'visiteur_nom' => 'Outils pour squelettes personnalisés selon le visiteur',
    13         'visiteur_slogan' => 'Macro #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FINSI pour accéder aux données de la session du visiteur courant et les tester efficacement dans un squelette (Développement, test de concepts, exploration de code).'
     12        'visiteur_nom' => 'Visiteurs efficaces',
     13        'visiteur_slogan' => 'Macros SPIP : #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FIN pour accéder aux données de la session du visiteur courant (ou à des données provenant dailleurs que la session SPIP locale), et les tester dans un squelette en suivant les recommandations webperf (cf https://contrib.spip.net/4611 ).',
    1414);
  • _plugins_/visiteur/trunk/paquet.xml

    r103864 r104057  
    22        prefix="visiteur"
    33        categorie="outil"
    4         version="0.4.1"
    5         etat="dev"
    6         compatibilite="[2.1.0;3.1.*]"
     4        version="0.5.0"
     5        etat="test"
     6        compatibilite="[2.1.0;3.2.*]"
    77        documentation="https://contrib.spip.net/4823"
    88>
    9         <nom>Outils pour squelettes personnalisés selon le visiteur</nom>
     9        <nom>Visiteurs efficaces</nom>
    1010        <!--
    11         macro SPIP : #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FINSI
    12         pour accéder aux données de la session du visiteur courant et les tester efficacement dans un squelette
    13         ou à des données de sessions étendues, provenant d'ailleurs que la session spip
     11        macros SPIP : #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FIN
     12        pour accéder aux données de la session du visiteur courant ou à des données de sessions étendues,
     13        et les tester efficacement dans un squelette en suivant les recommandations webperf
     14        (cf https://contrib.spip.net/4611 )
    1415        -->
    1516        <auteur lien="https://contrib.spip.net/JLuc">JLuc</auteur>
  • _plugins_/visiteur/trunk/plugin.xml

    r103720 r104057  
    11<plugin>
    2         <nom>visiteur</nom>
    3         <slogan>Outils pour squelettes personnalisés selon le visiteur</slogan>
     2        <nom>Visiteurs efficaces</nom>
     3        <slogan>Accéder aux données du visiteur en suivant recommandations webperf</slogan>
    44        <icon></icon>
    55        <auteur>JLuc, marcimat</auteur>
    66        <licence>GPL</licence>
    7         <version>0.4.1</version>
     7        <version>0.5.0</version>
    88        <etat>dev</etat>
    99        <description>
    10                 Macro #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FINSI pour accéder aux données de la session du visiteur courant et les tester efficacement dans un squelette (Développement, test de concepts, exploration de code).
     10        Macros SPIP : #_VISITEUR, #_VISITEUR_SI, #_VISITEUR_SINON, #_VISITEUR_FIN
     11        pour accéder aux données de la session du visiteur courant et les tester efficacement dans un squelette
     12        ou à des données de sessions étendues, provenant d'ailleurs que la session spip,
     13        dans le respect des recommandations webperf (cf https://contrib.spip.net/4611 )
    1114        </description>
    1215        <prefix>visiteur</prefix>
    13         <necessite id="SPIP" version="[2.1.0;3.1.99]" />
     16        <necessite id="SPIP" version="[2.1.0;3.2.99]" />
    1417        <categorie>outil</categorie>
    15         <lien>https://contrib.spip.net/4823</lien>
     18        <lien>http://contrib.spip.net/4823</lien>
    1619        <options>visiteurs_options.php</options>
    1720</plugin>
  • _plugins_/visiteur/trunk/readme/test cequilnefautpasfaire.html

    r103864 r104057  
    11<h4>Explications</h4>
    22
    3 voir https://contrib.spip.net/4823
     3voir http://contrib.spip.net/4823
    44
    55<h4>filtres et partie conditionnelle avant après sur une balise _VISITEUR_etc</h4>
  • _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.