source: spip-zone/_plugins_/spip-listes/spip-listes_1_9_3/inc/spiplistes_api_courrier.php @ 35241

Last change on this file since 35241 was 35241, checked in by paladin@…, 11 years ago

attacher les documents joints au courrier via un id temporaire

  • Property svn:eol-style set to LF
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 17.8 KB
Line 
1<?php
2
3// inc/spiplistes_api_courrier.php
4
5/******************************************************************************************/
6/* SPIP-Listes est un systeme de gestion de listes d'abonnes et d'envoi d'information     */
7/* par email pour SPIP. http://bloog.net/spip-listes                                      */
8/* Copyright (C) 2004 Vincent CARON  v.caron<at>laposte.net                               */
9/*                                                                                        */
10/* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes */
11/* de la Licence Publique Generale GNU publiee par la Free Software Foundation            */
12/* (version 2).                                                                           */
13/*                                                                                        */
14/* Ce programme est distribue car potentiellement utile, mais SANS AUCUNE GARANTIE,       */
15/* ni explicite ni implicite, y compris les garanties de commercialisation ou             */
16/* d'adaptation dans un but specifique. Reportez-vous a la Licence Publique Generale GNU  */
17/* pour plus de details.                                                                  */
18/*                                                                                        */
19/* Vous devez avoir recu une copie de la Licence Publique Generale GNU                    */
20/* en meme temps que ce programme ; si ce n'est pas le cas, ecrivez a la                  */
21/* Free Software Foundation,                                                              */
22/* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, Etats-Unis.                   */
23/******************************************************************************************/
24
25// $LastChangedRevision: 35241 $
26// $LastChangedBy: paladin@quesaco.org $
27// $LastChangedDate: 2010-02-16 12:18:16 +0000 (Tue, 16 Feb 2010) $
28
29/*
30        Fonctions consacrees au traitement du contenu du courrier et tampon :
31        - filtres, convertisseurs texte, charset, etc.
32       
33        Toutes les fonctions ici ont un nom commencant pas 'spiplistes_courrier'
34       
35        Voir base/spiplistes_upgrade.php pour definitions et descriptions des tables
36       
37       
38*/
39
40
41/*
42        function spiplistes_courrier_propre($texte)
43        passe propre() sur un texte puis nettoye les trucs rajoutes par spip sur du html
44        ca s'utilise pour afficher un courrier dans l espace prive
45        on l'applique au courrier avant de confirmer l'envoi
46*/
47function spiplistes_courrier_propre($texte){
48        $temp_style = ereg("<style[^>]*>[^<]*</style>", $texte, $style_reg);
49        if (isset($style_reg[0])) 
50                $style_str = $style_reg[0]; 
51        else 
52                $style_str = "";
53        $texte = ereg_replace("<style[^>]*>[^<]*</style>", "__STYLE__", $texte);
54        //passer propre si y'a pas de html (balises fermantes)
55        if( !preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $texte) ) 
56        $texte = propre($texte); // pb: enleve aussi <style>... 
57        $texte = spiplistes_courrier_propre_bloog($texte); //nettoyer les spip class truc en trop
58        $texte = ereg_replace("__STYLE__", $style_str, $texte);
59        //les liens avec double debut #URL_SITE_SPIP/#URL_ARTICLE
60        $texte = ereg_replace($GLOBALS['meta']['adresse_site']."/".$GLOBALS['meta']['adresse_site'], $GLOBALS['meta']['adresse_site'], $texte);
61        $texte = liens_absolus($texte);
62       
63        return $texte;
64}
65
66/*
67 * complete caracteres manquants dans HTML -> ISO
68 * @return la chaine transcrite
69 * @param $texte le texte a transcrire
70 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
71 * @param $is_html flag. Pour ne pas transcrire completement la version html
72 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
73 * @see http://www.w3.org/TR/html401/sgml/entities.html
74 */
75function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false) {
76       
77        $texte = charset2unicode($texte);
78        $texte = unicode2charset($texte, $charset);
79        if($charset != "utf-8") {
80                $remplacements = array(
81                        "&#8217;" => "'"        // quote
82                        , "&#8220;" => '"' // guillemets
83                        , "&#8221;" => '"' // guillemets
84                        )
85                        ;
86                if(!$is_html) {
87                        $remplacements = array_merge(
88                                $remplacements
89                                , array(
90                                                        // Latin Extended
91                                          '&#255;' => chr(255) // 'ÿ' // yuml inconnu php ?
92                                        , '&#338;' => "OE"  // OElig
93                                        , '&#339;' => "oe"  // oelig
94                                        , '&#352;' => "S"  // Scaron
95                                        , '&#353;' => "s"  // scaron
96                                        , '&#376;' => "Y"  // Yuml
97                                                // General Punctuation
98                                        , '&#8194;' => " " // ensp
99                                        , '&#8195;' => " " // emsp
100                                        , '&#8201;' => " " // thinsp
101                                        , '&#8204;' => " " // zwnj
102                                        , '&#8205;' => " " // zwj
103                                        , '&#8206;' => " " // lrm
104                                        , '&#8207;' => " " // rlm
105                                        , '&#8211;' => "-" // ndash
106                                        , '&#8212;' => "--" // mdash
107                                        , '&#39;' => "'" // apos
108                                        , '&#8216;' => "'" // lsquo
109                                        , '&#8217;' => "'" // rsquo
110                                        , '&#8218;' => "'" // sbquo
111                                        , '&#8220;' => '"' // ldquo
112                                        , '&#8221;' => '"' // rdquo
113                                        , '&#8222;' => '"' // bdquo
114                                        , '&#8224;' => "+" // dagger
115                                        , '&#8225;' => "++" // Dagger
116                                        , '&#8240;' => "0/00" // permil
117                                        , '&#8249;' => "." // lsaquo
118                                        , '&#8250;' => "." // rsaquo
119                                                // sans oublier
120                                        , '&#8364;' => "euros"  // euro
121                                )
122                        );
123                }
124                $texte = strtr($texte, $remplacements);
125        }
126        return($texte);
127}
128
129
130/****
131 * titre : spiplistes_courrier_propre_bloog
132 * Enleve les enluminures Spip pour la bloogletter
133 Vincent CARON
134****/
135
136function spiplistes_courrier_propre_bloog($texte) {
137
138        $texte = ereg_replace("<p class=\"spip\">(\r\n|\n|\r)?</p>",'',$texte);
139        $texte = eregi_replace("\n{3}", "\n", $texte);
140       
141       
142        // div imbrique dans un p
143        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<div([^>]*)>" , "<div\\2>" , $texte);
144        $texte = eregi_replace( "<\/div>(\r\n|\n|\r| )*<\/p>" , "</div>" , $texte);
145       
146        // style imbrique dans un p
147        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<style([^>]*)>" , "<style>" , $texte);
148        $texte = eregi_replace( "<\/style>(\r\n|\n|\r| )*<\/p>" , "</style>" , $texte);
149       
150       
151        // h3 imbrique dans un p
152        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h3 class=\"spip\">" , "<h3>" , $texte);
153        $texte = eregi_replace( "<\/h3>(\r\n|\n|\r| )*<\/p>" , "</h3>" , $texte);
154       
155        // h2 imbrique dans un p
156        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h2>" , "<h2>" , $texte);
157        $texte = eregi_replace( "<\/h2>(\r\n|\n|\r| )*<\/p>" , "</h2>" , $texte);
158       
159        // h1 imbrique dans un p
160        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h1>" , "<h1>" , $texte);
161        $texte = eregi_replace( "<\/h1>(\r\n|\n|\r| )*<\/p>" , "</h1>" , $texte);
162       
163       
164        // tableaux imbriques dans p
165        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(table|TABLE)" , "<table" , $texte);
166        $texte = eregi_replace( "<\/(table|TABLE)>(\r\n|\n|\r| )*<\/p>" , "</table>" , $texte);
167       
168        // TD imbriques dans p
169        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(\/td|\/TD)" , "</td" , $texte);
170        //$texte = eregi_replace( "<\/(td|TD)>(\r\n|\n|\r| )*<\/p>" , "</td>" , $texte);
171       
172        // p imbriques dans p
173        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(p|P)" , "<p" , $texte);
174        //$texte = eregi_replace( "<\/(td|TD)>(\r\n|\n|\r| )*<\/p>" , "</td>" , $texte);
175       
176        // DIV imbriques dans p
177        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(div|DIV)" , "<div" , $texte);
178        $texte = eregi_replace( "<\/(DIV|div)>(\r\n|\n|\r| )*<\/p>" , "</div>" , $texte);
179       
180        //$texte = PtoBR($texte);
181        $texte = ereg_replace ("\.php3&nbsp;\?",".php3?", $texte);
182        $texte = ereg_replace ("\.php&nbsp;\?",".php?", $texte);
183       
184        return $texte;
185} // end spiplistes_courrier_propre_bloog()
186
187
188
189/****
190 * titre : spiplistes_courrier_version_texte
191 * d'apres Clever Mail (-> NHoizey), mais en mieux.
192****/
193
194function spiplistes_courrier_version_texte($in) {
195
196        // Nettoyage des liens des notes de bas de page
197        $out = ereg_replace("<a href=\"#n(b|h)[0-9]+-[0-9]+\" name=\"n(b|h)[0-9]+-[0-9]+\" class=\"spip_note\">([0-9]+)</a>", "\\3", $in);
198       
199        // Supprimer tous les liens internes
200        $patterns = array("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims");
201        $replacements = array("\\2");
202        $out = preg_replace($patterns,$replacements, $out);
203       
204        // Supprime feuille style
205        $out = ereg_replace("<style[^>]*>[^<]*</style>", "", $out);
206       
207        // les puces
208        $out = str_replace($GLOBALS['puce'], "\n".'-', $out);
209       
210        // Remplace tous les liens     
211        $patterns = array("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims");
212        $replacements = array("\\2 (\\1)");
213        $out = preg_replace($patterns,$replacements, $out);
214       
215        $_traits = str_repeat('-', 40);
216        $_points = str_repeat('.', 20);
217       
218        $out = ereg_replace("<h1[^>]*>", "_SAUT__SAUT_".$_traits."_SAUT_", $out);
219        $out = str_replace("</h1>", "_SAUT__SAUT_".$_traits."_SAUT__SAUT_", $out);
220        $out = ereg_replace("<h2[^>]*>", "_SAUT__SAUT_".$_points." ", $out);
221        $out = str_replace("</h2>", " ".$_points."_SAUT__SAUT_", $out);
222        $out = ereg_replace("<h3[^>]*>", "_SAUT__SAUT_*", $out);
223        $out = str_replace("</h3>", "*_SAUT__SAUT_", $out);
224       
225        // Les notes de bas de page
226        $out = str_replace("<p class=\"spip_note\">", "\n", $out);
227        $out = ereg_replace("<sup>([0-9]+)</sup>", "[\\1]", $out);
228       
229        $out = str_replace("<p[^>]*>", "\n\n", $out);
230       
231        //$out = str_replace('<br /><img class=\'spip_puce\' src=\'puce.gif\' alt=\'-\' border=\'0\'>', "\n".'-', $out);
232        $out = ereg_replace ('<li[^>]>', "\n".'-', $out);
233        //$out = str_replace('<li>', "\n".'-', $out);
234       
235       
236        // accentuation du gras -
237        // <b>texte</b> -> *texte*
238        $out = ereg_replace ('<b[^>|r]*>','*' ,$out);
239        $out = str_replace ('</b>','*' ,$out);
240       
241        // accentuation du gras -
242        // <strong>texte</strong> -> *texte*
243        $out = ereg_replace ('<strong[^>]*>','*' ,$out);
244        $out = str_replace ('</strong>','*' ,$out);
245       
246       
247        // accentuation de l'italique
248        // <i>texte</i> -> *texte*
249        $out = ereg_replace ('<i[^>|mg]*>','*' ,$out);
250        $out = str_replace ('</i>','*' ,$out);
251       
252        $out = str_replace('&oelig;', 'oe', $out);
253        $out = str_replace("&nbsp;", " ", $out);
254        $out = filtrer_entites($out);
255       
256        //attention, trop brutal pour les logs irc <@RealET>
257        $out = supprimer_tags($out);
258       
259        $out = str_replace("\x0B", "", $out); 
260        $out = ereg_replace("\t", "", $out) ;
261        $out = ereg_replace("[ ]{3,}", "", $out);
262       
263        // espace en debut de ligne
264        $out = preg_replace("/(\r\n|\n|\r)[ ]+/", "\n", $out);
265       
266//marche po
267        // Bring down number of empty lines to 4 max
268        $out = preg_replace("/(\r\n|\n|\r){3,}/m", "\n\n", $out);
269       
270        //retablir les saut de ligne
271        $out = preg_replace("/(_SAUT_){3,}/m", "_SAUT__SAUT__SAUT_", $out);
272        $out = preg_replace("/_SAUT_/", "\n", $out);
273        //saut de lignes en debut de texte
274        $out = preg_replace("/^(\r\n|\n|\r)+/", "\n\n", $out);
275        //saut de lignes en debut ou fin de texte
276        $out = preg_replace("/(\r\n|\n|\r)+$/", "\n\n", $out);
277       
278        // Faire des lignes de 75 caracteres maximum
279        $out = wordwrap($out);
280       
281        return $out;
282
283} // end spiplistes_courrier_version_texte()
284
285/*
286 * Ajouter les abonnes d'une liste a un envoi
287 * @param : $id_courrier : reference d'un envoi
288 * @param $id_liste : reference d'une liste
289 */
290function spiplistes_courrier_remplir_queue_envois ($id_courrier, $id_liste, $id_auteur = 0) {
291        $id_courrier = intval($id_courrier);
292        $id_liste = intval($id_liste);
293       
294spiplistes_log("API: remplir courrier: #$id_courrier, liste: #$id_liste, auteur: #$id_auteur", _SPIPLISTES_LOG_DEBUG);
295       
296        if($id_courrier > 0) {
297       
298                $statut_q = sql_quote('a_envoyer');
299                $id_courrier_q = sql_quote($id_courrier);
300                $sql_valeurs = "";
301       
302                if($id_liste > 0) {
303                        // prendre la liste des abonnes a cette liste
304                        $ids_abos = spiplistes_listes_liste_abo_ids($id_liste);
305                        if(count($ids_abos)) {
306                                $sql_where_q = "(".implode(",", array_map("sql_quote", $ids_abos)).")";
307                                $sql_result = sql_select('id_auteur', 'spip_auteurs', "id_auteur IN $sql_where_q", ''
308                                        , array('id_auteur'));
309                                $ids_auteurs = array();
310                                while($row = sql_fetch($sql_result)) {
311                                        $ids_auteurs[] = intval($row['id_auteur']);
312                                }
313                                foreach($ids_abos as $ii) {
314                                        // l'auteur n'existe plus, le desabonner !
315                                        if(!in_array($ii, $ids_auteurs)) {
316                                                spiplistes_abonnements_auteur_desabonner($ii, 'toutes');
317                                        }
318                                }
319                                if(count($ids_auteurs) > 0) {
320                                        // remplir la queue d'envois
321                                        foreach($ids_auteurs as $ii) {
322                                                $sql_valeurs .= "(".sql_quote($ii).",$id_courrier_q, $statut_q, NOW()),";
323                                        }
324                                        $sql_valeurs = rtrim($sql_valeurs, ",");                       
325                                }
326                        }
327                }
328                else if(($id_auteur = intval($id_auteur)) > 0) {
329                        // envoi mail test
330                        $sql_valeurs = "(".sql_quote($id_auteur).",$id_courrier_q, $statut_q, NOW())";
331                }
332                if(!empty($sql_valeurs)) {
333                        sql_insert(
334                                'spip_auteurs_courriers'
335                                ,       "("
336                                        . "id_auteur,id_courrier,statut,maj"
337                                        . ")"
338                                ,       $sql_valeurs
339                        );
340                        $nb_etiquettes = spiplistes_courriers_en_queue_compter(
341                                array(
342                                        "id_courrier=".sql_quote($id_courrier)
343                                        , "statut=".sql_quote('a_envoyer')
344                                )
345                        );
346                        if($nb_etiquettes && ($id_liste > 0)) {
347                                spiplistes_courrier_modifier(
348                                        $id_courrier
349                                        , array('total_abonnes' => sql_quote($nb_etiquettes))
350                                        );
351                        }
352                        return(true);
353                }
354        }
355spiplistes_log("ERR: spiplistes_courrier_remplir_queue_envois($id_courrier, $id_liste, $id_auteur) valeur nulle ?"
356                , _SPIPLISTES_LOG_DEBUG);
357        return(false);
358}
359
360//CP-20080509: upadte sql sur un courrier
361/*
362 * Modifier un courrier
363 * @return true ou false
364 * @param $id_courrier
365 * @param $sql_set_array les valeurs à modifier. ex.: array('col1' => 'val1')
366 * @param $quote si true, les valeurs seront quote' par sql_updateq
367 */
368function spiplistes_courrier_modifier ($id_courrier, $sql_set_array, $quote = true) {
369        $id_courrier = intval($id_courrier);
370        $sql_update = $quote ? "sql_updateq" : "sql_update";
371        $result = 
372                ($id_courrier > 0)
373                ?
374                        $sql_update(
375                                "spip_courriers"
376                                , $sql_set_array
377                                , 'id_courrier='.sql_quote($id_courrier).' LIMIT 1'
378                        )
379                : false
380                ;
381        return($result);
382}
383
384//CP-20080509: changer le statut d'un courrier
385function spiplistes_courrier_statut_modifier ($id_courrier, $new_statut) {
386        return(spiplistes_courrier_modifier($id_courrier, array('statut' => $new_statut)));
387}
388
389// CP-20080329
390function spiplistes_courrier_supprimer_queue_envois ($sql_where_key, $sql_where_value) {
391        $sql_where = $sql_where_key."=".sql_quote($sql_where_value);
392        switch($sql_where_key) {
393                case 'id_courrier':
394                        $result = sql_delete("spip_auteurs_courriers", $sql_where);
395                        break;
396                case 'statut':
397                        if(spiplistes_spip_est_inferieur_193()) { 
398                                $result = sql_delete("spip_auteurs_courriers"
399                                        , "id_courrier IN (SELECT id_courrier FROM spip_courriers WHERE $sql_where)"); 
400                        } else {
401                                // Sur les precieux conseils de MM :
402                                // passer la requete en 2 etapes pour assurer portabilite sql
403                                $selection =
404                                        sql_select("id_courrier", "spip_courriers", $sql_where,'','','','','',false);
405                                $result = sql_delete("spip_auteurs_courriers", "id_courrier IN ($selection)");
406                        }
407                        break;
408        }
409        return($result);
410}
411
412function spiplistes_courrier_attacher_documents($id_courrier, $id_temp) {
413        if(($id_courrier > 0) && ($id_temp < 0)) {
414                return(
415                        sql_updateq(
416                                'spip_documents_liens'
417                                , array('id_objet' => sql_quote($id_courrier))
418                                , 'id_objet='.sql_quote($id_temp).' AND objet='.sql_quote('courrier')
419                ));
420        }
421        return(false);
422}
423
424// CP-20080329
425function spiplistes_courrier_supprimer ($sql_where_key, $sql_where_value) {
426        return(sql_delete("spip_courriers", $sql_where_key."=".sql_quote($sql_where_value)));
427}
428//CP-20080519
429function spiplistes_courriers_premier ($id_courrier, $sql_select_array) {
430        return(sql_fetsel($sql_select_array, 'spip_courriers', "id_courrier=".sql_quote($id_courrier), '', '', 1));
431}
432
433// renvoie id_auteur du courier (CP-20071018)
434function spiplistes_courrier_id_auteur_get ($id_courrier) {
435        if(($id_courrier = intval($id_courrier)) > 0) {
436                if($sql_result = sql_select('id_auteur', 'spip_courriers', "id_courrier=".sql_quote($id_courrier), '', '', 1)) {
437                        if($row = spip_fetch_array($sql_result)) {
438                                return($row['id_auteur']);
439                        }
440                }
441        }
442        return(false);
443}
444
445//CP-20080509: renvoie somme des abonnes en cours d envoi
446function spiplistes_courriers_total_abonnes ($id_courrier = 0) {
447        $id_courrier = intval($id_courrier);
448        $sql_where = "statut=".sql_quote(_SPIPLISTES_COURRIER_STATUT_ENCOURS);
449        if($id_courrier > 0) {
450                $sql_where .= " AND id_courrier=".sql_quote($id_courrier);
451        }
452        return(
453                sql_getfetsel(
454                        'SUM(total_abonnes)'
455                        , 'spip_courriers'
456                        , $sql_where
457                )
458        );
459}
460
461/*
462 * CP-20081124
463 * Assembler/calculer un patron
464 * @return array le resultat html et texte seul dans un tableau
465 * @param $patron string nom du patron
466 * @param $contexte array
467 * @param $ignorer bool
468 */
469function spiplistes_courriers_assembler_patron ($path_patron, $contexte, $ignorer = false) {
470
471        if($ignorer) {
472                $result = array("", "");
473        }
474        else {
475                $result = spiplistes_assembler_patron($path_patron, $contexte);
476        }
477       
478        return($result);
479}
480
481
482/*
483 * CP-20081130
484 * Calculer une balise a-la-SPIP pour le titre d'un courrier.
485 * Pour le moment, uniquement #DATE et 2 filtres sont autorises
486 * @return le titre calcule'
487 * @param $titre string
488 */
489function spiplistes_calculer_balise_titre ($titre) {
490
491        // longue comme un jour sans pain
492        $pattern = "=((?P<a>\[)?(?P<texte_avant>[^(\[]*)(?P<b>\()?\s*(?P<balise>#DATE)(?P<filtres>(\s*\|\s*\w+\s*{?\s*\'?\w+\'?\s*}?)*)\s*(?P<c>\))?(?P<texte_apres>[^(\]]*)(?P<d>\])?)=";
493       
494        if (preg_match($pattern, $titre, $match)) {
495               
496                if($match['balise'] == "#DATE") {
497                       
498                        $date = date('Y-m-d H:i:s');
499                       
500                        $texte_avant = isset($match['texte_avant']) ? $match['texte_avant'] : "";
501                        $texte_apres = isset($match['texte_apres']) ? $match['texte_apres'] : "";
502
503                        $envelop = "";
504                        foreach(array('a', 'b', 'c', 'd') as $ii) {
505                                $envelop .= (isset($match[$ii])) ? $match[$ii] : "";
506                        }
507                       
508                        if($envelop == "[()]") {
509                                $filtres = explode('|', $match['filtres']);
510                                foreach($filtres as $filtre) {
511                                        $filtre = trim($filtre);
512                                        if(preg_match("=(\w+)\s*(\{)?\s*(\'?\w*\'?)?\s*(\})?=", $filtre, $match)) {
513                                                switch($match[1]) {
514                                                        case 'affdate':
515                                                                $v = $match[3];
516                                                                $v = preg_replace("=[^dDjlNSwzWFmMntLoYyaABgGhHiseIOPTZcrU\: \-]=", "", $v);
517                                                                $date = date($v);
518                                                                break;
519                                                        case 'plus':
520                                                                $v = intval($match[3]);
521                                                                $date += $v;
522                                                                break;
523                                                }
524                                        }
525                                }
526                        }
527                       
528                        $titre = preg_replace($pattern, $texte_avant.$date.$texte_apres, $titre);
529                }
530        }
531        return($titre);
532}
533
534?>
Note: See TracBrowser for help on using the repository browser.