Version 3 — Mai 2014 — 78.213.xx.xx
Ce code fonctionne pour SPIP2, mais je crois qu’il est bon aussi pour SPIP3 car job_queue n’a pas beaucoup bougé. Sinon signalez le ici !
Rq : C’est collé serré au plus près du PHP, ce qui permet de l’utiliser même dans des programmes qui n’incluent pas le noyau de SPIP, et à qui on fait bénéficier de la bibliothèque SPIP. Et donc du coup du coup ça utilise mysql_query. Si on en normalisait l’écriture, il faudrait utiliser mysql_insert ou mysql_insertq à la place du mysql_query, mais du coup ça ne serait plus utilisable en dehors du code SPIP.
//
// Procure un moyen de lancer des actions SPIP via la table spip_jobs, bénéficiant ainsi de ses librairies
//
// $inclure sert à définir quel fichier inclure avant l'appel ultérieur, si nécessaire
// - soit on charge un fichier de définition de la fonction appelée seulement, et alors la fonction est surchargeable,
// pour charger_fonction il faut un / à la fin
// charge mesquelettes/admin/genie puis appelle admin_genie_jobtest_dist
// spip_cron_ajoute ("jobtest", "spip_cron_ajoute queue jobtest avec inclure de admin/genie/", array ("hello", "new_world"), "admin/genie/");
// - soit on charge un fichier de définition de plein de fonctions, et c'est tout le fichier qui est surchargeable
// ça fait un include_spip du fichier du même nom, le .php est ajouté avant l'inclusion
// spip_cron_ajoute ("jobtest", "spip_cron_ajoute queue jobtest dans admin/genie par cron", array ("hello", "new_world"), "admin/genie");
//
function spip_cron_ajoute ($function, $description, $arguments, $delai, $inclure = "protected/jobs")
{
$arguments = serialize($arguments ); addslashes(serialize($arguments ));
static $when;
if (!isset($when))
$when = ;
// En cas d'appels successifs,
// si ya jamais de délai, $when reste à .
// Si ya un délai à un moment, when s'ancre dans le temps à partir de là
if ($delai // délai en secondes entre jobs consécutifs
and !$when)
$when = time();
// cf plugins/auto/job_queue/inc function queue_add_job et queue_start_job
// 'inclure' vaut '' ou un fichier inclu avant l'appel par include_spip OU par charger_fonction si inclure se termine par '/'
$q = "INSERT INTO spip_jobs
SET fonction = '$function',
descriptif = '".addslashes($description)."',
args = '$arguments',
md5args = '".md5($arguments)."',
inclure = '$inclure',
priorite = ,
date = '". date('Y-m-d H:i:s',$when)."',
status = 1" // programmé, sinon en attente
;
$r = mysql_query ($q);
if (!$r)
spip_log ("Oups pb spip_cron_ajoute avec $q ".mysql_error(), "cron_ajoute");
$when += $delai;
}
// avec plugin spip-lettres
spip_cron_ajoute ('lettres_envoyer_une_lettre_email', "1er Envoi lettre 33 à popol",
array(33, 'popol@domaine.org'), 60, "inc/delivrer_hors_abo");
// ou, avec des champs à remplacer dans la lettre :
spip_cron_ajoute (
'lettres_envoyer_une_lettre_email',
"Envoi lettre 33 à $emaildest",
array(33, $emaildest, array ('prenom'=>'Popaul', 'commande'=>'tel produit boutique')),
60,
"inc/delivrer_hors_abo");