Je code un plugin sous SPIP 1.9.3 qui envoi des alertes par email avec
les nouveaux articles associés à une combinaisons de mots-clés.
Le plugin fonctionne bien et je le déclanche dorénavant par un chron du
serveur (et non pas le chron SPIP / Plugin).
Je souhaite que mon squelette qui contient le code PHP d'envoi des
alertes soit systématiquement calculé comme avec &var_mode=calcul (force
le recalcul du php et du cache). Je pourrais simplement ajouter cette
option dans le chron du serveur mais le passage du paramètre en url
semble réservé aux admins et donc non pris en compte lors d'une
execution par un chron serveur.
Le problème semble venir de récuperer_fond qui génère
- un modèle de mail html (noisette) OK avec l'option var_mode=calcul
dans le fichier SPIP appelant
- un modèle de mail html (noisette) VIDE sans l'option var_mode=calcul
dans le fichier SPIP appelant
Est-il possible de forcer ce comportement ?
J'ai tenté :
- D'ajouter un include intermédiaire avec {var_mode=recalcul}
- De passer var_mode=calcul dans le contexte d'appel de recuperer_fond
- De mette à 0 la variable de cache du fichier principal du plugin et
des noisettes html (modèle de mail)
Bonjour,
la version 1.9.3 de SPIP est une version intermédiaire de développement qui date.
Tu devrais upgrader jusqu' à la version 2.0.10, pour bénéficier d'une version stable et sécurisée, sur laquelle il sera plus facile de te répondre.
@cedric, @Km, je suis en version 1.9.2g, c'est un gros site en production pour lequel nous avons plusieurs plugins spécifiques et nous ne pouvons pas migrer dans l'immédiat. Oui j'ai essayé avec #cache.
Est il possible de forcer la variable ENV var_mode même si le script est appelé par un cron donc sans être logé en admin ?
En PHP je fais comment ?
Ceci est un appel à l'aide et à votre sens de la solidarité
Je viens de passer trois jours sans trouver la solution.
J'ai une page de plugin qui contient essentiellement du PHP.
Elle boucle sur des inscrits à un système d'alertes.
Pour chaque alerte elle appelle un modèle dans /modele du plugin avec la fonction récupérer_fond pour construire le mail html.
Si j'appelle mon template principal avec var_mode=recalcul tout fonctionne normalement.
Si j'appelle mon template principal sans var_mode=recalcul dans certains cas récupérer_fond me retourne une version TEXTE du modèle.
Comme forcer récupérer_fond à recalcul systématiquement le template ?
J'ai tenté avec les variables de contexte mais aucun effet.
Je dois trouver une solution car ma tache de cron (étape suivante) ne prend pas en compte la variable var_mode=recalcul passée en url.
Le problème est mal posé car :
1/ un modele n'est *jamais* mis en cache et toujours calculé à chaque demande
2/ le 'recalcul' consiste uniquement en la recompilation du squelette
en php avant son calcul.
Donc il n'est pas *normal* que ton modele renvoie une version "texte".
C'est ce problème qu'il faut traiter, et qui cache vraisemblablement
un bug.
En premier lieu, qu'est ce que tu entends par là ?
Si je comprends bien, tu as un squelette principal constitué
essentiellement de php, et qui fait des appels php a recuperer_fond ?
Si c'est bien ça, fait tu bien dans le php de ton squelette les
inclusions nécessaire pour disposer de la fonction (public/assembler
il me semble en 1.9.2).
Car lorsque que tu recalcule, spip inclue ce fichier pour compiler ton
squelette, et du coup ton recuperer_fond est dispo. Mais lorsque tu
calcule simplement, spip se contente d'executer le php résultant de
ton squelette (donc essentiellement le php que tu y as mis). Et si tu
n'as pas fait l'inclusion, la fonction n'est pas disponible, ce qui
provoque une erreur donc.
Si j'appelle mon template principal sans var_mode=recalcul dans certains
cas récupérer_fond me retourne une version TEXTE du modèle.
Pourquoi un «recalcul» et non un «calcul» tout court. Si tu as besoin d'un recalcul, c'est déjà qu'il y a un problème de conception.
Comme forcer récupérer_fond à recalcul systématiquement le template ?
J'ai tenté avec les variables de contexte mais aucun effet.
En général, mettre #CACHE{0} dans le squelette marche bien.
Autre possibilité, tu ajoutes dans l'environnement de ton recuperer_fond une valeur aléatoire, du coup, tu es certain d'avoir un cache à jour. $contexte['random'] = uniqid(rand());
Autre possibilité, tu invalides les caches au moment où tes contenus éditoriaux sont modifiés : include_spip('inc/invalideur'); suivre_invalideur();
Autre possibilité, tu indiques que ton cache dépend d'un contexte particulier : $GLOBALS['marqueur'] .= 'cron';
Merci d'avoir répondu à mon appel à l'aide !
Avec calcul, ça fonctionne aussi.
Ça fait des bonnes pistes que je n'avais pas exploré donc l'espoir revient