source: spip-zone/_plugins_/macrosession/trunk/inc/_session.php @ 113654

Last change on this file since 113654 was 113654, checked in by jluc@…, 4 months ago

Refactoring du calcul des arguments calculés pour #_AUTORISER et aussi désormais pour #_SESSION
Les arguments des filtres utilisés par #_SESSION peuvent être des valeurs de l'environnement, des #GET{variable} et des #CHAMPS de la boucle courante.
Si un post-traitements est associé à un #CHAMP de boucle, il faut l'enlever avec une étoile #CHAMP* (le traitement de sécu reste). S'il y a besoin du traitement, il faut faire un #SET préalable, puis utiliser le #GET.
( Maieul : on peut surement faire #_SESSION_SI{id_auteur,==,#ID_AUTEUR} ... #_SESSION_FIN )

File size: 5.9 KB
Line 
1<?php
2if (!defined('_ECRIRE_INC_VERSION')) {
3        return;
4}
5
6//
7// Accés étendu aux données de session des visiteurs
8//
9// Aucun test n'est fait en amont sur la présence ou non d'une session :
10// le pipeline session_get peut être défini par ailleurs (autre plugin...)
11// Il reçoit un tableau avec 2 arguments : 'champ' contient le champ recherché,
12// et 'visiteur_session' contient la session en cours d'élaboration,
13// qu'il peut, ou non, utiliser pour le calcul ou la recherche de la valeur demandée
14//
15// Actuellement le pipeline n'est appelé que si la valeur demandée
16// n'est pas déjà présente dans la session globale SPIP de base...
17//
18function pipelined_session_get ($champ) {
19        if (!isset ($GLOBALS['visiteur_session'])
20                or !isset($GLOBALS['visiteur_session']['id_auteur'])    // il semble que ces précisions soient nécessaires
21                or !$GLOBALS['visiteur_session']['id_auteur'] )
22                return '';
23        elseif (isset ($GLOBALS['visiteur_session'][$champ]))
24                return $GLOBALS['visiteur_session'][$champ];
25
26        $session =
27                array ( 'champ' => $champ,
28                        'visiteur_session' => $GLOBALS['visiteur_session']);
29        $session = pipeline ('session_get', $session);
30        if (isset ($session['visiteur_session'][$champ]))
31                return $session['visiteur_session'][$champ];
32        else
33                return '';
34};
35
36// Appelé uniquement au recalcul pour la compilation
37// le code renvoyé sera inséré à l'intérieur d'un '...'
38function compile_appel_macro_session ($p) {
39        $champ = interprete_argument_balise(1, $p);
40        // $champ est entre quotes ''
41        if (!$champ)
42                $champ = "'id_auteur'";
43
44        if (erreur_argument_macro ('#_SESSION', 'champ', $champ, $p))
45                return "''";
46
47        $get_champ = "pipelined_session_get('.\"$champ\".')";
48
49        // champ sans application de filtre
50        if (!existe_argument_balise(2, $p))
51                return $get_champ;
52
53        // Application d'un filtre, récupéré entre quotes ''
54        $filtre = trim_quote(interprete_argument_balise (2, $p));
55        if (erreur_argument_macro ('#_SESSION', 'filtre', $filtre, $p))
56                return "''";
57
58        // le filtre est il en fait un opérateur unaire ?
59        if (in_array ($filtre, array ("'!'", "'non'"))) {
60                $unaire = trim ($filtre, "'");
61                switch ($unaire) {
62                        case '!':
63                                nobreak;
64                        case 'non' :
65                                return "(!$get_champ)";
66                                break;
67                }
68        }
69
70        if ($filtre=="'?'")
71                $filtre = "'choix_selon'";
72
73        // le filtre peut être appelé avec 0, un ou 2 arguments
74        $arg_un = $arg_deux = $virgule_arg_un = $virgule_arg_deux = '';
75
76        if (existe_argument_balise(3, $p)) {
77                $arg_un = trim_quote(interprete_argument_balise(3, $p));
78                if (isset($_GET['debug'])) {
79                        echo "_SESSION_SI\{$champ $filtre $arg_un}<br>";
80                }
81
82                if (strpos($arg_un,"'") !== 0) {
83                        // Exemple : @$Pile[0]['id_auteur'] pour #ID_AUTEUR
84                        // table_valeur($Pile["vars"], (string)'debut', null) pour #GET{debut}
85                        $arg_un = reinjecte_expression_compilee($arg_un);
86                }
87                // FIXME : erreur_argument_macro est insuffisant pour anticiper ici les erreurs de syntaxe php
88
89                $virgule_arg_un = ".', '.\"$arg_un\"";
90        };
91
92        // le filtre est il en fait un opérateur de comparaison ?
93        if (in_array ($filtre, array ("'=='", "'!='", "'<'", "'<='", "'>'", "'>='"))) {
94                $comparateur = trim ($filtre, "'");
95                return "($get_champ $comparateur '.\"$arg_un\".')";
96                // #_SESSION{nom,==,JLuc} donnera
97                // '<'.'?php  echo (pipelined_session_get('."'nom'".') == '."'JLuc'".');  ?'.'>'
98        }
99
100        if (existe_argument_balise(4, $p)) {
101                $arg_deux = trim_quote(interprete_argument_balise(4, $p));
102                if (strpos($arg_deux,"'") !== 0) {
103                        $arg_deux = reinjecte_expression_compilee($arg_deux);
104                }
105                $virgule_arg_deux = ".', '.\"$arg_deux\"";
106        };
107
108// produira par exemple ensuite :
109// '<'.'?php  echo appliquer_filtre(pipelined_session_get('."'nom'".'), '."'strlen'".');  ?'.'>'
110// ou '<'.'?php  echo appliquer_filtre( pipelined_session_get('."'nbreste'".'), '."'plus'" .', "'3'" .');  ?'.'>'
111        $r = "appliquer_filtre($get_champ, '.\"$filtre\" $virgule_arg_un $virgule_arg_deux .')";
112
113        if (isset($_GET['debug']))
114                echo "<b>compile_appel_macro_session renvoie :</b><pre>$r</pre>";
115        return $r;
116}
117
118
119//
120// Définition des balises
121// Attention : on ne peut PAS appliquer de filtre sur ces balises ni les utiliser dans une construction conditionnelle [avant(...) après]
122// Pour appliquer un filtre, utiliser la syntaxe dédiée avec un argument d'appel de la balise
123//
124
125/*
126 * #_SESSION rend l'id_auteur si l'internaute est connecté
127 * #_SESSION(champ) rend la valeur du champ de session étendue de l'internaute connecté
128 * #_SESSION(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
129 *
130 */
131function balise__SESSION_dist($p) {
132        $p->code = V_OUVRE_PHP . ' echo '. compile_appel_macro_session($p). '; ' . V_FERME_PHP;
133        $p->interdire_scripts = false;
134        // echo "On insèrera l'évaluation du code suivant : <pre>".$p->code."</pre>\n\n";
135        return $p;
136}
137
138/*
139 * #_SESSION_SI teste si l'internaute est authentifié
140 * #_SESSION_SI(champ) teste si le champ de session est non vide
141 * #_SESSION_SI(champ, val) teste si le champ de session est égal à val
142 *              C'est un raccourci pour #_SESSION_SI{champ,==,val}
143 * #_SESSION_SI(champ, operateur, val) teste si le champ de session se compare positivement à la valeur spécifiée
144 *      selon l'opérateur spécifié, qui peut etre
145 * - soit un comparateur : ==, <, >, >=, <=
146 * - soit un opérateur unaire : ! ou non
147 * - soit un filtre (nom de fonction) recevant 2 arguments : la valeur du champ et val.
148 *              C'est alors le retour qui est testé.
149 * Produit par exemple le code suivant :
150 *      '<'.'?php  if (pipelined_session_get('."'nom'".')) {  ?'.'>'
151*/
152function balise__SESSION_SI_dist($p) {
153        // Appelé uniquement au recalcul
154        $p->code = V_OUVRE_PHP . 'if ('.compile_appel_macro_session($p).') { ' . V_FERME_PHP;
155        $p->interdire_scripts = false;
156        return $p;
157}
158
159function balise__SESSION_SINON_dist($p) {
160        $p->code = V_OUVRE_PHP.' } else { '.V_FERME_PHP;
161        $p->interdire_scripts = false;
162        return $p;
163}
164
165function balise__SESSION_FIN_dist($p) {
166        $p->code = V_OUVRE_PHP.' } '.V_FERME_PHP;
167        $p->interdire_scripts = false;
168        return $p;
169}
Note: See TracBrowser for help on using the repository browser.