function version_texte($texte){ $texte = charset2unicode($texte); // accentuer le texte avant de suprimer les tags $texte = strtr($texte, array('&'=>'&', '"'=>'"', '<'=>'<', '>'=>'>', 'è'=>'è', 'é'=>'é', 'à' => 'à') ); $cherche = array ( /*01*/ '@<script[^>]*?>.*?</script>@si', // Supprime le javascript /*02*/ '@<style[^>]*?>.*?</style>@si', // Supprime les styles inline /*03*/ ",<link[^>]*>,Uims", // les css /*04*/ ",<img[^>]*alt=['\"]([^'\"]*)['\"][^>]*>,Uims", // les images ); $remplace = array ( /*01*/ '', /*02*/ '', /*03*/ '', /*04*/ '[\1]', ); // voir : TODO.txt $texte = preg_replace($cherche, $remplace, $texte); return $texte; }
function typographie_fr_dist($letexte) { static $trans; // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; // 147 = ldquo; 148 = rdquo; ' = zouli apostrophe if (!$trans) { $trans = array("'" => "’", " " => "~", "»" => "»", "«" => "«", "”" => "”", "“" => "“", "°" => "°"); $chars = array(160 => '~', 187 => '»', 171 => '«', 148 => '”', 147 => '“', 176 => '°'); $chars_trans = array_keys($chars); $chars = array_values($chars); $chars_trans = implode(' ', array_map('chr', $chars_trans)); $chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1', 'forcer')); $chars_trans = explode(" ", $chars_trans); foreach ($chars as $k => $r) { $trans[$chars_trans[$k]] = $r; } } $letexte = strtr($letexte, $trans); $cherche1 = array('/((?:^|[^\\#0-9a-zA-Z\\&])[\\#0-9a-zA-Z]*)\\;/S', '/»| --?,|(?::| %)(?:\\W|$)/S', '/([^[<(!?.])([!?][!?\\.]*)/iS', '/«|(?:M(?:M?\\.|mes?|r\\.?)|[MnN]°) /S'); $remplace1 = array('\\1~;', '~\\0', '\\1~\\2', '\\0~'); $letexte = preg_replace($cherche1, $remplace1, $letexte); $letexte = preg_replace("/ *~+ */S", "~", $letexte); $cherche2 = array('/([^-\\n]|^)--([^-]|$)/S', ',(http|https|ftp|mailto)~((://[^"\'\\s\\[\\]\\}\\)<>]+)~([?]))?,S', '/~/'); $remplace2 = array('\\1—\\2', '\\1\\3\\4', ' '); $letexte = preg_replace($cherche2, $remplace2, $letexte); return $letexte; }
/** * Exporter une ligne complete au format CSV, avec delimiteur fourni * @param array $ligne * @param string $delim * @return string */ function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) { $output = join($delim, array_map('exporter_csv_champ', $ligne))."\r\n"; if ($importer_charset){ $output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset); } return $output; }
function pdf_first_clean($texte){ // Cette focntion est appelé après la fonction propre // $texte = ereg_replace("<p class[^>]*>", "<P>", $texte); //Translation des codes iso // PB avec l'utilisation de <code> $trans = get_html_translation_table(HTML_ENTITIES); $texte = preg_replace(',<!-- .* -->,msU', '', $texte); // supprimer les remarques HTML (du Couteau Suisse ?) $trans = array_flip($trans); $trans["<br />\n"] = "<BR>"; // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code) $trans['°'] = "°"; $trans["œ"] = "oe"; $trans["‎"] = ""; $trans["–"] = "-"; $trans["‘"] = "'"; $trans["’"] = "'"; $trans["“"] = "\""; $trans["”"] = "\""; $trans["…"] = "..."; $trans["€"] = "Euros"; $trans["û"] = "û"; $trans['->'] = '-»'; $trans['<-'] = '«-'; $trans[' '] = ' '; // certains titles font paniquer l'analyse $texte = preg_replace(',title=".*",msU', 'title=""', $texte); $texte = unicode2charset(charset2unicode($texte), 'iso-8859-1'); // repasser tout dans un charset acceptable par export PDF $texte = strtr($texte, $trans); return $texte; }
function cs_test_spam(&$spam, &$texte, &$test) { foreach($spam[0] as $m) $test |= strpos($texte, $m)!==false; if(!$test && $spam[1]) $test = preg_match($spam[1], $texte); if(!$test && $spam[2]) { include_spip('inc/charsets'); $test = preg_match($spam[2], charset2unicode($texte)); } return $test; }
function crayons_json_encode($v) { if ($GLOBALS['meta']['charset'] == 'utf-8' and function_exists('json_encode')) { return json_encode($v); } $v = crayons_var2js($v); if ($GLOBALS['meta']['charset'] != 'utf-8') { include_spip('inc/charsets'); $v = charset2unicode($v); } return $v; }
function type_urls_URL_objet_191_exec() { global $type_urls; $type = _request('type_objet'); $table = $type.($type=='syndic'?'':'s'); $id_objet = intval(_request('id_objet')); $r0 = "SELECT url_propre, titre FROM spip_$table WHERE id_$type=$id_objet"; $r = spip_query($r0); if ($r AND $r = spip_fetch_array($r)) { $url_1 = $r['url_propre']; $titre = $r['titre']; } if(!function_exists($fct = 'generer_url_'.($type=='syndic'?'site':$type))) { if($f = include_spip('urls/'.$type_urls, false)) include_once($f); } $url = function_exists($fct)?$fct($id_objet):'??'; $r = spip_query($r0); if ($r AND $r = spip_fetch_array($r)) $url_2 = $r['url_propre']; // url propre en base || titre || url complete || type d'URLs || URL recalculee include_spip('inc/charsets'); echo _request('format')=='iframe' ?"<span style='font-family:Verdana,Arial,Sans,sans-serif; font-size:10px;'>[<a href='../$url' title='$url' target='_blank'>"._T('couteau:urls_propres_lien').'</a>]</span>' :$url_1.'||'.charset2unicode($titre).'||'.$url.'||'.$type_urls.'||'.$url_2; }
function couper($texte, $taille = 50, $suite = ' (...)') { if (!($length = strlen($texte)) or $taille <= 0) { return ''; } $offset = 400 + 2 * $taille; while ($offset < $length and strlen(preg_replace(",<[^>]+>,Uims", "", substr($texte, 0, $offset))) < $taille) { $offset = 2 * $offset; } if ($offset < $length && ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== NULL) { $p_tag_fermant = strpos($texte, '>', $offset); if ($p_tag_fermant && $p_tag_fermant < $p_tag_ouvrant) { $offset = $p_tag_fermant + 1; } // prolonger la coupe jusqu'au tag fermant suivant eventuel } $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */ // on utilise les \r pour passer entre les gouttes $texte = str_replace("\r\n", "\n", $texte); $texte = str_replace("\r", "\n", $texte); // sauts de ligne et paragraphes $texte = preg_replace("/\n\n+/", "\r", $texte); $texte = preg_replace("/<(p|br)( [^>]*)?" . ">/", "\r", $texte); // supprimer les traits, lignes etc $texte = preg_replace("/(^|\r|\n)(-[-#\\*]*|_ )/", "\r", $texte); // supprimer les tags $texte = supprimer_tags($texte); $texte = trim(str_replace("\n", " ", $texte)); $texte .= "\n"; // marquer la fin // travailler en accents charset $texte = unicode2charset(html2unicode($texte, true)); if (!function_exists('nettoyer_raccourcis_typo')) { include_spip('inc/lien'); } $texte = nettoyer_raccourcis_typo($texte); // corriger la longueur de coupe // en fonction de la presence de caracteres utf if ($GLOBALS['meta']['charset'] == 'utf-8') { $long = charset2unicode($texte); $long = spip_substr($long, 0, max($taille, 1)); $nbcharutf = preg_match_all('/(&#[0-9]{3,5};)/S', $long, $matches); $taille += $nbcharutf; } // couper au mot precedent $long = spip_substr($texte, 0, max($taille - 4, 1)); $u = $GLOBALS['meta']['pcre_u']; $court = preg_replace("/([^\\s][\\s]+)[^\\s]*\n?\$/" . $u, "\\1", $long); $points = $suite; // trop court ? ne pas faire de (...) if (spip_strlen($court) < max(0.75 * $taille, 2)) { $points = ''; $long = spip_substr($texte, 0, $taille); $texte = preg_replace("/([^\\s][\\s]+)[^\\s]*\n?\$/" . $u, "\\1", $long); // encore trop court ? couper au caractere if (spip_strlen($texte) < 0.75 * $taille) { $texte = $long; } } else { $texte = $court; } if (strpos($texte, "\n")) { // la fin est encore la : c'est qu'on n'a pas de texte de suite $points = ''; } // remettre les paragraphes $texte = preg_replace("/\r+/", "\n\n", $texte); // supprimer l'eventuelle entite finale mal coupee $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte); return quote_amp(trim($texte)) . $points; }
function typo_fr($letexte) { global $flag_strtr2; static $trans; // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; 147 = ldquo; 148 = rdquo if (!$trans) { $trans = array(" " => "~", "»" => "»", "«" => "«", "”" => "”", "“" => "“", "°" => "°"); $chars = array(160 => '~', 187 => '»', 171 => '«', 148 => '”', 147 => '“', 176 => '°'); $charset = read_meta('charset'); include_lcm('inc_charsets'); while (list($c, $r) = each($chars)) { $c = unicode2charset(charset2unicode(chr($c), 'iso-8859-1', 'forcer')); $trans[$c] = $r; } } if ($flag_strtr2) { $letexte = strtr($letexte, $trans); } else { reset($trans); while (list($c, $r) = each($trans)) { $letexte = str_replace($c, $r, $letexte); } } $cherche1 = array('/((^|[^\\#0-9a-zA-Z\\&])[\\#0-9a-zA-Z]*)\\;/', '/»| --?,|:([^0-9]|$)/', '/([^<!?])([!?])/', '/«|(M(M?\\.|mes?|r\\.?)|[MnN]°) /'); $remplace1 = array('\\1~;', '~\\0', '\\1~\\2', '\\0~'); $letexte = ereg_remplace($cherche1, $remplace1, $letexte); $letexte = preg_replace("/ *~+ */", "~", $letexte); $cherche2 = array('/([^-\\n]|^)--([^-]|$)/', '/(http|https|ftp|mailto)~:/', '/~/'); $remplace2 = array('\\1—\\2', '\\1:', ' '); $letexte = ereg_remplace($cherche2, $remplace2, $letexte); return $letexte; }
/** * Traduire une chaine internationalisée * * Lorsque la langue demandée n'a pas de traduction pour la clé de langue * transmise, la fonction cherche alors la traduction dans la langue * principale du site (défini par la meta `langue_site`), puis, à défaut * dans la langue française. * * Les traductions sont cherchées dans les modules de langue indiqués. * Par exemple le module `mots` dans la clé `mots:titre_mot`, pour une * traduction `es` (espagnol) provoquera une recherche dans tous les fichiers * `lang\mots_es.php`. * * Des surcharges locales peuvent être présentes également * dans les fichiers `lang/local_es.php` ou `lang/local.php` * * @note * Les couples clé/traductions déjà connus sont sauvés en interne * dans les globales `i18n_${module}_${lang}` tel que `i18n_mots_es` * et sont également sauvés dans la variable statique `deja_vu` * de cette fonction. * * @uses charger_langue() * @uses chercher_module_lang() * @uses surcharger_langue() * * @param string $ori * Clé de traduction, tel que `bouton_enregistrer` ou `mots:titre_mot` * @param string $lang * Code de langue, la traduction doit se faire si possible dans cette langue * @return string * Traduction demandée. Chaîne vide si aucune traduction trouvée. **/ function inc_traduire_dist($ori, $lang) { static $deja_vu = array(); static $local = array(); if (isset($deja_vu[$lang][$ori]) and _request('var_mode') != 'traduction') { return $deja_vu[$lang][$ori]; } // modules demandes explicitement <xxx|yyy|zzz:code> cf MODULES_IDIOMES if (strpos($ori, ':')) { list($modules, $code) = explode(':', $ori, 2); $modules = explode('|', $modules); $ori_complet = $ori; } else { $modules = array('spip', 'ecrire'); $code = $ori; $ori_complet = implode('|', $modules) . ':' . $ori; } $text = ''; $module_retenu = ''; // parcourir tous les modules jusqu'a ce qu'on trouve foreach ($modules as $module) { $var = "i18n_" . $module . "_" . $lang; if (empty($GLOBALS[$var])) { charger_langue($lang, $module); // surcharges persos -- on cherche // (lang/)local_xx.php et/ou (lang/)local.php ... if (!isset($local['local_' . $lang])) { // redéfinir la langue en cours pour les surcharges (chercher_langue a pu le changer) $GLOBALS['idx_lang'] = $var; // ... (lang/)local_xx.php $local['local_' . $lang] = chercher_module_lang('local', $lang); } if ($local['local_' . $lang]) { surcharger_langue($local['local_' . $lang]); } // ... puis (lang/)local.php if (!isset($local['local'])) { $local['local'] = chercher_module_lang('local'); } if ($local['local']) { surcharger_langue($local['local']); } } if (isset($GLOBALS[$var][$code])) { $module_retenu = $module; $text = $GLOBALS[$var][$code]; break; } } // Retour aux sources si la chaine est absente dans la langue cible ; // on essaie d'abord la langue du site, puis a defaut la langue fr $langue_retenue = $lang; if (!strlen($text) and $lang !== _LANGUE_PAR_DEFAUT) { if ($lang !== $GLOBALS['meta']['langue_site']) { $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']); $langue_retenue = !strlen($text) ? $GLOBALS['meta']['langue_site'] : ''; } else { $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT); $langue_retenue = !strlen($text) ? _LANGUE_PAR_DEFAUT : ''; } } // Supprimer la mention <NEW> ou <MODIF> if (substr($text, 0, 1) === '<') { $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text); } // Si on n'est pas en utf-8, la chaine peut l'etre... // le cas echeant on la convertit en entites html &#xxx; if ((!isset($GLOBALS['meta']['charset']) or $GLOBALS['meta']['charset'] !== 'utf-8') and preg_match(',[\\x7f-\\xff],S', $text)) { include_spip('inc/charsets'); $text = charset2unicode($text, 'utf-8'); } if (_request('var_mode') == 'traduction') { if ($text) { $classe = 'debug-traduction' . ($module_retenu == 'ecrire' ? '-prive' : ''); $text = '<span lang=' . $langue_retenue . ' class=' . $classe . ' title=' . $ori_complet . '(' . $langue_retenue . ')>' . $text . '</span>'; $text = str_replace(array("{$module_retenu}:", "{$module_retenu}|"), array("*{$module_retenu}*:", "*{$module_retenu}*|"), $text); } } else { $deja_vu[$lang][$ori] = $text; } return $text; }
function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { include_spip('inc/xml'); $arbre = spip_xml_parse($desc); $verifie_conformite = charger_fonction('verifie_conformite', 'plugins'); $verifie_conformite($plug, $arbre, $dir_plugins); include_spip('inc/charsets'); // On renvoie la DTD utilisee $ret['dtd'] = "plugin"; if (isset($arbre['categorie'])) { $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie'])); } if (isset($arbre['nom'])) { $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom'])); } if (isset($arbre['icon'])) { $ret['logo'] = trim(spip_xml_aplatit($arbre['icon'])); } if (isset($arbre['auteur'])) { $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur'])); } // garder le 1er niveau en tableau mais traiter le multi possible if (isset($arbre['licence'])) { $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence'])); } if (isset($arbre['version'])) { $ret['version'] = trim(spip_xml_aplatit($arbre['version'])); } if (isset($arbre['version_base'])) { $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base'])); } if (isset($arbre['etat'])) { $ret['etat'] = trim(spip_xml_aplatit($arbre['etat'])); } $ret['description'] = $ret['slogan'] = ""; if (isset($arbre['slogan'])) { $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan'])); } if (isset($arbre['description'])) { $ret['description'] = trim(spip_xml_aplatit($arbre['description'])); } if (isset($arbre['lien'])) { $ret['documentation'] = trim(join(' ', $arbre['lien'])); if ($ret['documentation']) { // le lien de doc doit etre une url et c'est tout if (!preg_match(',^https?://,iS', $ret['documentation'])) { $ret['documentation'] = ""; } } } if (isset($arbre['options'])) { $ret['options'] = $arbre['options']; } if (isset($arbre['fonctions'])) { $ret['fonctions'] = $arbre['fonctions']; } if (isset($arbre['prefix'][0])) { $ret['prefix'] = trim(array_pop($arbre['prefix'])); } if (isset($arbre['install'])) { $ret['install'] = $arbre['install']; } if (isset($arbre['meta'])) { $ret['meta'] = trim(spip_xml_aplatit($arbre['meta'])); } $necessite = info_plugin_normalise_necessite($arbre['necessite']); $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : ''; $ret['necessite'] = $necessite['necessite']; $ret['lib'] = $necessite['lib']; $ret['utilise'] = info_plugin_normalise_utilise($arbre['utilise']); $ret['procure'] = info_plugin_normalise_procure($arbre['procure']); $ret['chemin'] = info_plugin_normalise_chemin($arbre['path']); if (isset($arbre['pipeline'])) { $ret['pipeline'] = $arbre['pipeline']; } $extraire_boutons = charger_fonction('extraire_boutons', 'plugins'); $les_boutons = $extraire_boutons($arbre); $ret['menu'] = $les_boutons['bouton']; $ret['onglet'] = $les_boutons['onglet']; $ret['traduire'] = $arbre['traduire']; if (isset($arbre['config'])) { $ret['config'] = spip_xml_aplatit($arbre['config']); } if (isset($arbre['noisette'])) { $ret['noisette'] = $arbre['noisette']; } if (isset($arbre['erreur'])) { $ret['erreur'] = $arbre['erreur']; if ($plug) { spip_log("infos_plugin {$plug} " . @join(' ', $arbre['erreur'])); } } return $ret; }
function inc_traduire_dist($ori, $lang) { static $deja_vu = array(); if (isset($deja_vu[$lang][$ori])) return $deja_vu[$lang][$ori]; // modules demandes explicitement <xxx/yyy/zzz:code> if (strpos($ori,':')) { list($modules,$code) = explode(':',$ori,2); $modules = explode('/', $modules); } else { $modules = array('spip', 'ecrire'); $code = $ori; } $text = ''; // parcourir tous les modules jusqu'a ce qu'on trouve foreach ($modules as $module) { $var = "i18n_".$module."_".$lang; if (empty($GLOBALS[$var])) { charger_langue($lang, $module); // surcharge perso -- on cherche (lang/)local_xx.php ... if ($f = chercher_module_lang('local', $lang)) surcharger_langue($f); // ... puis (lang/)local.php if ($f = chercher_module_lang('local')) surcharger_langue($f); } if (isset($GLOBALS[$var][$code])) { $text = $GLOBALS[$var][$code]; break; } } // Retour aux sources si la chaine est absente dans la langue cible ; // on essaie d'abord la langue du site, puis a defaut la langue fr if (!strlen($text) AND $lang !== 'fr') { if ($lang !== $GLOBALS['meta']['langue_site']) $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']); else $text = inc_traduire_dist($ori, 'fr'); } // Supprimer la mention <NEW> ou <MODIF> if (substr($text,0,1) === '<') $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text); // Si on n'est pas en utf-8, la chaine peut l'etre... // le cas echeant on la convertit en entites html &#xxx; if ($GLOBALS['meta']['charset'] !== 'utf-8' AND preg_match(',[\x7f-\xff],S', $text)) { include_spip('inc/charsets'); $text = charset2unicode($text,'utf-8'); } $deja_vu[$lang][$ori] = $text; return $text; }
function translitteration($texte, $charset = 'AUTO', $complexe = '') { static $trans; if ($charset == 'AUTO') { $charset = read_meta('charset'); } $charset = strtolower($charset); $table_translit = 'translit' . $complexe; // 1. Passer le charset et les é en utf-8 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); // 2. Translitterer grace a la table predefinie if (!$trans[$complexe]) { global $CHARSET; load_charset($table_translit); reset($CHARSET[$table_translit]); while (list($key, $val) = each($CHARSET[$table_translit])) { $trans[$complexe][caractere_utf_8($key)] = $val; } } if ($GLOBALS['flag_strtr2']) { $texte = strtr($texte, $trans[$complexe]); } else { $tr = $trans[$complexe]; while (list($from, $to) = each($tr)) { $texte = str_replace($from, $to, $texte); } } /* // Le probleme d'iconv c'est qu'il risque de nous renvoyer des ? alors qu'on // prefere garder l'utf-8 pour que la chaine soit indexable. // 3. Translitterer grace a iconv if ($GLOBALS['flag_iconv'] && preg_match('/�*([0-9]+);/', $texte)) { $texte = iconv('utf-8', 'ascii//translit', $texte); } */ return $texte; }
function filtrer_ical($texte) { #include_spip('inc/charsets'); $texte = html2unicode($texte); $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset'], 1), 'utf-8'); $texte = preg_replace("/\n/", " ", $texte); $texte = preg_replace("/,/", "\\,", $texte); return $texte; }
function afficher_diff($texte) { $charset = $GLOBALS['meta']['charset']; if ($charset == 'utf-8') { return $texte; } return charset2unicode($texte, 'utf-8'); }
function spiplistes_envoyer_mail ($to, $subject, $message, $from = false, $headers = '', $format = 'texte') { static $opt_simuler_envoi; // si desabo, plus de format ! donc forcer a texte $format = ($format == 'html') ? $format : 'texte'; $charset = $GLOBALS['meta']['spiplistes_charset_envoi']; if(!$opt_simuler_envoi) { $opt_simuler_envoi = spiplistes_pref_lire('opt_simuler_envoi'); } if (!$from) { $from = spiplistes_email_from_default(); } if(strpos($from, '<') === false) { $fromname = spiplistes_nom_site_texte(); if ($charset != $GLOBALS['meta']['charset']){ include_spip('inc/charsets'); $fromname = unicode2charset(charset2unicode($fromname),$charset); } } // @TODO: voir email_reply_to ? $reply_to = 'no-reply'.preg_replace("|.*(@[a-z.]+)|i", "$1", email_valide($from)); if($opt_simuler_envoi == 'oui') { spiplistes_log("!!! MAIL SIMULATION MODE !!!"); $result = true; } else { include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php'); $email_a_envoyer = array(); $return_path = spiplistes_return_path($from); if(is_array($message)) { if($format=='html' && isset($message[$format])) { $email_a_envoyer['html'] = new phpMail($to, $subject, $message['html'], $message['texte'], $charset); $email_a_envoyer['html']->From = $from ; if($fromname) $email_a_envoyer['html']->FromName = $fromname ; $email_a_envoyer['html']->AddCustomHeader("Errors-To: ".$return_path); $email_a_envoyer['html']->AddCustomHeader("Reply-To: ".$from); $email_a_envoyer['html']->AddCustomHeader("Return-Path: ".$return_path); $email_a_envoyer['html']->SMTPKeepAlive = true; $email_a_envoyer['html']->Body = $message['html']->Body; $email_a_envoyer['html']->AltBody = $message['html']->AltBody; } $message = $message['texte']->Body; } //$message = spiplistes_html_entity_decode ($message, $charset); $message = spiplistes_translate_2_charset ($message, $charset, true); //$email_a_envoyer['texte'] = new phpMail($to, $subject, '', html_entity_decode($message), $charset); $email_a_envoyer['texte'] = new phpMail($to, $subject, '', $message, $charset); $email_a_envoyer['texte']->From = $from ; if($fromname) $email_a_envoyer['html']->FromName = $fromname ; $email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); $email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$reply_to); $email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); $email_a_envoyer['texte']->SMTPKeepAlive = true; $result = $email_a_envoyer[$format]->send(); $msg = "email from $from to $to"; spiplistes_log(!$result ? "error: $msg not sent" : "$msg sent"); } return($result); }
/** * Traitement de l'export des donnees auteurs. * * @param string $criteres de selection des auteurs * * @return array $retour nbre auteurs exportes et message de confirmation d'action. */ function exec_adhauteurs_export() { // Preparation affichage des choix type d'export $criteres_tot = _request('criteres'); $criteres = explode('|', $criteres_tot, 7); // Preparation de l'export des criteres (mise en forme dans le fichier out) // -- saison -- if (intval($criteres[2])) { $lib_criteres = sql_getfetsel('titre', 'spip_adhsaisons', array('id_saison=' . intval($criteres[2]))); $export_crit[0] = array('Saison', $lib_criteres); } else { $export_crit[0] = array('Saison', 'active'); } // -- technique -- if (intval($criteres[3])) { $adhwhere = array("type = 'niveau_Technique'"); $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[3]))); $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere); $export_crit[1] = array('Techbase', $lib_criteres); } else { $export_crit[1] = array('Techbase', '<<Tous>>'); } // -- encadrement -- if (intval($criteres[4])) { $adhwhere = array("type='Niveau_Encadrement'"); $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[4]))); $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere); $export_crit[2] = array('Encadrant', $lib_criteres); } else { $export_crit[2] = array('Encadrant', '<<Tous>>'); } // -- niveau -- if (intval($criteres[5])) { $lib_criteres = sql_getfetsel('titre', 'spip_adhnivs', array('id_niveau =' . intval($criteres[5]))); $export_crit[3] = array('Niveau', $criteres[6], $lib_criteres); } else { $export_crit[3] = array('Niveau', '<<Tous>>'); } $export_crit[4] = array('Champ', $criteres[0], $criteres[1]); /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - exec_adhauteurs_export - Pt05 - "; adhclub_log("$debug1.", true); adhclub_log("criteres tot= $criteres_tot.", true); adhclub_log("criteres 0= $criteres[0].", true); adhclub_log("criteres 1= $criteres[1].", true); adhclub_log("criteres 2= $criteres[2].", true); adhclub_log("criteres 3= $criteres[3].", true); adhclub_log("criteres 4= $criteres[4].", true); adhclub_log("criteres 5= $criteres[5].", true); adhclub_log("criteres 6= $criteres[6].", true); adhclub_log("criteres 7= $criteres[7].", true); adhclub_log("FIN $debug1.", true); */ $retour = _request('retour'); $delim = _request('delim'); if ($delim == 'TAB') { $delim = "\t"; } if (!$retour) { $retour = generer_url_ecrire('adh_adherents'); } $titre = _T("adhclub:exporter_user_nb", array('nb_auteurs' => $nb_auteurs)); if (!$delim) { $icone = _DIR_PLUGIN_ADHCLUB . "img_pack/adh_export-24.png"; // // Affichage de la page // $commencer_page = charger_fonction('commencer_page', 'inc'); pipeline('exec_init', array('args' => $_GET, 'data' => '')); echo $commencer_page($titre, "adhclub"); echo debut_gauche('', true); $raccourcis = recuperer_fond("prive/inclure/adh_menu_tous", $contexte); echo bloc_des_raccourcis($raccourcis); echo pipeline('affiche_gauche', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => '')); echo creer_colonne_droite("", true); echo pipeline('affiche_droite', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => '')); echo debut_droite("", true); $milieu = ''; $milieu .= "<div class='entete-formulaire'>"; // Icones retour if ($retour) { $milieu .= icone_verticale(_T('icone_retour'), $retour, $icone, "rien.gif", $GLOBALS['spip_lang_left']); } $milieu .= gros_titre($titre, '', false); $milieu .= "</div>"; $milieu .= "<div class='formulaire_spip'>"; $action = generer_url_ecrire("adhauteurs_export", "criteres={$criteres_tot}&retour={$retour}"); $milieu .= "\n<form action='{$action}' method='post' class='formulaire_editer'><div>" . form_hidden($action); $milieu .= "<ul><li><label for='delim'>" . _T("adhclub:export_format") . "</label>"; $milieu .= "<select name='delim' id='delim'>\n"; $milieu .= "<option value=','>" . _T("adhclub:export_classique") . "</option>\n"; $milieu .= "<option value=';'>" . _T("adhclub:export_excel") . "</option>\n"; $milieu .= "<option value='TAB'>" . _T("adhclub:export_tabulation") . "</option>\n"; $milieu .= "</select></li></ul>"; $milieu .= "<p class='boutons'><input type='submit' class='submit' name='ok' value='" . _T('bouton_download') . "' /></p>\n"; $milieu .= "</div></form>"; $milieu .= "</div>"; echo pipeline('affiche_milieu', array('args' => array('exec' => 'adhauteurs_export', 'criteres' => $criteres_tot, 'retour' => $retour), 'data' => $milieu)); echo fin_gauche(), fin_page(); exit; } // Debut de l'export des donnees // Recuperation de la requete des adherents suivant filtrage (array de la forme SELECT..) $sql_adh_auteurs = adh_recherche($criteres[0], $criteres[1], 'spip_auteurs', $criteres[2], $criteres[3], $criteres[4], $criteres[5], $criteres[6], true); if ($sql_adh_auteurs) { // JR 20/03/2013 - Definir les colonnes a extraire pour $adh_select $adhselect_l = array("au.id_auteur", "au.nom_famille", "au.prenom", "au.sexe", "au.naissance", "au.fonction as licence", "au.mobile", "au.telephone", "au.email", "au.certiflimite as date_certif", "au.certifaspirine as allergie_aspirine", "au.certifqualif as certif_restreint"); $adhfrom_l = array("spip_auteurs au"); $adhwhere_l = array("au.id_auteur IN(" . $sql_adh_auteurs . ")"); // -- Si la saison est explicite, // on recherche les données Cotisations et Assurances associees a chaque auteur if (intval($criteres[2])) { $adhselect_l = array_merge($adhselect_l, array("co_l.id_coti", "co_l.titre as cotisation", "co_l.mnt_cotis", "as_l.id_assur", "as_l.titre as assurance", "as_l.mnt_assur")); $adhfrom_l = array_merge($adhfrom_l, array("spip_adhcotis co_l", "spip_adhcotis_liens ca_l", "spip_adhassurs as_l", "spip_adhassurs_liens aa_l")); $adhwhere_l = array_merge($adhwhere_l, array("au.id_auteur=ca_l.id_objet", "ca_l.objet='auteur'", "ca_l.id_coti=co_l.id_coti", "co_l.id_saison=" . intval($criteres[2]), "co_l.complement='non'", "au.id_auteur=aa_l.id_objet", "aa_l.objet='auteur'", "aa_l.id_assur=as_l.id_assur", "as_l.id_saison=" . intval($criteres[2]))); } /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt25 - "; adhclub_log("$debug1.", true); $debug2 = sql_get_select($adhselect_l, $adhfrom_l, sql_in('au.id_auteur', $sql_adh_auteurs)); adhclub_log("debug2=$debug2.", true); adhclub_log("adhwhere_l=$adhwhere_l.", true); $debug3 = sql_get_select($adhselect_l, $adhfrom_l, $adhwhere_l); adhclub_log("debug3=$debug3.", true); adhclub_log("FIN $debug1.", true); */ if ($export_auteurs = sql_allfetsel($adhselect_l, $adhfrom_l, $adhwhere_l)) { foreach ($export_auteurs as $ligne) { $list_entete = array(); $list_valeur = array(); foreach ($ligne as $k => $v) { /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt35 - "; adhclub_log("$debug1.", true); adhclub_log("k= $k , v= $v.", true); adhclub_log("FIN $debug1.", true);*/ $list_entete = array_merge($list_entete, array($k)); $list_valeur = array_merge($list_valeur, array($v)); } // Ecriture de l'entete des colonnes. if ($nb_auteurs == 0) { // JR-2013/08/01-Mise en forme des criteres en tete du fichier exporte. // JR-25/03/2015-Utilisation des F(spip_bonux) existantes. $output = exporter_csv_ligne(array('CRITERES'), $delim); $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim); $output .= exporter_csv_ligne($export_crit[0], $delim); $output .= exporter_csv_ligne($export_crit[1], $delim); $output .= exporter_csv_ligne($export_crit[2], $delim); $output .= exporter_csv_ligne($export_crit[3], $delim); $output .= exporter_csv_ligne($export_crit[4], $delim); $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim); // JR-20130801-Entetes de colonnes. $output .= exporter_csv_ligne($list_entete, $delim); } // Ecriture des lignes de donnees. $output .= exporter_csv_ligne($list_valeur, $delim); ++$nb_auteurs; } $charset = $GLOBALS['meta']['charset']; $file_csv = "export_auteurs_" . date('Ymd_His'); // @todo-JR-25/03/2015-Utilisation des F(spip_bonux) existantes. Attention remplissage criteres. //$filename = inc_exporter_csv($file_csv, ' ', $delim); $filename = preg_replace(',[^-_\\w]+,', '_', translitteration(textebrut(typo($file_csv)))); // Excel ? if ($delim == ',') { $extension = 'csv'; } else { // Extension 'csv' si delim = ';' (et pas forcément 'xls' !) if ($delim == ';') { $extension = 'csv'; } else { $extension = 'xls'; } } # Excel n'accepte pas l'utf-8 ni les entites html... on fait quoi? include_spip('inc/charsets'); $output = unicode2charset(charset2unicode($output), 'iso-8859-1'); $charset = 'iso-8859-1'; } Header("Content-Type: text/comma-separated-values; charset={$charset}"); Header("Content-Disposition: attachment; filename={$filename}.{$extension}"); //Header("Content-Type: text/plain; charset=$charset"); Header("Content-Length: " . strlen($output)); echo $output; exit; //*/ } else { include_spip('inc/minipres'); echo minipres(); } }
/** * complete caracteres manquants dans HTML -> ISO * @return la chaine transcrite * @param $texte le texte a transcrire * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config) * @param $is_html flag. Pour ne pas transcrire completement la version html * @see http://fr.wikipedia.org/wiki/ISO_8859-1 * @see http://www.w3.org/TR/html401/sgml/entities.html */ function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false) { $texte = charset2unicode($texte); $texte = unicode2charset($texte, $charset); if ($is_html) { $texte = spiplistes_html_entity_decode ($texte, $charset); } if($charset != 'utf-8') { $texte = spiplistes_iso2ascii ($texte, $is_html); } return($texte); }
function spipdf_first_clean($texte){ // supprimer les remarques HTML (du Couteau Suisse ?) $texte = preg_replace(',<!-- .* -->,msU', '', $texte); $trans = array(); $trans["<br />\n"] = '<BR>'; // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code) // gestion d'un encodage latin1 if (SPIPDF_CHARSET=='ISO-8859-15' || SPIPDF_CHARSET=='iso-8859-15'){ $trans['°'] = '°'; $trans['œ'] = 'oe'; $trans['–'] = '-'; $trans['‘'] = '\''; $trans['’'] = '\''; $trans['“'] = '"'; $trans['”'] = '"'; $trans['…'] = '...'; $trans['€'] = 'Euros'; $trans['û'] = 'û'; $trans['->'] = '-»'; $trans['<-'] = '«-'; $trans['—'] = '-'; $trans['°'] = '°'; $trans['œ'] = 'oe'; $trans['Œ'] = 'OE'; $trans['…'] = '...'; $trans['€'] = 'Euros'; $trans['€'] = 'Euros'; $trans['©'] = '©'; } // pas d'insécable $trans[' '] = ' '; // certains titles font paniquer l'analyse // TODO : a peaufiner car ils sont necessaires pour les signets // <bookmark title="Compatibilité" level="0" ></bookmark> // http://wiki.spipu.net/doku.php?id=html2pdf:fr:v4:bookmark //$texte = preg_replace(',title=".*",msU', 'title=""', $texte); $texte = strtr($texte, $trans); if (SPIPDF_CHARSET=='UTF-8'){ $texte = charset2unicode($texte); } else { $texte = unicode2charset(charset2unicode($texte), SPIPDF_CHARSET); // Repasser tout dans le charset demandé } // Décoder les codes HTML dans le charset final $texte = html_entity_decode($texte, ENT_NOQUOTES, SPIPDF_CHARSET); return $texte; }
/** * Envoie le courrier pret au depart * * Prend dans le panier des courriers a envoyer (spip_courriers) les encours * - formate le titre, texte pour l'envoi * * * les etiquettes sont dans la queue d'envois (spip_auteurs_courriers) * - id_auteur (pour reprendre l'adresse mail de id_auteur) * - id_courrier (le courrier a dupliquer/envoyer) * * la queue (spip_auteurs_courriers) a ete remplie par cron_spiplistes_cron() * se sert de la queue pour ventiler les envois par lots * le courrier (spip_courriers) doit avoir date <= time() et statut 'encour' * si email_test, la meleuse envoie le courrier a email_test, * supprime email_test du courrier * et repositionne le statut du courrier en 'redac' * si pas email_test mais id_liste, * regarde la queue d'envois (spip_auteurs_courriers) * et passe le statut du courrier (spip_courriers) a : * 'publie' si type == 'nl' (newsletter) * 'auto' si type == 'auto' (liste programmee) * et envoie les courriers precises aux abonnes de cette liste * et supprime l'identifiant du courrier dans la queue d'envois (spip_auteurs_courriers) * renvoie: * - nul, si la tache n'a pas a etre effectuee * - positif, si la tache a ete effectuee * - negatif, si la tache doit etre poursuivie ou recommencee * * @package spiplistes * @param int $last_time * @return int */ function spiplistes_meleuse ($last_time) { //spiplistes_debug_log('spiplistes_meleuse()'); include_spip('inc/meta'); include_spip('inc/texte'); include_spip('inc/filtres'); include_spip('inc/acces'); include_spip('inc/spiplistes_api'); include_spip('inc/spiplistes_api_courrier'); include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php'); // initialise les options (preferences) foreach(array( 'opt_simuler_envoi' , 'opt_suspendre_meleuse' , 'opt_lien_en_tete_courrier', 'lien_patron' , 'opt_ajout_pied_courrier', 'pied_patron' , 'opt_ajout_tampon_editeur' , 'opt_personnaliser_courrier' , 'opt_log_voir_destinataire' , 'opt_ajout_lien_desabo' ) as $key) { $$key = spiplistes_pref_lire($key); } $sql_vide = sql_quote(''); $nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide); $prefix_log = _SPIPLISTES_PREFIX_LOG; // si meleuse suspendue, signale en log if($opt_suspendre_meleuse == 'oui') { spiplistes_log($prefix_log.'SUSPEND MODE !!!'); return(0 - $last_time); } if($nb_etiquettes) { $eol = "\n"; $eol2 =$eol.$eol; $body_html_debut = '<html>'.$eol2.'<body style="margin:0;padding:0;">'.$eol2; $body_html_fin = $eol2.'</body></html>'; $charset_spip = $GLOBALS['meta']['charset']; $charset_dest = $GLOBALS['meta']['spiplistes_charset_envoi']; spiplistes_log($prefix_log.$nb_etiquettes.' job(s), distribution...'); $log_voir_destinataire = ($opt_log_voir_destinataire == 'oui'); $simuler_envoi = ($opt_simuler_envoi == 'oui'); // signale en log si mode simulation if($simuler_envoi) { spiplistes_log($prefix_log.'SIMULATION MODE !!!'); } // prepare le tampon editeur if($opt_ajout_tampon_editeur == 'oui') { list($tampon_html, $tampon_texte) = spiplistes_tampon_assembler_patron(); } else { $tampon_html = $tampon_texte = ''; } // prendre la premiere etiquette sur le tas et traiter son courrier $sql_courrier_select = array( 'titre', 'texte', 'message_texte', 'type' , 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi' ); if($id_courrier = intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide)) ) { $sql_courrier_a_traiter = spiplistes_courriers_casier_premier( $sql_courrier_select , 'id_courrier='.sql_quote($id_courrier) ); spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier); } else { // un vieux bug dans une ancienne version, eradique depuis (j'espere ;-) //spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !"); spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier' , array('s' => $prefix_log)) ); } // boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur while($row = sql_fetch($sql_courrier_a_traiter)) { foreach($sql_courrier_select as $key) { $$key = $row[$key]; } foreach(array('id_courrier','id_liste','total_abonnes') as $key) { $$key = intval($$key); } // objet (subject) ne peut pas être en html ?! // sauf pour le webmail (et encore) $objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre)))); $page_html = stripslashes($texte); $message_texte = stripslashes($message_texte); $nb_emails = array(); // compteur pour la session uniquement // le total de chaque sera ajoute en fin de session $nb_emails_envoyes = $nb_emails_echec = $nb_emails_non_envoyes = $nb_emails['texte'] = $nb_emails['html'] = 0 ; $str_log = 'id_courrier #'.$id_courrier; ////////////////////////// // Determiner email de l emetteur if($is_a_test = email_valide($email_test)) { // courrier a destination adresse email de test $str_log .= ' TO: '.$email_test.' (TEST)'; } else if($id_liste > 0) { // courrier a destination des abonnes d'une liste $total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste); $str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)'; $lang = spiplistes_listes_langue($id_liste); if($lang != '') { $GLOBALS['spip_lang'] = $lang; } $contexte = array('lang' => $lang); list($pied_html, $pied_texte) = spiplistes_pied_page_assembler_patron($id_liste, $lang); } else { // erreur dans un script d'appel ? Ou url ? Ou base erreur ? $str_log .= ' [ERROR] MISSING PARAMS (id_liste AND email_test)'; spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR); // quitte while() principal break; } ////////////////////////////// // email emetteur $email_envoi = spiplistes_listes_email_emetteur($id_liste); if(!$is_a_test && !($email_envoi)) { $str_log .= ' [ERROR] ID_LISTE #'.$id_liste.' or from email MISSING'; spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR); // quitte while() principal break; } $from = $email_envoi; if($from_valide = email_valide($from)) { if(strpos($from, '<') === false) { $fromname = spiplistes_nom_site_texte ($lang); $fromname = extraire_multi($GLOBALS['meta']['nom_site']); if ($charset_dest!=$charset_spip) { include_spip('inc/charsets'); $fromname = unicode2charset(charset2unicode($fromname),$charset_dest); } } } else { spiplistes_log('[ERROR] from address incorrect: '.$from); if($is_a_test) { spiplistes_courriers_statut_redac ($id_courrier); } // break; // garder pour incrementer les erreurs des listes } $email_reply_to = spiplistes_pref_lire_defaut('email_reply_to', $from); $return_path = spiplistes_pref_lire_defaut('email_return_path_defaut', $from); //////////////////////////////////// // Prepare la version texte $objet_texte = $titre; $page_texte = ($message_texte !='') ? $message_texte : spiplistes_courrier_version_texte($page_html) ; //////////////////////////////////// // Ajoute lien tete de courrier if( ($opt_lien_en_tete_courrier == 'oui') && !empty($lien_patron) ) { list($lien_html, $lien_texte) = spiplistes_courriers_assembler_patron ( _SPIPLISTES_PATRONS_TETE_DIR . $lien_patron , array('id_courrier' => $id_courrier , 'lang' => $lang) ); $page_html = $lien_html . $page_html; $page_texte = $lien_texte . $page_texte; } //////////////////////////////////// // La petite ligne du renvoi du cookie pour modifier son abonnement //$pied_rappel_html = _T('spiplistes:modif_abonnement_html'); //$pied_rappel_texte = _T('spiplistes:modif_abonnement_text'); // transcrire le contenu if($charset_dest != $charset_spip){ include_spip('inc/charsets'); foreach(array( 'objet_html', 'objet_texte' , 'page_html', 'page_texte' , 'pied_html', 'pied_texte' //, 'pied_rappel_html', 'pied_rappel_texte' , 'tampon_html', 'tampon_texte') as $key) { if(!empty($$key)) { $$key = spiplistes_translate_2_charset( $$key , $charset_dest , (strpos($key, 'texte') === false) ); } } } // corrige les liens relatifs (celui de texte a deja ete corrige par la trieuse (cron) foreach(array('pied_html', 'pied_texte' //, 'pied_rappel_html', 'pied_rappel_texte' , 'tampon_html', 'tampon_texte') as $key) { if(!empty($$key)) { $$key = spiplistes_liens_absolus ($$key); } } $email_a_envoyer = array(); $email_a_envoyer['texte'] = new phpMail('', $objet_texte, '' , $page_texte, $charset_dest); $email_a_envoyer['texte']->From = $from ; if($fromname) $email_a_envoyer['texte']->FromName = $fromname ; // Errors-To:, Non-standard @see: http://www.ietf.org/rfc/rfc2076.txt //$email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); $email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$email_reply_to); $email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); $email_a_envoyer['texte']->SMTPKeepAlive = true; //$email_a_envoyer['html'] = new phpMail('', $objet_html, $page_html, $page_texte, $charset_dest); $email_a_envoyer['html'] = new phpMail('' , $objet_html , $page_html , $page_texte , $charset_dest ); $email_a_envoyer['html']->From = $from ; if($fromname) { $email_a_envoyer['html']->FromName = $fromname ; } //$email_a_envoyer['html']->AddCustomHeader('Errors-To: '.$return_path); $email_a_envoyer['html']->AddCustomHeader('Reply-To: '.$email_reply_to); $email_a_envoyer['html']->AddCustomHeader('Return-Path: '.$return_path); $email_a_envoyer['html']->SMTPKeepAlive = true; $str_log .= ' REPLY-TO: '.$email_reply_to.' RETURN-PATH: '.$return_path; if($total_abonnes) { $limit = intval($GLOBALS['meta']['spiplistes_lots']); // nombre de messages envoyes par boucles. if($is_a_test) { $sql_adresses_dest = sql_select('id_auteur,nom,email', 'spip_auteurs' , 'email='.sql_quote($email_test).' LIMIT 1'); } else { // Pour memo: les etiquettes sont creees par la trieuse // ou directement en backoffice // - pour les envois de test // - pour les envoyer maintenant des courriers // Traitement d'une liasse d'etiquettes // un id pour ce processus (le tampon est unique par liasse) $id_process = intval(substr(creer_uniqid(),0,5)); $prefix_log .= '['.$id_process.'] '; // un coup de tampon sur les etiquettes // des courriers qui vont partir spiplistes_courriers_en_queue_modifier( array( 'etat' => sql_quote($id_process)) , 'etat='.$sql_vide.' AND id_courrier='.sql_quote($id_courrier).' LIMIT '.$limit ); // prendre la liasse des etiquettes tamponnees $sql_adresses_dest = sql_select( array('a.nom', 'a.id_auteur', 'a.email') , array('spip_auteurs AS a', 'spip_auteurs_courriers AS b') , array( 'etat='.sql_quote($id_process) , 'a.id_auteur=b.id_auteur' , 'b.id_courrier='.sql_quote($id_courrier) ) , 'a.email' ); } $nb_destinataires = sql_count($sql_adresses_dest); spiplistes_log($prefix_log.'nb etiquettes a traiter: '.$nb_destinataires); if($nb_destinataires > 0) { spiplistes_debug_log($prefix_log.'total_abos: '.$total_abonnes.', en cours: '.$nb_destinataires.', limit: '.$limit); /* // CP:20100215: inutile de compter AVANT // si process en //, le chiffre est faux // replacer les compteurs if($row = sql_fetch(sql_select( "nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html" , 'spip_courriers' , 'id_courrier='.sql_quote($id_courrier) , '', '', 1 )) ) { $nb_emails_envoyes = intval($row['nb_emails_envoyes']); $nb_emails_echec = intval($row['nb_emails_echec']); $nb_emails_non_envoyes = intval($row['nb_emails_non_envoyes']); $nb_emails['texte'] = intval($row['nb_emails_texte']); $nb_emails['html'] = intval($row['nb_emails_html']); } */ //envoyer le lot d'emails selectionne' (la liasse) while($adresse = sql_fetch($sql_adresses_dest)) { if($log_voir_destinataire) { $str_temp = ''; } $id_auteur = intval($adresse['id_auteur']); $nom_auteur = $adresse['nom']; $email = $adresse['email']; // Marquer le debut de l'envoi if(!intval($date_debut_envoi)) { spiplistes_courrier_modifier ($id_courrier, array('date_debut_envoi' => 'NOW()'), false); } $format_abo = spiplistes_format_abo_demande($id_auteur); $total++; if($log_voir_destinataire) { $str_temp .= $nom_auteur.'('.$format_abo.') - '.$email; } unset ($cookie); if(($format_abo=='html') || ($format_abo=='texte')) { $cookie = creer_uniqid(); spiplistes_auteurs_cookie_oubli_updateq($cookie, $email); if($from_valide) { //$_url = generer_url_public('abonnement','d='.$cookie); if($opt_personnaliser_courrier == 'oui') { list($ventre_html, $ventre_texte) = spiplistes_personnaliser_courrier( $page_html , $page_texte , $id_auteur , $format_abo ); } else { $ventre_html = $page_html; $ventre_texte = $page_texte; } // le & semble poser probleme sur certains MUA. A suivre... //$_url = preg_replace(',(&),','&', $_url); // Pour le moment (27/03/2011), un seul patron connu $lien_rappel = 'lien_standard'; list($pied_rappel_html, $pied_rappel_texte) = spiplistes_courriers_assembler_patron ( _SPIPLISTES_PATRONS_LIEN_DIR . $lien_rappel , array('id_courrier' => $id_courrier , 'id_liste' => $id_liste , '_url' => generer_url_public() , 'lang' => $lang , 'd' => $cookie , 'lien_desabo' => ($opt_ajout_lien_desabo == 'oui') ) ); $pied_rappel_texte = spiplistes_translate_2_charset ($pied_rappel_texte , $charset_dest , true); switch($format_abo) { case 'html': // Si on ne trouve pas les tags HTML alors on les ajoutes if (FALSE === strpos($ventre_html, '</html>')) { $email_a_envoyer[$format_abo]->Body = $body_html_debut . $eol . $ventre_html . $eol . $pied_html . $eol . $pied_rappel_html . $eol . $tampon_html . $eol . $body_html_fin ; } else { // Si on trouve les tags HTML cela veut dire que l'auteur // veut pouvoir gerer lui meme la partie <head> ainsi que le lien de desabonnement // donc on ne prend en compte que la partie ventre_html. $tags_perso = array('http://%URL_ABONNEMENT%' => generer_url_public('abonnement','d='.$cookie),); $email_a_envoyer[$format_abo]->Body = str_replace(array_keys($tags_perso), array_values($tags_perso), $ventre_html); } // la version alternative texte $email_a_envoyer[$format_abo]->AltBody = $ventre_texte .$eol2 . $pied_texte . $eol2 . $pied_rappel_texte . $eol2 . $tampon_texte ; break; case 'texte': $email_a_envoyer[$format_abo]->Body = $ventre_texte .$eol2 . $pied_texte . $eol2 . $pied_rappel_texte . $eol2 . $tampon_texte ; break; } $email_a_envoyer[$format_abo]->SetAddress($email, $nom_auteur); // envoie le mail if($simuler_envoi || $email_a_envoyer[$format_abo]->send()) { $nb_emails_envoyes++; $nb_emails[$format_abo]++; if($log_voir_destinataire) { $str_temp .= ' [OK]'; } } else { $nb_emails_echec++; if($log_voir_destinataire) { $str_temp .= _T('spiplistes:erreur_mail'); } } } else { $nb_emails_echec++; if($log_voir_destinataire) { $str_temp .= _T('spiplistes:sans_adresse'); } } } // end if(($format_abo=='html') || ($format_abo=='texte')) else { $nb_emails_non_envoyes++; if($log_voir_destinataire) { $str_temp .= ' '._T('spiplistes:msg_abonne_sans_format'); } // prevenir qu'il manque le format spiplistes_log($prefix_log.' destination format MISSING FOR ID_AUTEUR #'.$id_auteur); } /* fin abo*/ if($log_voir_destinataire) { spiplistes_log($prefix_log.$str_temp); } } // fin while // supprime la liasse de la queue d'envois spiplistes_debug_log($prefix_log."envoi OK. Supprimer queue $id_process"); spiplistes_courriers_en_queue_supprimer('etat='.sql_quote($id_process)); // si c'est un test on repasse le courrier en redac if($is_a_test) { spiplistes_courriers_statut_redac ($id_courrier); } $email_a_envoyer['texte']->SmtpClose(); $email_a_envoyer['html']->SmtpClose(); } // end if } else { //aucun destinataire connu pour ce message spiplistes_debug_log($prefix_log._T('spiplistes:erreur_sans_destinataire') . '---' . _T('spiplistes:envoi_annule') ); spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_IGNORE); spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier); $str_log .= ' END #'.$id_courrier; // break; } if(!$is_a_test) { // faire le bilan apres l'envoi d'un lot $sql_set_array = array( 'nb_emails_envoyes' => sql_quote('nb_emails_envoyes').'+'.$nb_emails_envoyes , 'nb_emails_texte' => sql_quote('nb_emails_texte').'+'.$nb_emails['texte'] , 'nb_emails_html' => sql_quote('nb_emails_html').'+'.$nb_emails['html'] ); if($nb_emails_echec) { $sql_set_array['nb_emails_echec'] = sql_quote('nb_emails_echec').'+'.$nb_emails_echec; } if($nb_emails_non_envoyes) { $sql_set_array['nb_emails_non_envoyes'] = sql_quote('nb_emails_non_envoyes').'+'.$nb_emails_non_envoyes; } spiplistes_log($prefix_log.$str_log); $str_log = spiplistes_trace_compteur ($id_courrier , $nb_emails_envoyes , $nb_emails['html'] , $nb_emails['texte'] , $nb_emails_non_envoyes , $nb_emails_echec , 'SESSION'); // si courrier pas termine, redemande la main au CRON, sinon nettoyage. if($t = spiplistes_courriers_en_queue_compter('id_courrier='.sql_quote($id_courrier))) { $str_log .= ' LEFT '.$t.' jobs'; } else { $statut = ($type == _SPIPLISTES_COURRIER_TYPE_NEWSLETTER) ? _SPIPLISTES_COURRIER_STATUT_PUBLIE : _SPIPLISTES_COURRIER_STATUT_AUTO; spiplistes_debug_log($prefix_log."nouveau statut $statut"); $sql_set_array['statut'] = sql_quote($statut); $sql_set_array['date_fin_envoi'] = 'NOW()'; $str_log .= ' END #'.$id_courrier; } spiplistes_courrier_modifier($id_courrier, $sql_set_array, false); // placer en log le suivi des compteurs si mode debug if (spiplistes_debug_log()) { if ($row = sql_fetch(sql_select( 'nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html' , 'spip_courriers' , 'id_courrier='.sql_quote($id_courrier) , '', '', 1 )) ) { spiplistes_log($prefix_log.$str_log); $str_log = spiplistes_trace_compteur ($id_courrier , $row['nb_emails_envoyes'] , $row['nb_emails_html'] , $row['nb_emails_texte'] , $row['nb_emails_non_envoyes'] , $row['nb_emails_echec'] , 'FROM_DB') . ' END #'.$id_courrier; ; } } } } // end while() } // end if($nb_etiquettes) else { $str_log = 'no job'; } spiplistes_log($prefix_log.$str_log); if(($ii = spiplistes_courriers_total_abonnes()) > 0) { // il en reste apres la meleuse ? Signale au CRON tache non terminee $nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide); spiplistes_log($prefix_log.'courriers prets au depart ('.$nb_etiquettes.'/'.$ii.')'); $last_time = -$last_time; } return($last_time); } // end spiplistes_meleuse()
function convert_extra($v, $charset_source) { if ($extra = @unserialize($v)) { foreach ($extra as $key=>$val) $extra[$key] = unicode_to_utf_8( charset2unicode($val, $charset_source)); return ", extra=".sql_quote(serialize($extra)); } }
function glossaire_gogogo($texte, $mots, $limit, &$unicode) { // prudence 2 : on protege TOUTES les balises HTML comprenant le mot if (strpos($texte, '<')!==false) $texte = preg_replace_callback(",<[^>]*(?:$mots)[^>]*>,Ui", 'glossaire_echappe_balises_callback', $texte); // prudence 3 : en iso-8859-1, (\W) comprend les accents, mais pas en utf-8... Donc on passe en unicode if(($GLOBALS['meta']['charset'] != 'iso-8859-1') && !$unicode) { $texte = charset2unicode($texte); $unicode = true; } // prudence 4 : on neutralise le mot si on trouve un accent (HTML ou unicode) juste avant ou apres if (strpos($texte, '&')!==false) { $texte = preg_replace_callback(',&(?:'._GLOSSAIRE_ACCENTS.");(?:$mots),i", 'glossaire_echappe_balises_callback', $texte); $texte = preg_replace_callback(",(?:$mots)&(?:"._GLOSSAIRE_ACCENTS.');,i', 'glossaire_echappe_balises_callback', $texte); } // a chaque mot reconnu, on pose une balise temporaire cryptee return trim(preg_replace_callback(",(?<=\W)(?:$mots)(?=\W),i", "glossaire_echappe_mot_callback", " $texte ", $limit)); }
function traiter_raccourci_glossaire($texte) { if (!preg_match_all(_RACCOURCI_GLOSSAIRE, $texte, $matches, PREG_SET_ORDER)) return $texte; include_spip('inc/charsets'); $lien = charger_fonction('lien', 'inc'); foreach ($matches as $regs) { // Eviter les cas particulier genre "[?!?]" // et isoler le lexeme a gloser de ses accessoires // (#:url du glossaire, | bulle d'aide, {} hreflang) // Transformation en pseudo-raccourci pour passer dans inc_lien if (preg_match(_RACCOURCI_GLOSES, $regs[1], $r)) { preg_match('/^(.*?)(\d*)$/', $r[4], $m); $_n = intval($m[2]); $gloss = $m[1] ? ('#' . $m[1]) : ''; $t = $r[1] . $r[2] . $r[5]; list($t, $bulle, $hlang) = traiter_raccourci_lien_atts($t); if ($bulle===false) $bulle = $m[1]; $t = unicode2charset(charset2unicode($t), 'utf-8'); $ref = $lien("glose$_n$gloss", $t, 'spip_glossaire', $bulle, $hlang); $texte = str_replace($regs[0], $ref, $texte); } } return $texte; }
function translitteration($texte, $charset='AUTO', $complexe='') { // 0. Supprimer les caracteres illegaux include_spip('inc/filtres'); $texte = corriger_caracteres($texte); // 1. Passer le charset et les é en utf-8 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); return translitteration_rapide($texte,$charset,$complexe); }
/** * Afficher de facon textuelle les dates de debut et fin en fonction des cas * - Le lundi 20 fevrier a 18h * - Le 20 fevrier de 18h a 20h * - Du 20 au 23 fevrier * - du 20 fevrier au 30 mars * - du 20 fevrier 2007 au 30 mars 2008 * $horaire='oui' permet d'afficher l'horaire, toute autre valeur n'indique que le jour * $forme peut contenir abbr (afficher le nom des jours en abbrege) et ou hcal (generer une date au format hcal) * * @param string $date_debut * @param string $date_fin * @param string $horaire * @param string $forme * @return string */ function agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = '') { $abbr = ''; if (strpos($forme, 'abbr') !== false) { $abbr = 'abbr'; } $affdate = "affdate_jourcourt"; if (strpos($forme, 'annee') !== false) { $affdate = 'affdate'; } $dtstart = $dtend = $dtabbr = ""; if (strpos($forme, 'hcal') !== false) { $dtstart = "<abbr class='dtstart' title='" . date_iso($date_debut) . "'>"; $dtend = "<abbr class='dtend' title='" . date_iso($date_fin) . "'>"; $dtabbr = "</abbr>"; } $date_debut = strtotime($date_debut); $date_fin = strtotime($date_fin); $d = date("Y-m-d", $date_debut); $f = date("Y-m-d", $date_fin); $h = $horaire == 'oui'; $hd = date("H:i", $date_debut); $hf = date("H:i", $date_fin); $au = " " . strtolower(_T('agenda:evenement_date_au')); $du = _T('agenda:evenement_date_du') . " "; $s = ""; if ($d == $f) { // meme jour $s = ucfirst(nom_jour($d, $abbr)) . " " . $affdate($d); if ($h) { $s .= " {$hd}"; } $s = "{$dtstart}{$s}{$dtabbr}"; if ($h and $hd != $hf) { $s .= "-{$dtend}{$hf}{$dtabbr}"; } } else { if (date("Y-m", $date_debut) == date("Y-m", $date_fin)) { // meme annee et mois, jours differents if ($h) { $s = $du . $dtstart . affdate_jourcourt($d) . " {$hd}" . $dtabbr; $s .= $au . $dtend . $affdate($f); if ($hd != $hf) { $s .= " {$hf}"; } $s .= $dtabbr; } else { $s = $du . $dtstart . jour($d) . $dtabbr; $s .= $au . $dtend . $affdate($f) . $dtabbr; } } else { if (date("Y", $date_debut) == date("Y", $date_fin)) { // meme annee, mois et jours differents $s = $du . $dtstart . affdate_jourcourt($d); if ($h) { $s .= " {$hd}"; } $s .= $dtabbr . $au . $dtend . $affdate($f); if ($h) { $s .= " {$hf}"; } $s .= $dtabbr; } else { // tout different $s = $du . $dtstart . affdate($d); if ($h) { $s .= " " . date("(H:i)", $date_debut); } $s .= $dtabbr . $au . $dtend . affdate($f); if ($h) { $s .= " " . date("(H:i)", $date_fin); } $s .= $dtabbr; } } } return unicode2charset(charset2unicode($s, 'AUTO')); }
function spiplistes_preparer_message ($objet, $patron, $contexte) { // si pas encore abonne' ou desabonne', pas de format ! donc forcer a texte $format = ($contexte['format'] == 'html') ? $contexte['format'] : ($contexte['format'] = 'texte'); $contexte['patron'] = $patron; $path_patron = _SPIPLISTES_PATRONS_MESSAGES_DIR . $patron; list($message_html, $message_texte) = spiplistes_assembler_patron($path_patron, $contexte); $charset = $GLOBALS['meta']['spiplistes_charset_envoi']; if($charset != $GLOBALS['meta']['charset']) { include_spip('inc/charsets'); if($format == 'html') { $message_html = unicode2charset(charset2unicode($message_html), $charset); } //$message_texte = unicode2charset(charset2unicode($message_texte), $charset); $message_texte = spiplistes_translate_2_charset ($message_texte, $charset); } $email_a_envoyer = array(); $email_a_envoyer['texte'] = new phpMail('', $objet, '', $message_texte, $charset); if($format == 'html') { $email_a_envoyer['html'] = new phpMail('', $objet, $message_html, $message_texte, $charset); $email_a_envoyer['html']->Body = "<html>\n\n<body>\n\n" . $message_html . "\n\n</body></html>"; $email_a_envoyer['html']->AltBody = $message_texte; } $email_a_envoyer['texte']->Body = $message_texte ."\n\n"; $email_a_envoyer[$format]->SetAddress($contexte['email'], $contexte['nom']); return($email_a_envoyer); }
function filtrer_ical($texte) { include_lcm('inc_charsets'); $texte = html2unicode($texte); $texte = unicode2charset(charset2unicode($texte, read_meta('charset'), 1), 'utf-8'); $texte = preg_replace("/\n/", " ", $texte); $texte = preg_replace("/,/", "\\,", $texte); return $texte; }
/** * @param $email * @param $objet * @param $message_html * @param $message_texte * @param array $options * */ public function __construct($email, $objet, $message_html, $message_texte, $options = array()) { // On récupère toutes les options par défaut depuis le formulaire de config $defaut = array(); foreach (array( 'adresse_envoi', 'adresse_envoi_email', 'adresse_envoi_nom', 'forcer_from', 'cc', 'bcc', 'smtp', 'smtp_host', 'smtp_port', 'smtp_auth', 'smtp_username', 'smtp_password', 'smtp_secure', 'smtp_sender', 'filtre_images', 'filtre_iso_8859', ) as $config) { $defaut[$config] = isset($GLOBALS['meta']["facteur_$config"]) ? $GLOBALS['meta']["facteur_$config"] : ''; } // On fusionne les options avec d'éventuelles surcharges lors de l'appel $options = array_merge($defaut, $options); // par defaut on log rien car tres verbeux // on utilise facteur_log_debug qui filtre log SPIP en _LOG_DEBUG $this->SMTPDebug = 0; $this->Debugoutput = "facteur_log_debug"; // Il est possible d'avoir beaucoup plus de logs avec 2, 3 ou 4, ce qui logs les échanges complets avec le serveur // utiliser avec un define('_MAX_LOG',1000); car sinon on est limite a 100 lignes par hit et phpMailer est tres verbeux if (defined('_FACTEUR_DEBUG_SMTP')) { $this->SMTPDebug = _FACTEUR_DEBUG_SMTP ; } $this->exceptions = false; if ( $options['adresse_envoi'] == 'oui' and $options['adresse_envoi_email'] ) { $this->From = $options['adresse_envoi_email']; } else { $this->From = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"]) ? $GLOBALS['meta']["email_envoi"] : $GLOBALS['meta']['email_webmaster']; } // Si plusieurs emails dans le from, pas de Name ! if (strpos($this->From,",") === false) { if ( $options['adresse_envoi'] == 'oui' and $options['adresse_envoi_nom'] ) { $this->FromName = $options['adresse_envoi_nom']; } // Par défaut, l'envoyeur est le nom du site else { $this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site'])); } } // si forcer_from, on sauvegarde le From et FromName par defaut, qui seront utilises // si From n'est pas dans le meme domaine // (utiliser le facteur avec un service externe qui necessite la validation des domaines d'envoi) if ($options['forcer_from']=='oui'){ $this->ForceFrom = $this->From; $this->ForceFromName = $this->FromName; } $this->CharSet = "utf-8"; $this->Mailer = 'mail'; $this->Subject = unicode_to_utf_8(charset2unicode($objet,$GLOBALS['meta']['charset'])); //Pour un envoi multiple de mail, $email doit être un tableau avec les adresses. if (is_array($email)) { foreach ($email as $cle => $adresseMail) { if (!$this->AddAddress($adresseMail)) { spip_log("Erreur AddAddress $adresseMail : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR); } } } elseif (!$this->AddAddress($email)) { spip_log("Erreur AddAddress $email : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR); } // Retour des erreurs if (!empty($options['smtp_sender'])) { $this->Sender = $options['smtp_sender']; $this->AddCustomHeader("Errors-To: ".$this->Sender); } // Destinataires en copie, seulement s'il n'y a pas de destinataire de test if (!defined('_TEST_EMAIL_DEST')){ if (!empty($options['cc'])) { $this->AddCC($options['cc']); } if (!empty($options['bcc'])) { $this->AddBCC($options['bcc']); } } // Si on envoie avec un SMTP explicite if (isset($options['smtp']) AND $options['smtp'] == 'oui') { $this->Mailer = 'smtp'; $this->Host = $options['smtp_host']; $this->Port = $options['smtp_port']; // SMTP authentifié if ($options['smtp_auth'] == 'oui') { $this->SMTPAuth = true; $this->Username = $options['smtp_username']; $this->Password = $options['smtp_password']; } else { $this->SMTPAuth = false; } if ($options['smtp_secure'] == 'ssl') { $this->SMTPSecure = 'ssl'; } if ($options['smtp_secure'] == 'tls') { $this->SMTPSecure = 'tls'; } // Pour le moment on remet l'ancien fonctionnement : // on ne doit pas tester les certificats si pas demandé explicitement avec l'option TLS ! $this->SMTPAutoTLS = false; } // S'il y a un contenu HTML if (!empty($message_html)) { $message_html = unicode_to_utf_8(charset2unicode($message_html, $GLOBALS['meta']['charset'])); $this->Body = $message_html; $this->IsHTML(true); if ($options['filtre_images']) { $this->JoindreImagesHTML(); } $this->UrlsAbsolues(); } // S'il y a un contenu texte brut if (!empty($message_texte)) { $message_texte = unicode_to_utf_8(charset2unicode($message_texte, $GLOBALS['meta']['charset'])); // Si pas de HTML on le remplace en tant que contenu principal if (!$this->Body) { $this->IsHTML(false); $this->Body = $message_texte; } // Sinon on met le texte brut en contenu alternatif else { $this->AltBody = $message_texte; } } if ($options['filtre_iso_8859']) { $this->ConvertirUtf8VersIso8859(); } }
/** * Afficher de facon textuelle les dates de debut et fin en fonction des cas * - Le lundi 20 fevrier a 18h * - Le 20 fevrier de 18h a 20h * - Du 20 au 23 fevrier * - du 20 fevrier au 30 mars * - du 20 fevrier 2007 au 30 mars 2008 * $horaire='oui' permet d'afficher l'horaire, toute autre valeur n'indique que le jour * $forme peut contenir abbr (afficher le nom des jours en abbrege) et ou hcal (generer une date au format hcal) * * @param string $date_debut * @param string $date_fin * @param string $horaire * @param string $forme * @return string */ function agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){ static $trans_tbl=NULL; if ($trans_tbl==NULL){ $trans_tbl = get_html_translation_table (HTML_ENTITIES); $trans_tbl = array_flip ($trans_tbl); } $abbr = ''; if (strpos($forme,'abbr')!==false) $abbr = 'abbr'; $affdate = "affdate_jourcourt"; if (strpos($forme,'annee')!==false) $affdate = 'affdate'; $dtstart = $dtend = $dtabbr = ""; if (strpos($forme,'hcal')!==false) { $dtstart = "<abbr class='dtstart' title='".date_iso($date_debut)."'>"; $dtend = "<abbr class='dtend' title='".date_iso($date_fin)."'>"; $dtabbr = "</abbr>"; } $date_debut = strtotime($date_debut); $date_fin = strtotime($date_fin); $d = date("Y-m-d", $date_debut); $f = date("Y-m-d", $date_fin); $h = $horaire=='oui'; $hd = date("H:i",$date_debut); $hf = date("H:i",$date_fin); $au = " " . strtolower(_T('agenda:evenement_date_au')); $du = _T('agenda:evenement_date_du') . " "; $s = ""; if ($d==$f) { // meme jour $s = ucfirst(nom_jour($d,$abbr))." ".$affdate($d); if ($h) $s .= " $hd"; $s = "$dtstart$s$dtabbr"; if ($h AND $hd!=$hf) $s .= "-$dtend$hf$dtabbr"; } else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin)) { // meme annee et mois, jours differents if ($h){ $s = $du . $dtstart . affdate_jourcourt($d) . " $hd" . $dtabbr; $s .= $au . $dtend . $affdate($f); if ($hd!=$hf) $s .= " $hf"; $s .= $dtabbr; } else { $s = $du . $dtstart . jour($d) . $dtabbr; $s .= $au . $dtend . $affdate($f) . $dtabbr; } } else if ((date("Y",$date_debut))==date("Y",$date_fin)) { // meme annee, mois et jours differents $s = $du . $dtstart . affdate_jourcourt($d); if ($h) $s .= " $hd"; $s .= $dtabbr . $au . $dtend . $affdate($f); if ($h) $s .= " $hf"; $s .= $dtabbr; } else { // tout different $s = $du . $dtstart . affdate($d); if ($h) $s .= " ".date("(H:i)",$date_debut); $s .= $dtabbr . $au . $dtend. affdate($f); if ($h) $s .= " ".date("(H:i)",$date_fin); $s .= $dtabbr; } return unicode2charset(charset2unicode(strtr($s,$trans_tbl),'')); }
/** * Synchroniser les utilisateurs Galette vers Spip. * * @param boolean $forcer Forcer la synchronisation. * @return int Retourne en cas de réussite le nombre de fiches mis à jour ; * _ 0 lorsqu'une erreur inconnue est survenue ; * _ -1 si la synchronisation a échouée ; * _ -2 lorsque des erreurs sont survenues lors de la connexion à la BDD ; * _ -10 si la synchronisation est inutile. **/ function galettonuts_synchroniser($forcer = false) { // Lecture de la configuration if (!class_exists('L2_Spip_Plugin_Metas')) { include_spip('lib/L2/Spip/Plugin/Metas.class'); } $config = new L2_Spip_Plugin_Metas('galettonuts_config'); // Connexion à la base Galette $link = galettonuts_galette_db($config->lire('adresse_db'), $config->lire('login_db'), $config->lire('pass_db'), $config->lire('choix_db')); if (!$link) { spip_log('cron: Galettonuts, echec de connexion a la bdd de galette'); return -2; } $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro'); // La synchronisation est inutile. if (!$forcer && !is_null($synchro->lire('maj')) && galettonuts_a_jour($synchro->lire('maj'), $config->lire('prefix_db'), $link)) { return -10; } else { // Compteur d'utilisateurs traités $compteur = 0; // Tableau associatif zones/auteurs $ids = array(); $maintenant = time(); // Récupération des adhérents Galette $req = "SELECT `id_adh` AS `id`, `nom_adh` AS `nom`, `prenom_adh` AS `prenom`, `activite_adh` AS `actif`, " . "`login_adh` AS `login`, `mdp_adh` AS `pass`, `email_adh` AS `email` " . "FROM `" . $config->lire('prefix_db') . "adherents` WHERE 1;"; $res = @mysql_query($req, $link); // Pour chaque adhérent de galette while ($adh = @mysql_fetch_assoc($res)) { include_spip('inc/acces'); include_spip('inc/charsets'); // Formatage des informations de l'auteur à destination de Spip $login = unicode2charset(charset2unicode($adh['login'], 'iso-8859-15', 'forcer')); $email = unicode2charset(charset2unicode($adh['email'], 'iso-8859-15', 'forcer')); $nom = unicode2charset(charset2unicode(ucfirst($adh['prenom']) . ' ' . ucfirst($adh['nom']), 'iso-8859-15', 'forcer')); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $pass = $adh['pass']; $htpass = generer_htpass($pass); $mdpass = md5($alea_actuel . $pass); // Récupération de l'identifiant de l'auteur Spip, s'il existe $res2 = spip_query("SELECT `id_auteur` FROM `spip_galettonuts` WHERE `id_adh` = '{$adh['id']}';"); if (spip_mysql_count($res2)) { $id_auteur = (int) @mysql_result($res2, 0); } else { $id_auteur = null; } // Mise à jour de l'auteur Spip if ($id_auteur) { $req = "UPDATE `spip_auteurs` SET " . "`nom` = " . _q($nom) . ", `email` = " . _q($email) . ", `login` = " . _q($login) . ", `pass` = " . _q($mdpass) . ", `htpass` = " . _q($htpass) . ", `alea_actuel` = " . _q($alea_actuel) . ", `alea_futur` = " . _q($alea_futur); if (1 != $adh['actif']) { $req .= ", `statut` = " . _q('5poubelle'); } $req .= ", `maj` = NOW()" . " WHERE `id_auteur` = " . _q($id_auteur); spip_query($req); } else { $statut = 1 == $adh['actif'] ? '6forum' : '5poubelle'; $req = "INSERT INTO `spip_auteurs` (`nom`, `email`, `login`, `pass`, `htpass`, `alea_actuel`, `alea_futur`, `statut`) " . "VALUES (" . _q($nom) . ', ' . _q($email) . ', ' . _q($login) . ', ' . _q($mdpass) . ', ' . _q($htpass) . ', ' . _q($alea_actuel) . ', ' . _q($alea_futur) . ', ' . _q($statut) . ");"; spip_query($req); unset($req); // Puisque la colonne id_auteur de la table spip_auteurs est // de type BIGINT, on ne peut utiliser mysql_insert_id() de PHP. $id_auteur = @mysql_result(spip_query("SELECT LAST_INSERT_ID();"), 0); $req = "INSERT INTO `spip_galettonuts` (`id_auteur`, `id_adh`) VALUES (" . _q($id_auteur) . ', ' . _q($adh['id']) . ');'; spip_query($req); } spip_free_result($res2); // Hop, un utilisateur de synchronisé en plus ++$compteur; // Dans le cas où le plugin Accès Restreint est présent, on stocke // les identifiants des auteurs fraichement synchronisés associés // à une/des zone(s) définie lors de la configuration de Galettonuts if ($zones = $config->lire('zones')) { $ids[$id_auteur] = $zones; unset($zones); } } // while // La synchronisation est complète, on le sauvegarde $synchro->ajouter(array('maj' => $maintenant), true); // Association de zones aux auteurs synchronisés if (0 < count($ids)) { galettonuts_associer_zones($ids); } return $compteur; } }