Utilisation des constantes dans l'espace publique

Bonjour

je viens d'écrire le bout de code suivant (en partie pompé depuis le fichier /prive/formulaires/inc-instituer_auteur.html) :

#SET{statuts_auteurs,#VAL{_STATUT_AUTEUR_RUBRIQUE}|constant|explode{','}}

puis...

[(#SESSION{statut}|in_array{#GET{statuts_auteurs}}|oui)
...
]

Mais cela me renvoi l'erreur PHP suivante :

Warning: constant() [function.constant]: Couldn't find constant _STATUT_AUTEUR_RUBRIQUE in /tmp/cache/skel/html_ec6f7545d091ead95b9fec2d03763737.php on line 78

Cette erreur disparait avec ?var_mode=calcul

D'où ma question : est-il possible d'utiliser des constantes dans les squelettes ?

Peetdu

Oupsss...j'ai oublié de préciser que j'utilise SPIP 3.0.16

merciii
P.

Le 24/07/2014 17:12, Peetdu a écrit :

Bonjour

je viens d'écrire le bout de code suivant (en partie pompé depuis le
fichier /prive/formulaires/inc-instituer_auteur.html) :

#SET{statuts_auteurs,#VAL{_STATUT_AUTEUR_RUBRIQUE}|constant|explode{','}}

puis...

[(#SESSION{statut}|in_array{#GET{statuts_auteurs}}|oui)
...
]

Mais cela me renvoi l'erreur PHP suivante :

Warning: constant() [function.constant]: Couldn't find constant
_STATUT_AUTEUR_RUBRIQUE in
/tmp/cache/skel/html_ec6f7545d091ead95b9fec2d03763737.php on line 78

Cette erreur disparait avec ?var_mode=calcul

D'où ma question : est-il possible d'utiliser des constantes dans les
squelettes ?

Peetdu

Bonjour,

As-tu essayé avec #EVAL ?

Soit [(#EVAL{_STATUT_AUTEUR_RUBRIQUE}|explode{’,’})]

Bonjour,

Je ne pense pas que ce soit une question de syntaxe SPIP,mais plutôt une question de portée des constantes dans les squelettes SPIP de la partie publique.

Ce que je ne comprend pas, c'est pourquoi mon code fonctionne avec ...?var_mode=calcul et sinon me renvoi l'erreur "Couldn't find constant
_STATUT_AUTEUR_RUBRIQUE" ?

P.

Le 24/07/2014 18:23, Ybbet Spip a écrit :

Bonjour,

As-tu essayé avec #EVAL ?
Soit [(#EVAL{_STATUT_AUTEUR_RUBRIQUE}|explode{','})]

Ybbet

Le 24 juillet 2014 17:29, Peetdu <peetdu@gmail.com
<mailto:peetdu@gmail.com>> a écrit :

    Oupsss...j'ai oublié de préciser que j'utilise SPIP 3.0.16

    merciii
    P.

    Le 24/07/2014 17:12, Peetdu a écrit :

        Bonjour

        je viens d'écrire le bout de code suivant (en partie pompé depuis le
        fichier /prive/formulaires/inc-__instituer_auteur.html) :

        #SET{statuts_auteurs,#VAL{___STATUT_AUTEUR_RUBRIQUE}|__constant|explode{','}}

        puis...

        [(#SESSION{statut}|in_array{#__GET{statuts_auteurs}}|oui)
        ...
        ]

        Mais cela me renvoi l'erreur PHP suivante :

        Warning: constant() [function.constant]: Couldn't find constant
        _STATUT_AUTEUR_RUBRIQUE in
        /tmp/cache/skel/html___ec6f7545d091ead95b9fec2d037637__37.php on
        line 78

        Cette erreur disparait avec ?var_mode=calcul

        D'où ma question : est-il possible d'utiliser des constantes
        dans les
        squelettes ?

        Peetdu

    _________________________________________________
    liste spip
    spip@rezo.net <mailto:spip@rezo.net> - désabonnement : envoyer un
    mail à spip-off@rezo.net <mailto:spip-off@rezo.net>

    Infos et archives : http://listes.rezo.net/__mailman/listinfo/spip
    <http://listes.rezo.net/mailman/listinfo/spip&gt;
    Discuter chez rezo.net
    <Discuter chez rezo.net;

    Documentation de SPIP : http://www.spip.net/

    Irc : de l'aide à toute heure : http://spip.net/irc

Ca n’est à coup sûr pas une question de portée des constantes, parce qu’une règle fondamentale de PHP c’est que les constantes ont une portée globale… une fois qu’elles sont définies.
D’où l’hypothèse que cette constante n’est définie que lorsqu’on a donné le paramètre var_mode=calcul.

Tu peux le vérifier comme moi en insérant ce petit bout de code dans le d’un squelette :

_STATUT_AUTEUR_RUBRIQUE: <?php if(defined('_STATUT_AUTEUR_RUBRIQUE')) { echo 'defined, value = "'._STATUT_AUTEUR_RUBRIQUE.'"'; } else { echo 'unknown'; } ?>

Effectivement, ça répond “unknown” dans le cas général, et ça rend la valeur si on a mis var_mode=calcul.
(idem avec var_mode=recalcul et var_mode=debug, d’ailleurs)

Moralité :

  1. c’est le choix de Spip, qui a besoin de cette constante seulement dans les cas var_mode=calcul/recalcul/debut, et on n’y peut rien
  2. il faut donc chercher une autre source Spip pour l’information que tu veux utiliser

Etant plus PHPiste que Spipien, je laisse à d’autres le soin de répondre à la partie 2, mais à mon avis ça ne doit pas être un gros deal…

Fred

From: Peetdu
Sent: Friday, July 25, 2014 1:38 PM
To: spip@rezo.net
Subject: Re: [Spip] Utilisation des constantes dans l’espace publique

Bonjour,

Je ne pense pas que ce soit une question de syntaxe SPIP,mais plutôt une
question de portée des constantes dans les squelettes SPIP de la partie
publique.

Ce que je ne comprend pas, c’est pourquoi mon code fonctionne avec
…?var_mode=calcul et sinon me renvoi l’erreur « Couldn’t find constant
_STATUT_AUTEUR_RUBRIQUE » ?

P.

Le 24/07/2014 18:23, Ybbet Spip a écrit :

Bonjour,

As-tu essayé avec #EVAL ?
Soit [(#EVAL{_STATUT_AUTEUR_RUBRIQUE}|explode{‹ , ›})]

Ybbet

Le 24 juillet 2014 17:29, Peetdu <peetdu@gmail.com
mailto:peetdu@gmail.com> a écrit :

Oupsss…j’ai oublié de préciser que j’utilise SPIP 3.0.16

merciii
P.

Le 24/07/2014 17:12, Peetdu a écrit :

Bonjour

je viens d’écrire le bout de code suivant (en partie pompé depuis le
fichier /prive/formulaires/inc-__instituer_auteur.html) :

#SET{statuts_auteurs,#VAL{___STATUT_AUTEUR_RUBRIQUE}|__constant|explode{‹ , ›}}

puis…

[(#SESSION{statut}|in_array{#__GET{statuts_auteurs}}|oui)

]

Mais cela me renvoi l’erreur PHP suivante :

Warning: constant() [function.constant]: Couldn’t find constant
_STATUT_AUTEUR_RUBRIQUE in
/tmp/cache/skel/html___ec6f7545d091ead95b9fec2d037637__37.php on
line 78

Cette erreur disparait avec ?var_mode=calcul

D’où ma question : est-il possible d’utiliser des constantes
dans les
squelettes ?

Peetdu


liste spip
spip@rezo.net mailto:spip@rezo.net - désabonnement : envoyer un
mail à spip-off@rezo.net mailto:spip-off@rezo.net

Infos et archives : http://listes.rezo.net/__mailman/listinfo/spip
http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Le 25/07/2014 15:54, cFreed a écrit :

Ca n’est à coup sûr pas une question de portée des constantes, parce
qu’une règle fondamentale de PHP c’est que les constantes ont une portée
globale... une fois qu’elles sont définies.
D’où l’hypothèse que cette constante n’est définie que lorsqu’on a donné
le paramètre var_mode=calcul.

Effectivement, une constante en PHP est définie de manière globale, quel que soit l'endroit où elle a été définie.

En fait, _STATUT_AUTEUR_RUBRIQUE est déclarée dans ecrire/inc/autoriser.php, et mon petit doigt me dit que ce fichier est incus lors du calcul de la page (pour calculer les autorisations) mais qu'il n'est plus inclus lors des affichages suivants (page en cache, autorisations déjà calculées).

D'ailleurs, elle est précédée d'un underscore, qui indique souvent l'intention d'un usage plus ou moins privé pour une variable/constante/fonction.

Et sinon, c'est bien #EVAL qui permet d'interpréter une constante PHP depuis un squelette.
#VAL permet d'utiliser une valeur (chaine, caractère) mais pas interprétée, le plus souvent utilisée pour passer une valeur à un filtre.

--
nicod_

Le 25/07/2014 23:22, nicod_ a écrit :

#VAL permet d'utiliser une valeur (chaine, caractère) mais pas
interprétée, le plus souvent utilisée pour passer une valeur à un filtre.

Mais [(#VAL{CONSTANTE}|constant)] peut fonctionner, avec justement le filtre constant()

--
nicod_

Ok. Merci à tous pour vos indications.

Tout d'abord, après test :
#VAL{_STATUT_AUTEUR_RUBRIQUE}|constant|explode{','}}
est effectivement équivalent à
#EVAL{_STATUT_AUTEUR_RUBRIQUE}|explode{','}}

Ensuite, je viens de relire le fichier inc_fichier.php qui permet de comprendre pas mal de chose. Ce fichier étant "la clé de voute de l’architecture SPIP" (voir Mécanismes de fabrication des pages publiques et privées - SPIP).
Il défini ainsi certaines constantes qui seront accessibles aussi bien dans l'espace publique que privé. Comme par exemple :

_PHP_MIN
_ECRIRE_INC_VERSION
_LOG_HS
etc.

...des trucs pas très utiles dans des squelettes :slight_smile:

Mais toujours dans ce même fichier (ligne 366) on voit le code suivant :

> if (test_espace_prive()) include_spip('inc/autoriser');

Ce qui expliquerait pourquoi la constante _STATUT_AUTEUR_RUBRIQUE (entre autres) est accessible dans la partie privée mais pas la partie publique.

Serait-il juste de dire que les constantes ont une portée global DANS LE CONTEXTE où elles ont été définies ?

Enfin, avoir _STATUT_AUTEUR_RUBRIQUE à portée des squelettes de l'espace publique serait tout de même sympa :
1- cela pourrait simplifier le code sur des projets comportant des accès restreints;
2- cela permettrait de "piloter" depuis le back-office quels statuts pourraient accéder à tel ou tel squelette...

J'ai bien envie de faire un ticket ? Qu'en pensez-vous

P.

Le 25/07/2014 23:37, nicod_ a écrit :

Le 25/07/2014 23:22, nicod_ a écrit :

#VAL permet d'utiliser une valeur (chaine, caractère) mais pas
interprétée, le plus souvent utilisée pour passer une valeur à un filtre.

Mais [(#VAL{CONSTANTE}|constant)] peut fonctionner, avec justement le
filtre constant()
PHP: constant - Manual

Le 28/07/2014 10:31, Peetdu a écrit :

Serait-il juste de dire que les constantes ont une portée global DANS LE CONTEXTE où elles ont été définies ?

Bof.
C'est surtout que les constantes n'existent que si elles ont été définies !

Enfin, avoir _STATUT_AUTEUR_RUBRIQUE à portée des squelettes de l'espace publique serait tout de même sympa :
1- cela pourrait simplifier le code sur des projets comportant des accès restreints;
2- cela permettrait de "piloter" depuis le back-office quels statuts pourraient accéder à tel ou tel squelette...
J'ai bien envie de faire un ticket ? Qu'en pensez-vous

N'y a t il pas déjà des fonctions et outils, dans le plugin acces restreint, pour gérer ces besoins ?

JLuc