modèles et double exécution des balises dynamiques

Bonsoir,

Bon, ma dernière est question est restée sans réponse, mais j'ai avancé dans ma compréhension
du problème. Alors je re-tente ma chance ;o)

J'ai défini une balise dynamique #TOTO, dans squelettes/balise/toto.php, avec ceci:

function balise_TOTO($p) {
         error_log("balise_TOTO()");
         return calculer_balise_dynamique($p, 'TOTO', array());
}

function balise_TOTO_stat($args, $filters) {
         error_log("balise_TOTO_stat()");
         return $args;
}

function balise_TOTO_dyn() {
         error_log("balise_TOTO_dyn()");
         return date("c");
}

Si cette balise est invoquée depuis un squelette, tout marche comme prévu: au premier accès,
compilation du squelette, avec invocation de balise_TOTO(), balise_TOTO_stat(), et balise_TOTO_dyn().
Lors des accès suivants, seul balise_TOTO_dyn() est invoquée.

Par contre, si cette balise est invoquée depuis un modèle, ou dans un squelette inclus depuis un modèle, ça déraille:
- au premier chargement, on exécute :
  * balise_TOTO(),
  * balise_TOTO_stat(),
  * balise_TOTO_dyn()
- au deuxième chargement, rien n'est exécuté: la valeur soit-disant dynamique est tombée dans le cache
- si on recalcule la page (var_mode=calcul), on exécute deux fois la balise dynamique:
  * balise_TOTO_stat(),
  * balise_TOTO_dyn(),
  * balise_TOTO_stat(),
  * balise_TOTO_dyn()
- et si on recalcule encore (var_mode=recalcul), c'est la totale, ça exécute :
  * balise_TOTO(),
  * balise_TOTO_stat(),
  * balise_TOTO_dyn(),
  * balise_TOTO_stat(),
  * balise_TOTO_dyn()

Ces comportements sont pour le moins étonnants. Voici mes questions:

1) est-ce qu'il y a un explication au fait que la balise dynamique ne soit plus dynamique dans un modèle?
un contournement possible pour obtenir un comportement dynamique de la balise?

2) pourquoi ces doubles invocations de _stat et _dyn au recalcul de la page?

Merci de toute aide...

--
Florence HENRY
LESIA - Observatoire de Paris

precise peut etre la version de SPIP pour avoir des reponses.
si tu es en 2.0.9, passe en 2.0.10, quelque chose cloche au niveau du cache des modeles en 2.0.9 (pb constatés sur la pagination du plugin diapo, sans doute le meme souci)

ceci dit, ton test peut aussi te tromper un peu.
Dans certains cas, 2 caches sont générés (un unitaire de l'inclusion et l'autre de l'incluant).
2 logs, 2 passages, mais un seul utilisé réellement pour cet affichage...

@++

Florence HENRY a écrit :

Bonsoir,

Bon, ma dernière est question est restée sans réponse, mais j'ai avancé dans ma compréhension
du problème. Alors je re-tente ma chance ;o)

J'ai défini une balise dynamique #TOTO, dans squelettes/balise/toto.php, avec ceci:

function balise_TOTO($p) {
        error_log("balise_TOTO()");
        return calculer_balise_dynamique($p, 'TOTO', array());
}

function balise_TOTO_stat($args, $filters) {
        error_log("balise_TOTO_stat()");
        return $args;
}

function balise_TOTO_dyn() {
        error_log("balise_TOTO_dyn()");
        return date("c");
}

Si cette balise est invoquée depuis un squelette, tout marche comme prévu: au premier accès,
compilation du squelette, avec invocation de balise_TOTO(), balise_TOTO_stat(), et balise_TOTO_dyn().
Lors des accès suivants, seul balise_TOTO_dyn() est invoquée.

Par contre, si cette balise est invoquée depuis un modèle, ou dans un squelette inclus depuis un modèle, ça déraille:
- au premier chargement, on exécute :
    * balise_TOTO(),
    * balise_TOTO_stat(),
    * balise_TOTO_dyn()
- au deuxième chargement, rien n'est exécuté: la valeur soit-disant dynamique est tombée dans le cache
- si on recalcule la page (var_mode=calcul), on exécute deux fois la balise dynamique:
    * balise_TOTO_stat(),
    * balise_TOTO_dyn(),
    * balise_TOTO_stat(),
    * balise_TOTO_dyn()
- et si on recalcule encore (var_mode=recalcul), c'est la totale, ça exécute :
    * balise_TOTO(),
    * balise_TOTO_stat(),
    * balise_TOTO_dyn(),
    * balise_TOTO_stat(),
    * balise_TOTO_dyn()

Ces comportements sont pour le moins étonnants. Voici mes questions:

1) est-ce qu'il y a un explication au fait que la balise dynamique ne soit plus dynamique dans un modèle?
un contournement possible pour obtenir un comportement dynamique de la balise?

2) pourquoi ces doubles invocations de _stat et _dyn au recalcul de la page?

Merci de toute aide...

--
Florence HENRY
LESIA - Observatoire de Paris

as tu essayé avec des <INCLUDE> et avec des #INCLUDE ?
<INCLUDE> est plus "dynamique".

JLuc

Le 24 janv. 10 à 23:13, Stephane a écrit :

precise peut etre la version de SPIP pour avoir des reponses.
si tu es en 2.0.9, passe en 2.0.10, quelque chose cloche au niveau du cache des modeles en 2.0.9 (pb constatés sur la pagination du plugin diapo, sans doute le meme souci)

En effet, je suis en 2.0.9. Merci du conseil. Je vais essayer de ce pas.

ceci dit, ton test peut aussi te tromper un peu.
Dans certains cas, 2 caches sont générés (un unitaire de l'inclusion et l'autre de l'incluant).
2 logs, 2 passages, mais un seul utilisé réellement pour cet affichage...

Et il n'y a pas moyen de supprimer cette double exécution ? Car si mon code PHP fait un
sql_insert() dans une base de données, il va la faire 2 fois !

Florence HENRY a écrit :

Bonsoir,
Bon, ma dernière est question est restée sans réponse, mais j'ai avancé dans ma compréhension
du problème. Alors je re-tente ma chance ;o)
J'ai défini une balise dynamique #TOTO, dans squelettes/balise/toto.php, avec ceci:
function balise_TOTO($p) {
       error_log("balise_TOTO()");
       return calculer_balise_dynamique($p, 'TOTO', array());
}
function balise_TOTO_stat($args, $filters) {
       error_log("balise_TOTO_stat()");
       return $args;
}
function balise_TOTO_dyn() {
       error_log("balise_TOTO_dyn()");
       return date("c");
}
Si cette balise est invoquée depuis un squelette, tout marche comme prévu: au premier accès,
compilation du squelette, avec invocation de balise_TOTO(), balise_TOTO_stat(), et balise_TOTO_dyn().
Lors des accès suivants, seul balise_TOTO_dyn() est invoquée.
Par contre, si cette balise est invoquée depuis un modèle, ou dans un squelette inclus depuis un modèle, ça déraille:
- au premier chargement, on exécute :
   * balise_TOTO(),
   * balise_TOTO_stat(),
   * balise_TOTO_dyn()
- au deuxième chargement, rien n'est exécuté: la valeur soit-disant dynamique est tombée dans le cache
- si on recalcule la page (var_mode=calcul), on exécute deux fois la balise dynamique:
   * balise_TOTO_stat(),
   * balise_TOTO_dyn(),
   * balise_TOTO_stat(),
   * balise_TOTO_dyn()
- et si on recalcule encore (var_mode=recalcul), c'est la totale, ça exécute :
   * balise_TOTO(),
   * balise_TOTO_stat(),
   * balise_TOTO_dyn(),
   * balise_TOTO_stat(),
   * balise_TOTO_dyn()
Ces comportements sont pour le moins étonnants. Voici mes questions:
1) est-ce qu'il y a un explication au fait que la balise dynamique ne soit plus dynamique dans un modèle?
un contournement possible pour obtenir un comportement dynamique de la balise?
2) pourquoi ces doubles invocations de _stat et _dyn au recalcul de la page?
Merci de toute aide...
--
Florence HENRY
LESIA - Observatoire de Paris

--
Florence HENRY
LESIA - Observatoire de Paris