Variables globales

Salut,

je cherche à définir des variables globales pour m’en servir à plusieurs endroits et éviter ainsi de devoir les redéfinir dans plusieurs squelettes.

J’ai donc déclaré ma variable dans mon fichier mes_fonctions.php comme ceci :
$GLOBALS [‹ ma_variable ›] = toto;

Pour les récupérer, je n’ai pas trouvé d’autre solution que de créer des balises SPIP (comme indiqué ici ): Du coup, je peux utiliser ma nouvelle balise directement dans les squelettes. Bon, ça marche, c’est même assez pratique, mais je me demande si il n’y a pas plus simple (je ne maitrise pas vraiment tout ce que ça implique en terme de ressources, si c’est optimisé…). Si vous avez des retours là dessus… Merci, jean marie

Bonjour Jean-Marie,

Effectivement, il y a plus simple sans créer de balise SPIP.

Tu peux récupérer une variable PHP dans SPIP via la balise #EVAL (http://www.spip.net/fr_article4587.html).

Dans ton cas, cela donnerait : #EVAL{$GLOBALS[‹ ma_variable ›]}.

Cordialement,

Cédric JOUANNIN

Salut Cédric,

merci pour ta réponse, ça fonctionne effectivement...

Par contre, je n'arrive pas à appliquer des filtres ni à faire des tests avec #EVAL (si tout marchait du 1er coup, ça serait pas marrant :slight_smile: ).

*Le test avec ma variable 'jour_aujourdhui' (qui est une date**):*
Dans mes_options.php : $GLOBALS ['jour_aujourdhui'] = date("w"); (retourne le numéro du jour dans la semaine : jeudi = 4)
Dans mon squelette : [(#EVAL{$GLOBALS['jour_aujourdhui']}|=={4}|?{'oui','non'})] ne fonctionne pas.
Par contre, si je passe par une variable locale, le test fonctionne:
#SET{variable_locale,#EVAL{$GLOBALS['jour_aujourdhui']}}
[(#GET{variable_locale}|=={3}|?{'oui','non'})]

*Idem pour les filtres:**je veux sortir les numéros des jours (pas qu'aujourd'hui) dans le mois*
Dans mes_options.php : $GLOBALS ['jour0'] = date('Y-m-d 00:00:00',date('U')); (retourne la date sous la forme Y-m-d 00:00:00)
Dans mon squelette : [(#EVAL{$GLOBALS['jour0']}|affdate)] ne fonctionne pas
Par contre, via une variable, pas de problème:
#SET{variable_locale,#EVAL{$GLOBALS['jour0']}}
[(#GET{variable_locale}|jour)]

Ca doit être lié à ma syntaxe, mais je ne trouve pas...
Et les , {} et () commencent à se mélanger dans mon cerveau :slight_smile:

Merci,

             jean marie

Le 11/06/2014 17:20, jouannin cedric a écrit :

Bonjour Jean-Marie,

Effectivement, il y a plus simple sans créer de balise SPIP.

Tu peux récupérer une variable PHP dans SPIP via la balise #EVAL (#EVAL - SPIP).

Dans ton cas, cela donnerait : #EVAL{$GLOBALS['ma_variable']}.

Cordialement,

Cédric JOUANNIN

*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* mercredi 11 juin 2014 17:07
*À :* Liste SPIP User
*Objet :* [Spip] Variables globales

Salut,

je cherche à définir des variables globales pour m'en servir à plusieurs endroits et éviter ainsi de devoir les redéfinir dans plusieurs squelettes.

J'ai donc déclaré ma variable dans mon fichier mes_fonctions.php comme ceci :
$GLOBALS ['ma_variable'] = toto;

Pour les récupérer, je n'ai pas trouvé d'autre solution que de créer des balises SPIP (comme indiqué ici https://www.mail-archive.com/spip@rezo.net/msg04173.html):
function balise_MA_VARIABLE_dist($p) {
       $p->code = "sinon(\$GLOBALS['ma_variable'],'.')";
       $p->code = "htmlspecialchars(".$p->code.")";
       $p->interdire_scripts = false;
       return $p;
}

Du coup, je peux utiliser ma nouvelle balise #MA_VARIABLE directement dans les squelettes.
Bon, ça marche, c'est même assez pratique, mais je me demande si il n'y a pas plus simple (je ne maitrise pas vraiment tout ce que ça implique en terme de ressources, si c'est optimisé...).

Si vous avez des retours là dessus...

Merci,

            jean marie

Bonjour Jean-Marie,

OK, je cerne mieux tes besoins avec les exemples spécifiés.

La déclaration d’une variable globale PHP n’est peut-être pas la meilleure solution.

Effectivement, dans ton cas précis, la balise #EVAL posera problème pour des tests ou filtres si des crochets sont insérés dedans, ce qui est le cas avec {$GLOBALS[‹ jour_aujourdhui ›], car ceux-ci semblent provoquer des incompatibilités avec le syntaxe de délimitation des bornes de balises SPIP : [(#BALISE_SPIP)].

En analysant tes exemples, il semble que tes besoins de variable globale soient liés à la notion de date, retournée avec une contrainte de format.

Il te serait peut-être plus simple d’utiliser la balise SPIP #DATE, avec les filtres de date adaptés, qui permettront de retourner la date dans les mêmes formats que dans tes exemples, par exemple [(#DATE|affdate{‹ Y-m-d 00:00:00 ›})] permettait de remplacer ta variable globale

$GLOBALS [‹ jour0 ›] = date(‹ Y-m-d 00:00:00 ›,date(‹ U ›));.

Après, ton idée de variable globale est peut-être liée au fait que la balise #DATE découle du contexte de boucle courante, et retourne donc soit la date du jour (si présent en dehors de toute boucle), soit la date du dernier article par exemple (si présent dans une boucle ARTICLE), ce qui pouvait te poser problème si tu souhaitais qu’elle ne retourne que la date du jour, quel que soit le contexte.

Si tel est le cas, le plugin « Couteau suisse » pourrait être une bonne solution.

En dehors de toutes les fonctionnalités bien utiles qu’il propose (cryptage des adresses email, ajout de raccourcis typographiques, …), l’option « Trousse à balises » (dans « Balises, filtres et critères ») permet notamment d’ajouter une nouvelle balise #MAINTENANT, indépendante de tout contexte de boucle, qui retourne systématiquement la date courante.

Il te suffirait d’utiliser dans tes squelettes cette balise avec les filtres de date adaptés, comme évoqué ci-dessus, par exemple [(#MAINTENANT|affdate{‹ Y-m-d 00:00:00 ›})], et cela ne devrait plus poser de problème d’incompatibilité avec la syntaxe des tests SPIP.

Voilà, cela me semblerait plus propre ainsi.

Cordialement,

Cédric JOUANNIN

En fait, je suis en train de faire le site d'un cinéma: http://image.cousumain.info (en chantier)

Du coup, je construis la grille à partir de la date d'aujourd'hui avec des tests pour savoir si on est mercredi (ou sinon pour trouver mercredi dernier), des calculs (pour J+1, J+2), quel est le numéro de jour dans la semaine (jour mis en avant) et en utilisant le plugin Séances...
Bref, un joyeux chantier de crochets, d'accolades et de parenthèses :slight_smile:

Mais peut être que je ne peux tout simplement pas utiliser les variables globales. C'était avant tout pour simplifier mon code, mais visiblement, ça le complique par ailleurs...

Merci en tout cas d'avoir pris le temps de répondre à mes questions...

             jean marie

Le 12/06/2014 15:43, jouannin cedric a écrit :

Bonjour Jean-Marie,

OK, je cerne mieux tes besoins avec les exemples spécifiés.

La déclaration d'une variable globale PHP n'est peut-être pas la meilleure solution.

Effectivement, dans ton cas précis, la balise #EVAL posera problème pour des tests ou filtres si des crochets sont insérés dedans, ce qui est le cas avec {$GLOBALS['jour_aujourdhui'], car ceux-ci semblent provoquer des incompatibilités avec le syntaxe de délimitation des bornes de balises SPIP : [(#BALISE_SPIP)].

En analysant tes exemples, il semble que tes besoins de variable globale soient liés à la notion de date, retournée avec une contrainte de format.

Il te serait peut-être plus simple d'utiliser la balise SPIP #DATE, avec les filtres de date adaptés, qui permettront de retourner la date dans les mêmes formats que dans tes exemples, par exemple [(#DATE|affdate{'Y-m-d 00:00:00'})]permettait de remplacer ta variable globale

$GLOBALS ['jour0'] = date('Y-m-d 00:00:00',date('U'));.

Après, ton idée de variable globale est peut-être liée au fait que la balise #DATE découle du contexte de boucle courante, et retourne donc soit la date du jour (si présent en dehors de toute boucle), soit la date du dernier article par exemple (si présent dans une boucle ARTICLE), ce qui pouvait te poser problème si tu souhaitais qu'elle ne retourne que la date du jour, quel que soit le contexte.

Si tel est le cas, le plugin « Couteau suisse » pourrait être une bonne solution.

En dehors de toutes les fonctionnalités bien utiles qu'il propose (cryptage des adresses email, ajout de raccourcis typographiques, ...), l'option « Trousse à balises » (dans « Balises, filtres et critères ») permet notamment d'ajouter une nouvelle balise #MAINTENANT, indépendante de tout contexte de boucle, qui retourne systématiquement la date courante.

Il te suffirait d'utiliser dans tes squelettes cette balise avec les filtres de date adaptés, comme évoqué ci-dessus, par exemple [(#MAINTENANT|affdate{'Y-m-d 00:00:00'})], et cela ne devrait plus poser de problème d'incompatibilité avec la syntaxe des tests SPIP.

Voilà, cela me semblerait plus propre ainsi.

Cordialement,

Cédric JOUANNIN

*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* jeudi 12 juin 2014 14:43
*À :* Liste SPIP User
*Objet :* Re: [Spip] Variables globales

Salut Cédric,

merci pour ta réponse, ça fonctionne effectivement...

Par contre, je n'arrive pas à appliquer des filtres ni à faire des tests avec #EVAL (si tout marchait du 1er coup, ça serait pas marrant :slight_smile: ).

*Le test avec ma variable 'jour_aujourdhui' (qui est une date):*
Dans mes_options.php : $GLOBALS ['jour_aujourdhui'] = date("w"); (retourne le numéro du jour dans la semaine : jeudi = 4)
Dans mon squelette : [(#EVAL{$GLOBALS['jour_aujourdhui']}|=={4}|?{'oui','non'})] ne fonctionne pas.
Par contre, si je passe par une variable locale, le test fonctionne:
#SET{variable_locale,#EVAL{$GLOBALS['jour_aujourdhui']}}
[(#GET{variable_locale}|=={3}|?{'oui','non'})]

*Idem pour les filtres: je veux sortir les numéros des jours (pas qu'aujourd'hui) dans le mois*
Dans mes_options.php : $GLOBALS ['jour0'] = date('Y-m-d 00:00:00',date('U')); (retourne la date sous la forme Y-m-d 00:00:00)
Dans mon squelette : [(#EVAL{$GLOBALS['jour0']}|affdate)] ne fonctionne pas
Par contre, via une variable, pas de problème:
#SET{variable_locale,#EVAL{$GLOBALS['jour0']}}
[(#GET{variable_locale}|jour)]

Ca doit être lié à ma syntaxe, mais je ne trouve pas...
Et les , {} et () commencent à se mélanger dans mon cerveau :slight_smile:

Merci,

            jean marie

Le 11/06/2014 17:20, jouannin cedric a écrit :

    Bonjour Jean-Marie,

    Effectivement, il y a plus simple sans créer de balise SPIP.

    Tu peux récupérer une variable PHP dans SPIP via la balise #EVAL
    (#EVAL - SPIP).

    Dans ton cas, cela donnerait : #EVAL{$GLOBALS['ma_variable']}.

    Cordialement,

    Cédric JOUANNIN

    *De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
    *Envoyé :* mercredi 11 juin 2014 17:07
    *À :* Liste SPIP User
    *Objet :* [Spip] Variables globales

    Salut,

    je cherche à définir des variables globales pour m'en servir à
    plusieurs endroits et éviter ainsi de devoir les redéfinir dans
    plusieurs squelettes.

    J'ai donc déclaré ma variable dans mon fichier mes_fonctions.php
    comme ceci :
    $GLOBALS ['ma_variable'] = toto;

    Pour les récupérer, je n'ai pas trouvé d'autre solution que de
    créer des balises SPIP (comme indiqué ici
    https://www.mail-archive.com/spip@rezo.net/msg04173.html):
    function balise_MA_VARIABLE_dist($p) {
           $p->code = "sinon(\$GLOBALS['ma_variable'],'.')";
           $p->code = "htmlspecialchars(".$p->code.")";
           $p->interdire_scripts = false;
           return $p;
    }

    Du coup, je peux utiliser ma nouvelle balise #MA_VARIABLE
    directement dans les squelettes.
    Bon, ça marche, c'est même assez pratique, mais je me demande si
    il n'y a pas plus simple (je ne maitrise pas vraiment tout ce que
    ça implique en terme de ressources, si c'est optimisé...).

    Si vous avez des retours là dessus...

    Merci,

                jean marie

Bonjour,

Ça peut être utile :

3 fonctions qui servent de filtres sur des balises « date »

Il y a moyen de simplifier les écritures SPIP en passant par des filtres « maison »

À placer dans « mes_options.php »

//début de semaine à partir d’une date

function debut_semaine($date) {

$ladate = strtotime($date);

return date(‹ Y-m-d ›,$ladate - (243600date(‹ w ›,$ladate)));

}

//fin de semaine à partir d’une date

function fin_semaine($date) {

$ladate = strtotime($date);

return date(‹ Y-m-d ›,$ladate + (243600(6-date(‹ w ›,$ladate))));

}

// numéro de semaine à partir d’une date

function semaine($date) {

$ts = strtotime($date);

if (date(‹ w ›,$ts) == 0) {

//commencer la semaine le Dimanche pour que ca colle

//avec les deux autres filtres.

return (date(‹ W ›,$ts)-1)%52;

} else {

return date(‹ W ›,$ts);

}

}

RB

Salut RB,

c'est effectivement la fonction strtotime() que j'utilise (merci b_b :wink: ) mais en syntaxe SPIP dans mon squelette:
http://spip.pastebin.fr/36125

Pour info, strtotime() permet d'utiliser des paramètres comme "next Thursday" ou "+2 days" pour éviter de se planter dans les calculs:

             jean marie

Le 12/06/2014 16:35, Bur. Roger Burton a écrit :

Bonjour,

Ça peut être utile :

3 fonctions qui servent de filtres sur des balises « date »

Il y a moyen de simplifier les écritures SPIP en passant par des filtres « maison »

À placer dans « mes_options.php »

//début de semaine à partir d'une date

function debut_semaine($date) {

   $ladate = strtotime($date);

   return date('Y-m-d',$ladate - (24*3600*date('w',$ladate)));

}

//fin de semaine à partir d'une date

function fin_semaine($date) {

$ladate = strtotime($date);

return date('Y-m-d',$ladate + (24*3600*(6-date('w',$ladate))));

}

// numéro de semaine à partir d'une date

function semaine($date) {

$ts = strtotime($date);

if (date('w',$ts) == 0) {

//commencer la semaine le Dimanche pour que ca colle

//avec les deux autres filtres.

return (date('W',$ts)-1)%52;

} else {

return date('W',$ts);

}

}

RB

*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* jeudi 12 juin 2014 16:17
*À :* Liste SPIP User
*Objet :* Re: [Spip] Variables globales

En fait, je suis en train de faire le site d'un cinéma: http://image.cousumain.info (en chantier)

Du coup, je construis la grille à partir de la date d'aujourd'hui avec des tests pour savoir si on est mercredi (ou sinon pour trouver mercredi dernier), des calculs (pour J+1, J+2), quel est le numéro de jour dans la semaine (jour mis en avant) et en utilisant le plugin Séances...
Bref, un joyeux chantier de crochets, d'accolades et de parenthèses :slight_smile:

Mais peut être que je ne peux tout simplement pas utiliser les variables globales. C'était avant tout pour simplifier mon code, mais visiblement, ça le complique par ailleurs...

Merci en tout cas d'avoir pris le temps de répondre à mes questions...

            jean marie

Le 12/06/2014 15:43, jouannin cedric a écrit :

    Bonjour Jean-Marie,

    OK, je cerne mieux tes besoins avec les exemples spécifiés.

    La déclaration d'une variable globale PHP n'est peut-être pas la
    meilleure solution.

    Effectivement, dans ton cas précis, la balise #EVAL posera
    problème pour des tests ou filtres si des crochets sont insérés
    dedans, ce qui est le cas avec {$GLOBALS['jour_aujourdhui'], car
    ceux-ci semblent provoquer des incompatibilités avec le syntaxe de
    délimitation des bornes de balises SPIP : [(#BALISE_SPIP)].

    En analysant tes exemples, il semble que tes besoins de variable
    globale soient liés à la notion de date, retournée avec une
    contrainte de format.

    Il te serait peut-être plus simple d'utiliser la balise SPIP
    #DATE, avec les filtres de date adaptés, qui permettront de
    retourner la date dans les mêmes formats que dans tes exemples,
    par exemple [(#DATE|affdate{'Y-m-d 00:00:00'})]permettait de
    remplacer ta variable globale

    $GLOBALS ['jour0'] = date('Y-m-d 00:00:00',date('U'));.

    Après, ton idée de variable globale est peut-être liée au fait que
    la balise #DATE découle du contexte de boucle courante, et
    retourne donc soit la date du jour (si présent en dehors de toute
    boucle), soit la date du dernier article par exemple (si présent
    dans une boucle ARTICLE), ce qui pouvait te poser problème si tu
    souhaitais qu'elle ne retourne que la date du jour, quel que soit
    le contexte.

    Si tel est le cas, le plugin « Couteau suisse » pourrait être une
    bonne solution.

    En dehors de toutes les fonctionnalités bien utiles qu'il propose
    (cryptage des adresses email, ajout de raccourcis typographiques,
    ...), l'option « Trousse à balises » (dans « Balises, filtres et
    critères ») permet notamment d'ajouter une nouvelle balise
    #MAINTENANT, indépendante de tout contexte de boucle, qui retourne
    systématiquement la date courante.

    Il te suffirait d'utiliser dans tes squelettes cette balise avec
    les filtres de date adaptés, comme évoqué ci-dessus, par exemple
    [(#MAINTENANT|affdate{'Y-m-d 00:00:00'})], et cela ne devrait plus
    poser de problème d'incompatibilité avec la syntaxe des tests SPIP.

    Voilà, cela me semblerait plus propre ainsi.

    Cordialement,

    Cédric JOUANNIN

    *De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
    *Envoyé :* jeudi 12 juin 2014 14:43
    *À :* Liste SPIP User
    *Objet :* Re: [Spip] Variables globales

    Salut Cédric,

    merci pour ta réponse, ça fonctionne effectivement...

    Par contre, je n'arrive pas à appliquer des filtres ni à faire des
    tests avec #EVAL (si tout marchait du 1er coup, ça serait pas
    marrant :slight_smile: ).

    *Le test avec ma variable 'jour_aujourdhui' (qui est une date):*
    Dans mes_options.php : $GLOBALS ['jour_aujourdhui'] = date("w");
    (retourne le numéro du jour dans la semaine : jeudi = 4)
    Dans mon squelette :
    [(#EVAL{$GLOBALS['jour_aujourdhui']}|=={4}|?{'oui','non'})] ne
    fonctionne pas.
    Par contre, si je passe par une variable locale, le test fonctionne:
    #SET{variable_locale,#EVAL{$GLOBALS['jour_aujourdhui']}}
    [(#GET{variable_locale}|=={3}|?{'oui','non'})]

    *Idem pour les filtres: je veux sortir les numéros des jours (pas
    qu'aujourd'hui) dans le mois*
    Dans mes_options.php : $GLOBALS ['jour0'] = date('Y-m-d
    00:00:00',date('U')); (retourne la date sous la forme Y-m-d 00:00:00)
    Dans mon squelette : [(#EVAL{$GLOBALS['jour0']}|affdate)] ne
    fonctionne pas
    Par contre, via une variable, pas de problème:
    #SET{variable_locale,#EVAL{$GLOBALS['jour0']}}
    [(#GET{variable_locale}|jour)]

    Ca doit être lié à ma syntaxe, mais je ne trouve pas...
    Et les , {} et () commencent à se mélanger dans mon cerveau :slight_smile:

    Merci,

                jean marie

    Le 11/06/2014 17:20, jouannin cedric a écrit :

        Bonjour Jean-Marie,

        Effectivement, il y a plus simple sans créer de balise SPIP.

        Tu peux récupérer une variable PHP dans SPIP via la balise
        #EVAL (#EVAL - SPIP).

        Dans ton cas, cela donnerait : #EVAL{$GLOBALS['ma_variable']}.

        Cordialement,

        Cédric JOUANNIN

        *De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
        *Envoyé :* mercredi 11 juin 2014 17:07
        *À :* Liste SPIP User
        *Objet :* [Spip] Variables globales

        Salut,

        je cherche à définir des variables globales pour m'en servir à
        plusieurs endroits et éviter ainsi de devoir les redéfinir
        dans plusieurs squelettes.

        J'ai donc déclaré ma variable dans mon fichier
        mes_fonctions.php comme ceci :
        $GLOBALS ['ma_variable'] = toto;

        Pour les récupérer, je n'ai pas trouvé d'autre solution que de
        créer des balises SPIP (comme indiqué ici
        https://www.mail-archive.com/spip@rezo.net/msg04173.html):
        function balise_MA_VARIABLE_dist($p) {
               $p->code = "sinon(\$GLOBALS['ma_variable'],'.')";
               $p->code = "htmlspecialchars(".$p->code.")";
               $p->interdire_scripts = false;
               return $p;
        }

        Du coup, je peux utiliser ma nouvelle balise #MA_VARIABLE
        directement dans les squelettes.
        Bon, ça marche, c'est même assez pratique, mais je me demande
        si il n'y a pas plus simple (je ne maitrise pas vraiment tout
        ce que ça implique en terme de ressources, si c'est optimisé...).

        Si vous avez des retours là dessus...

        Merci,

                    jean marie

Le 12/06/2014 16:35, Bur. Roger Burton a écrit :

Bonjour,

Ça peut être utile :

3 fonctions qui servent de filtres sur des balises « date »

Il y a moyen de simplifier les écritures SPIP en passant par des
filtres « maison »

À placer dans « mes_options.php »

Bonjour,

il me semble que mes filtres maisons doivent être placés dans
mes_fonctions.php

Je me trompe?

Oups, oui ... bien sûr.

-----Message d'origine-----
De : Grégoire [mailto:gobmouch@online.fr]
Envoyé : jeudi 12 juin 2014 17:47
À : spip@rezo.net
Objet : Re: [Spip] Variables globales

Le 12/06/2014 16:35, Bur. Roger Burton a écrit :

Bonjour,

Ça peut être utile :

3 fonctions qui servent de filtres sur des balises « date »

Il y a moyen de simplifier les écritures SPIP en passant par des
filtres « maison »

À placer dans « mes_options.php »

Bonjour,

il me semble que mes filtres maisons doivent être placés dans mes_fonctions.php

Je me trompe?

_______________________________________________
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

Bonjour,

De quel plugin parles-tu ?

Quel rapport entre la balise #FORMULAIRE que tu évoques et le sujet initial (les variables globales) ?

Cordialement,

Cédric JOUANNIN

Envoyé : vendredi 13 juin 2014 09:16