source: spip-zone/_plugins_/newsletters/trunk/genie/newsletters_programmees.php

Last change on this file was 68989, checked in by cedric@…, 7 years ago

Il manque une autorisation pour que la generation de la newsletter auto fonctionne en cron !

File size: 6.3 KB
Line 
1<?php
2/**
3 * Plugin Newsletters
4 * (c) 2012 Cedric Morin
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9
10
11function genie_newsletters_programmees_dist($t){
12
13        $now = date('Y-m-d H:i:s');
14        // trouver une newsletter programmee a envoyer
15        if ($row = sql_fetsel("*",'spip_newsletters',"statut=".sql_quote('prog')." AND date<".sql_quote($now)." AND date>".sql_quote('1000-01-01 00:00:00'))){
16                // par defaut la date de la newsletter programmee est celle de la programmation
17                // sauf si on a rate des echeances : on les rattrape dans une seule NL dans ce cas
18                $date = $row["date"];
19                include_spip('inc/when');
20                include_spip('inc/newsletters');
21                list($date_start,$rrule) = newsletter_ics_to_date_rule($row['recurrence']);
22                while ($next=when_rule_to_next_date($date_start,$rrule,$date)
23                        AND $next<$now){
24                        spip_log("programmer #".$row['id_newsletter']." date : $date manquee, fusionnee avec celle du $next","newsletterprog");
25                        $date = $next;
26                }
27
28                if ($date!=$row['date']){
29                        // il faut maj en base pour etre coherent au moment de la generation de la NL de test
30                        sql_updateq("spip_newsletters",array('date'=>$date),"id_newsletter=".intval($row['id_newsletter']));
31                        $row['date'] = $date;
32                }
33
34                spip_log("programmer #".$row['id_newsletter']." date : ".$row['date'],"newsletterprog");
35                newsletter_creer_newsletter_programmee($row);
36        }
37        return 0;
38}
39
40function newsletter_update_next_occurence($row, $sent=true){
41        // on met a jour la date et date_redac sur la source
42        include_spip("action/editer_objet");
43        include_spip("inc/autoriser");
44        include_spip("inc/when");
45        include_spip("inc/newsletters");
46
47        list($date_start,$rule) = newsletter_ics_to_date_rule($row['recurrence']);
48        $set = array(
49                'date_redac' => $row['date'],
50                'date' => when_rule_to_next_date($date_start,$rule,$row['date'])
51        );
52
53        // si on a rien envoye on ne touche pas a la date de derniere occurence
54        if (!$sent)
55                unset($set['date_redac']);
56
57        if (!$set['date']) $set['date'] = "0001-01-01 00:00:00";
58        autoriser_exception("modifier","newsletter",$row['id_newsletter']);
59        autoriser_exception("instituer","newsletter",$row['id_newsletter']);
60        objet_modifier("newsletter",$row['id_newsletter'],$set);
61        autoriser_exception("modifier","newsletter",$row['id_newsletter'],false);
62        autoriser_exception("instituer","newsletter",$row['id_newsletter'],false);
63}
64
65function newsletter_creer_newsletter_programmee($row){
66
67        // verifier deja si il y a qqchose a envoyer
68        $generer_newsletter = charger_fonction("generer_newsletter","action");
69
70        $patron = $row['patron'];
71        $html = newsletters_recuperer_fond($row['id_newsletter'], $patron, $row['date'], $row['date_redac']);
72        if (!strlen(trim($html))){
73                spip_log("Rien a envoyer pour programmation #".$row['id_newsletter'],"newsletterprog");
74                newsletter_update_next_occurence($row,false);
75                return;
76        }
77
78        // OK retrouvons ou creons l'objet de base
79        $set = array(
80                "titre" => $row["titre"],
81                "chapo" => $row["chapo"],
82                "texte" => $row["texte"],
83                "date" => $row["date"],
84                "date_redac" => $row['date_redac'], // occurence precedente
85                "patron" => $patron,
86                "baked" => 1,
87                "statut" => "prop",
88                "lang" => "lang",
89                "recurrence" => $row['id_newsletter'],
90        );
91
92        include_spip("action/editer_objet");
93        include_spip("inc/autoriser");
94        if (
95                // retrouver une instance initiee mais pas finie
96                // (cas d'une ereur fatale pendant la generation de la lettre)
97                // evite de creer un nombre d'instance infini pour rien
98                !$id_newsletter = sql_getfetsel("id_newsletter","spip_newsletters","date_redac=".sql_quote($set['date_redac'])." AND recurrence=".sql_quote($set['recurrence'],'','text')." AND statut=".sql_quote('prop'))
99
100                // et sinon on cree la newsletter
101                AND !$id_newsletter = objet_inserer("newsletter",0)){
102                spip_log("Erreur : impossible de creer une newsletter pour programmation #".$row['id_newsletter']." :".var_export($set,true),"newsletterprog"._LOG_ERREUR);
103                return;
104        }
105
106        autoriser_exception("modifier","newsletter",$id_newsletter);
107        autoriser_exception("instituer","newsletter",$id_newsletter);
108        autoriser_exception("generer","newsletter",$id_newsletter);
109
110        objet_modifier("newsletter",$id_newsletter,$set);
111
112        // ensuite on calcule vraiment les 3 versions (html, texte, html_page)
113        $generer_newsletter($id_newsletter, true, $row['date_redac']);
114
115        $fixer_newsletter = charger_fonction("fixer_newsletter","action");
116        $fixer_newsletter($id_newsletter);
117
118        // verifions au cas ou
119        $row2 = sql_fetsel("*","spip_newsletters","id_newsletter=".intval($id_newsletter));
120        if (!strlen(trim($row2['html_email']))){
121                spip_log("Rien a envoyer (apres tentative de generation) pour programmation #".$row['id_newsletter'],"newsletterprog");
122                // du coup on met a jour la prochaine occurence
123                newsletter_update_next_occurence($row,false);
124
125                // passer cette tentative ratee a la poubelle ?
126                // a priori si on arrive la c'est un bug ou un cas tordu
127                // donc pour le moment on laisse la newsletter ratee en prop
128                // elle sera recyclee a la prochaine echeance
129                return;
130        }
131
132        // on passe en publie
133        $set = array('statut'=>'publie','date'=>$row2['date']);
134        objet_modifier("newsletter",$id_newsletter,$set);
135
136        autoriser_exception("modifier","newsletter",$id_newsletter,false);
137        autoriser_exception("instituer","newsletter",$id_newsletter,false);
138        autoriser_exception("generer","newsletter",$id_newsletter,false);
139
140        // on met a jour la date et date_redac sur la source
141        newsletter_update_next_occurence($row);
142
143        // Les envois
144
145        // un envoi de test sur une adresse ?
146        if ($row['email_test']){
147                $email = $row['email_test'];
148                // recuperer l'abonne si il existe avec cet email
149                $subscriber = charger_fonction('subscriber','newsletter');
150                $dest = $subscriber($email);
151
152                // si abonne inconnu, on simule (pour les tests)
153                if (!$dest)
154                        $dest = array(
155                                'email' => $email,
156                                'nom' => $email,
157                                'lang' => $row['lang'],
158                                'status' => 'on',
159                                'url_unsubscribe' => url_absolue(_DIR_RACINE . "unsubscribe"),
160                        );
161
162                // ok, maintenant on prepare un envoi
163                $send = charger_fonction("send","newsletter");
164                $err = $send($dest, $id_newsletter, array('test'=>true));
165
166                if ($err){
167                        spip_log("Erreur lors de l'envoi de test a $email : $err","newsletterprog"._LOG_ERREUR);
168                }
169        }
170
171        // un envoi a une liste ?
172        if ($row['liste']){
173                $listes = array($row['liste']);
174
175                $bulkstart = charger_fonction("bulkstart","newsletter");
176                if (!$bulkstart($id_newsletter, $listes))
177                        spip_log("Erreur lors de l'envoi groupe a la liste ".$row['liste'],"newsletterprog"._LOG_ERREUR);
178        }
179
180}
Note: See TracBrowser for help on using the repository browser.