source: spip-zone/_plugins_/macrosession/trunk/inc/macrosession_utils.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: 3.3 KB
Line 
1<?php
2if (!defined('_ECRIRE_INC_VERSION')) {
3        return;
4}
5
6
7if (!function_exists('existe_argument_balise')) {
8        // prolégomène à interprete_argument_balise
9        function existe_argument_balise ($n, $p) {
10                return (($p->param) && (!$p->param[0][0]) && (count($p->param[0])>$n));
11        };
12}
13
14/*
15 * Recevant un argument entre quotes (contenant par exemple un nom de filtre)
16 * trim_quote enlève les espaces de début et fin *à l'intérieur* des quotes
17 * ex : reçoit ' filtre ' (quotes comprises) et renvoie 'filtre'
18*/
19function trim_quote($f) {
20        $f = trim($f);  // c'est pas ça l'important
21        $l = strlen($f);
22        if ((strpos($f,"'")!== 0) or (strrpos($f,"'")!== $l-1))
23                return $f;
24        $r = '\''.trim(substr($f, 1, $l-2)).'\'';
25        return $r;
26}
27
28// une fonction pour le code de |? (la négation de choixsivide)
29function choix_selon ($test, $sioui, $sinon) {
30        return $test ? $sioui : $sinon;
31}
32
33
34//
35// Prépare une expression compilée à être réinjectée dans le code compilé
36//
37// OK pour une petite variété de formes syntaxiques : #ID_ARTICLE, #ID_ARTICLE|plus{1}, ...
38// À mieux tester et étendre en prenant autrement le pb
39//
40function reinjecte_expression_compilee($expr_org) {
41        if (isset($_GET['debug'])) {
42                echo "reinjecte_expression_compilee reçoit : <pre style='display: inline'>$expr_org </pre>";
43        }
44
45        $expr = $expr_org;
46        // #GET{aa} est implémenté par un appel à table_valeur
47        // On traduit en appels de tableau php
48        // Pour #GET, le 3eme argument de table_valeur est toujours 'null' donc osef
49        $expr = preg_replace (
50                '/table_valeur\((.*),(.*),.*\)/',
51                '$1[$2]',
52                $expr
53        );
54
55        if (($expr!=$expr_org) and isset($_GET['debug']))
56                echo "Passe par : <pre style='display:inline'>$expr</pre> ";
57
58        // Variables scalaires et tableaux multiniveaux
59        $expr = preg_replace(
60                '/@?(\$\w+(\[[^\]]*\])*)/',
61                '\'{$1}\'',
62                $expr);
63
64        if (isset($_GET['debug']))
65                echo "et renvoie : <pre>$expr</pre>";
66        return $expr;
67}
68
69function macrosession_pipe($q="!!! non défini !!!") {
70        if (isset($_GET['debug'])) {
71                echo "exec macrosession_pipe($q)<br>";
72        }
73        return $q;
74}
75
76/**
77 * @param $a
78 * @return string
79 */
80function macrosession_print($a) {
81        if (isset($_GET['debug']))
82                echo '<pre>'.print_r($a, 1).'</pre>';
83        return "''";
84}
85
86//
87/**
88 * @param string $macro         description du contexte d'appel (nom de la macro + arguments éventuellement)
89 * @param string $arg_name      nom de l'argument testé
90 * @param string $val           code compilé pour l'argument testé et devant être réinjecté
91 * @param array $p              pile contexte
92 * @param bool $contexte_ok     Désormais et pour l'instant inutilisé
93 *                              Indique si les motclé de référence au contexte sont acceptés : env, boucle, url, #GET{variable}, #BALISE
94  * @return bool
95 */
96function erreur_argument_macro($macro, $arg_name, $val, $p, $contexte_ok=false) {
97        if (substr($val, 0, 1) != "'") {
98                if ($contexte_ok)
99                        $contexte_ok = "Pour chercher dans les variables d'environnement ou d'url, vous pouvez utiliser 'env', 'boucle', 'url' et aussi '#BALISE' pour les balises reçues par le squelette, mais pas pour les champs de la boucle immédiatement englobante";
100                // if (isset($_GET['debug']))
101                erreur_squelette ("L'argument '$arg_name' de la macro '$macro' ne doit pas être une valeur calculée (".$val."). $contexte_ok", $p);
102                return true;
103        };
104        return false;
105}
Note: See TracBrowser for help on using the repository browser.