[Résolu] impossible de créer une tache CRON sans plugin

Bonjour,

J’essaye depuis plus d’un mois de créer une tache CRON sans plugin, ça ne marche pas, bien que dans la documentation il est indiqué que c’est possible:

J’ai déjà lancé une demande d’aide, mais les solutions proposées ne marchent pas!
Alors en dernier recours j’essaye de nouveau, sinon il faudra lancer un procédure de bug!

Cela fait plus de dix ans que j’utilise spip, dans mes anciennes applications j’utilisais le cron de l’hébergeur, mais je voudrais pouvoir utiliser celui de spip pour mes sessions de maintenance!

Voici mon code dans mes_options.php:

if (!isset($GLOBALS['spip_pipeline']['taches_generales_cron']))
	$GLOBALS['spip_pipeline']['taches_generales_cron'] = "periodic_task";
else
	$GLOBALS['spip_pipeline']['taches_generales_cron'] .= "|periodic_task";

function periodic_task($taches){
	$taches['my_periodic_task'] = 24*3600; // every day
	return $taches;
}

Puis dans un dossier appelé Genie dans mon dossier squelettes j’ai un fichier appelé

my_periodic_task.php qui contient la fonction :
function genie_my_periodic_task_dist($t){
mail('my-email@bibi.com','test cron','Mon test cron',$headers);
return 1;
}

J’ai essayé de mettre ce fichier dans le dossier ecrire/genie, c’est pareil. Faut dire que j’ai 8 dossiers Genie dans spip, alors quand dans la documentation vous dites de le mettre dans le dossier genie, on s’y perds un peu!

Ce serait formidable de donner un exemple simple clair et concis de cette fonctionalité sans plugin, et de le mettre dans la documentation pour tout le monde.

Merci beaucoup de votre aide.

N’hésite pas à utiliser les raccourcis ``` avant et après ton code pour qu’il soit plus lisible (j’ai fait la modification sur ton message)

Le dossier genie ne doit pas avoir de majuscules.

Il doit se trouver dans ton dossier de squelettes. Si tu n’es pas dans un plugin, je ne vois pas du tout où on pourrait imaginer que ça soit ailleurs et donc c’est pas précisé dans la doc.

Si tu n’y arrives pas comme il faut, tu auras raison de signaler un bug.

Mais en désespoir de cause, si tu n’arrives pas à créer un nouveau génie, tu peux en recycler un. Tous ceux livrés par SPIP sont implémentés par une fonction suffixée par _dist. Ça veut dire que tu peux la spécialiser par une fonction du même nom, mais sans le suffixe _dist, qui sera prioritaire, qui implémentera le code que tu veux et qui en prime devra appeler la fonction _dist d’origine pour pas perdre sa fonctionnalité.

Tout de même, ya une autre solution : créer un plugin. Même si ce n’est que pour ce génie.

Bonjour Jluc,
Mon dossier genie n’a pas de majuscules.
Je voudrais essayer de modifier le spip de base, je l’ai déjà fait pour un problème de langue mais ce n’est pas une bonne solution, car je dois reporter la modification à chaque mise à jour. Faudrait à ce sujet que je propose une modification de code de spip, mais je ne sais pas à qui en faire part!
Quand à créer un plugin juste que pour ça, je pense qu’il serait mieux de corriger le problème.
Merci.

C’est noté, merci.

Est-ce que tu as lu :

Et je ne retrouve pas l’info, mais avec SPIP 4.4, tu peux surcharger des items de langue d’un plugin avec lang/prefixeplugin_fr.php dans ton dossier squelettes, pour seulement les items concernés.Je peux te donner un MP l’url d’un plugin qui fait ça pour une 20aine de plugins d’un coup.

Sans doute il faudrait faire un ticket sur git.spip.net et si ça concerne un génie peut-être dans spip / ecrire · GitLab

(par ailleurs, comme te l’indiques @RealET pour tes modifs de langue tu peux créer dans ton dossier squelettes/lang un fichier local_fr.php (ou local_en.php etc…)

Bonjour RealET,
depuis plus de 10 ans que j’utilise spip, je connais bien le système de langues, et j’utilise depuis longtemps les fonctionnalités décrites dans les liens que tu me communiques.
Si ça t’intéresse, le problème est simple:
J’ai un site unique multi-langues (français et anglais) qui marche bien, et de fait j’ai deux noms de domaines, un pour le français et un pour l’anglais. Je souhaite donc que le nom de domaine en français démarre en français, et celui en anglais démarre en anglais, cela est parfaitement logique.
Le problème c’est que spip propose bien de définir des titres et textes en plusieurs langues via la balise , mais ne définis dans la BD qu’une seule langue. J’ai donc effacé la langue du site dans le champ langue_site de la table meta, et définis une langue par défaut qui dépend du domaine avec define(‹ _LANGUE_PAR_DEFAUT ›, ‹ xx ›); du fichier mes_options.php, en mettant $GLOBALS[‹ forcer_lang ›] = true;
Mais spip n’en tient pas compte et génère une erreur.
J’ai donc forcé la récupération de la langue via ‹ _LANGUE_PAR_DEFAUT ›!

Tu en avais mis un dans ton post. Relis ton code : ça peut être une typo comme ça qui l’empêche de fonctionner.

Je suppose que tu veux écrire que tu voudrais non pas « essayer » comme tu l’écris mais « éviter » de modifier le spip de base, et tu as bien raison, mais ce n’est pas du tout ce que je propose : je te suggère de créer une nouvelle fonction sans toucher à celle d’origine. Les détails sont là : impossible de créer une tache CRON sans plugin - #3 par JLuc

Sur le « où créer le dossier genie », il n’y a pas de raison de préciser dans la doc, parce que c’est selon la notion de chemin spip : La notion de chemin - Programmer avec SPIP 4

Et donc je viens de tester, et cela marche chez moi.

Par contre

  • j’avais fait au départ une erreur dans le nom du fichier → ca plantait
  • attention les taches cron de spip dependent des visites publics
    Tu peux tester l’execution d’une tache cron en te rendant dans l’espace prive dans maintenance_tache_de_fond

Et donc

dans config/mes_options.php

<?php

if (!isset($GLOBALS['spip_pipeline']['taches_generales_cron']))
	$GLOBALS['spip_pipeline']['taches_generales_cron'] = "periodic_task";
else
	$GLOBALS['spip_pipeline']['taches_generales_cron'] .= "|periodic_task";

function periodic_task($taches){
	$taches['my_periodic_task'] = 24*3600; // every day
	return $taches;
}

dans squelettes/genie sans majuscule, un fichier my_periodic_task.php

avec

<?php

function genie_my_periodic_task_dist($t){
   mail('my-email@bibi.com','test cron','Mon test cron',$headers);
return 1;
}

Je suis allé dans maintenance->tache de fond. J’ai forcé la tache. Et j’ai bien recu le mail (tu es sur par contre que mail est fonctionnel? parce que certains hebergeurs bloquent…)

1 « J'aime »

Et pour tes affaires de langue (sur lequel je suis totalement incompétent) je t’inviterai plutot à ouvrir un sujet à part.

Un peu comme expliqué ici : Déclarer une tâche hors plugin - Programmer avec SPIP 4 ?
:wink:
Merci Maieul !

Ouf, ça marche enfin!
Merci Maieul ! :grinning:
J’avais tout simplement oublié de mettre <?php au début et ?> en fin de fichier :roll_eyes:
Excellente idée de créer cette page d’aide, pour que l’exemple soit fonctionnel, tu devrais les rajouter toi aussi dans l’exemple :grin:
Je ne connaissais pas maintenance->tache de fond, c’est bien utile!

Deux remarques

  1. Je nesuis pas à l’origine de cette page de documentation, donc je ne suis pas forcément convaincu de la pertinence dans un manuel. Cela relève plus du tutoriel que du manuel.
  2. Inutile de mettre le ?> final, c’est meme déconseillé pour éviter des problèmes de spurious space potentiel (tu verra que le code de spip ne contient pas ces ?> finaux.