1 | <?php |
---|
2 | if (!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 | // |
---|
18 | function 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 '...' |
---|
38 | function 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 | */ |
---|
131 | function 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 | */ |
---|
152 | function 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 | |
---|
159 | function 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 | |
---|
165 | function balise__SESSION_FIN_dist($p) { |
---|
166 | $p->code = V_OUVRE_PHP.' } '.V_FERME_PHP; |
---|
167 | $p->interdire_scripts = false; |
---|
168 | return $p; |
---|
169 | } |
---|