function spip_avant_typo($letexte) { $letexte = extraire_multi($letexte); if (@function_exists('avant_typo')) { return avant_typo($letexte); } return $letexte; }
function url_nettoyer($titre,$longueur_maxi,$longueur_min=0,$separateur='-',$filtre=''){ if (!defined('_TRANSLITTERER_URL')) define('_TRANSLITTERER_URL', true); $titre = supprimer_tags(supprimer_numero(extraire_multi($titre))); $url = corriger_caracteres($titre); if (_TRANSLITTERER_URL) $url = translitteration($url); if ($filtre) $url = $filtre($url); // on va convertir tous les caracteres de ponctuation et espaces // a l'exception de l'underscore (_), car on veut le conserver dans l'url $url = str_replace('_', chr(7), $url); $url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url); $url = str_replace(chr(7), '_', $url); // S'il reste trop de caracteres non latins, les gerer comme wikipedia // avec rawurlencode : if (_TRANSLITTERER_URL && preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) { foreach ($r as $regs) { $url = substr_replace($url, rawurlencode($regs[0]), strpos($url, $regs[0]), strlen($regs[0])); } } // S'il reste trop peu, renvoyer vide if (strlen($url) < $longueur_min) return ''; // Sinon couper les mots et les relier par des $separateur if (_TRANSLITTERER_URL) $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url); else $mots = preg_split(",[\s]+,", $url); $url = ''; foreach ($mots as $mot) { if (!strlen($mot)) continue; $url2 = $url.$separateur.$mot; // Si on depasse $longueur_maxi caracteres, s'arreter // ne pas compter 3 caracteres pour %E9 mais un seul $long = preg_replace(',%.,', '', $url2); if (strlen($long) > $longueur_maxi) { break; } $url = $url2; } $url = substr($url, 1); // On enregistre en utf-8 dans la base $url = rawurldecode($url); if (strlen($url) < $longueur_min) return ''; return $url; }
function couper_intro3($texte, $long, $suite) { $texte = extraire_multi(preg_replace(",(</?)intro>,i", "\\1intro>", $texte)); // minuscules $intro = ''; while ($fin = strpos($texte, "</intro>")) { $zone = substr($texte, 0, $fin); $texte = substr($texte, $fin + strlen("</intro>")); if ($deb = strpos($zone, "<intro>") OR substr($zone, 0, 7) == "<intro>") $zone = substr($zone, $deb + 7); $intro .= $zone; } $texte = nettoyer_raccourcis_typo($intro ? $intro : $texte); return PtoBR(traiter_raccourcis(preg_replace(',([|]\s*)+,S', '; ', couper($texte, $long, _INTRODUCTION_CODE)))); }
function balise_ECATALOGUE_PRODUCT_CURRENCY_SIGN_dyn($id_article, $sign = 'sign_pre') { require_once _DIR_PLUGIN_ECATALOGUE . 'classes/class.CurrencyModel.php'; $currency_mdl = new CurrencyModel(); // If some exceptions are thrown - return empty value try { $sign = $currency_mdl->GetCurrencySignByIdArticle($id_article, $sign); } catch (Exception $e) { $sign = ''; } include_spip('inc/filtres'); $sign = extraire_multi($sign); return array('balise/ecatalogue_product_currency_sign', 0, array('sign' => $sign)); }
function formulaires_ecrire_auteur_traiter_dist($id_auteur, $id_article, $mail) { $adres = _request('email_message_auteur'); $sujet = _request('sujet_message_auteur'); $texte = _request('texte_message_auteur'); $texte .= "\n\n-- " . _T('envoi_via_le_site') . " " . supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])) . " (" . $GLOBALS['meta']['adresse_site'] . "/) --\n"; $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); if ($envoyer_mail($mail, $sujet, $texte, $adres, "X-Originating-IP: " . $GLOBALS['ip'])) { $message['message_ok'] = _T('form_prop_message_envoye'); } else { $message['message_erreur'] = _T('pass_erreur_probleme_technique'); } return $message; }
/** * Insertion dans le pipeline formulaire_charger (SPIP) * * Surcharge du sujet et le texte du message généré par le formulaire_ecrire_auteur * Surcharge du formulaire d'inscription pour ne pas afficher l'explication * * @param array $flux * @return array $flux */ function geol_formulaire_charger($flux) { // sujet perso pour formulaire_ecrire_auteur depuis une page article (erreur de localisation) if ($flux['args']['form'] == 'ecrire_auteur' and $flux['args']['args'][1] != '') { $flux['data']['sujet_message_auteur'] .= supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])) . " : " . _T('geol:sujet_erreur_localisation'); $flux['data']['texte_message_auteur'] .= _T('geol:depuis_page') . " : " . generer_url_entite_absolue($flux['args']['args'][1], 'article') . "\n\nMessage :\n\n"; } // pas d'explicaltion sur le form d'inscription if ($flux['args']['form'] == 'inscription' and $flux['args']['args'][0] == '1comite') { $flux['data']['_commentaire'] = ''; } // limiter le form de polyhierarchie sur la branche des categories (dans le public) // cf http://zone.spip.org/trac/spip-zone/changeset/41280 if ($flux['args']['form'] == 'editer_polyhierarchie' and !test_espace_prive()) { $flux['data']['limite_branche'] = lire_config('geol/secteur_categories', 2); } return $flux; }
function balise_ECATALOGUE_CURRENCY_SIGN_dyn($currency_code = false, $sign = 'sign_pre') { require_once _DIR_PLUGIN_ECATALOGUE . 'classes/class.CurrencyModel.php'; $currency_mdl = new CurrencyModel(); // If $currency_code isn't defined, current currency sign will be returned if (!$currency_code) { $currency = $currency_mdl->GetCurrentCurrency(); } else { $currency = $currency_mdl->SelectByCode($currency_code); } //$sign = $currency[$sign]; include_spip('inc/filtres'); if ($currency) { $sign = extraire_multi($currency[$sign]); } else { $sign = ''; } return array('balise/ecatalogue_currency_sign', 0, array('sign' => $sign)); }
function glossaire_verifie(&$c) { include_spip('public/parametrer'); // pour mes_fonctions $res = array(); $c = count($gloss = glossaire_query_tab()); for($i=0; $i<$c; $i++) for($j=$i+1; $j<$c; $j++) { $gi = &$gloss[$i]; $gj = &$gloss[$j]; if(!isset($gi['mots'])) list($gi['mots'],$gi['regs'],$gi['titre2']) = glossaire_parse(extraire_multi($gi['titre'])); if(!isset($gj['mots'])) list($gj['mots'],$gj['regs'],$gj['titre2']) = glossaire_parse(extraire_multi($gj['titre'])); $u = false; $titre = $gi['mots']?glossaire_gogogo($gj['titre2'], $gi['mots'], -1, $u):''; if(count($gi['regs'])) $titre .= preg_replace_callback($gi['regs'], "glossaire_echappe_mot_callback", $gj[titre], -1); if(strpos($titre,'@@GLOSS')!==false) { $a = '['.$gi['titre'].'->mot'.$gi['id_mot'].']'; $b = '['.$gj['titre'].'->mot'.$gj['id_mot'].']'; $res[] = "• "._T('couteauprive:glossaire_erreur', array('mot1'=>$a, 'mot2'=>$b))."\n_ "; } } if(count($res)) return propre(join('', $res)._T('couteauprive:glossaire_inverser')); return ''; }
function afficher_forum_auteur($row) { $titre=$row['titre']; $id_auteur=$row["id_auteur"]; $date_heure=$row['date_heure']; $email_auteur=$row['email_auteur']; $auteur= extraire_multi($row['auteur']); if ($id_auteur) { $formater_auteur = charger_fonction('formater_auteur', 'inc'); $res = join(' ',$formater_auteur($id_auteur)); } else { if ($email_auteur) { if (email_valide($email_auteur)) $email_auteur = "<a href='mailto:" .htmlspecialchars($email_auteur) ."?subject=".rawurlencode($titre)."'>".$email_auteur ."</a>"; $auteur .= " — $email_auteur"; } $res = safehtml("<span class='arial2'> / <b>$auteur</b></span>"); } return "<div style='font-weight: normal;'>" . date_interface($date_heure) . " $res</div>"; }
function formulaires_forum_charger_dist( $titre, $table, $type, $script, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic, $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) { // exiger l'authentification des posteurs pour les forums sur abo if ($type == "abo") { if (!$GLOBALS["visiteur_session"]['statut']) { return array( 'action' => '', #ne sert pas dans ce cas, on la vide pour mutualiser le cache 'editable'=>false, 'login_forum_abo'=>' ', 'inscription' => generer_url_public('identifiants', 'lang='.$GLOBALS['spip_lang']), 'oubli' => generer_url_public('spip_pass','lang='.$GLOBALS['spip_lang'],true), ); } } // Tableau des valeurs servant au calcul d'une signature de securite. // Elles seront placees en Input Hidden pour que inc/forum_insert // recalcule la meme chose et verifie l'identite des resultats. // Donc ne pas changer la valeur de ce tableau entre le calcul de // la signature et la fabrication des Hidden // Faire attention aussi a 0 != '' // id_rubrique est parfois passee pour les articles, on n'en veut pas $ids = array(); if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic)) $id_rubrique = 0; foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) { $ids[$o] = ($x = intval($$o)) ? $x : ''; } // ne pas mettre '', sinon le squelette n'affichera rien. $previsu = ' '; // au premier appel (pas de Post-var nommee "retour_forum") // memoriser eventuellement l'URL de retour pour y revenir apres // envoi du message ; aux appels suivants, reconduire la valeur. // Initialiser aussi l'auteur if ($retour_forum = rawurldecode(_request('retour'))) $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum); else { // par defaut, on veut prendre url_forum(), mais elle ne sera connue // qu'en sortie, on inscrit donc une valeur absurde ("!") $retour_forum = "!"; // sauf si on a passe un parametre en argument (exemple : {#SELF}) if ($url_param_retour) $retour_forum = str_replace('&', '&', $url_param_retour); $retour_forum = rawurlencode($retour_forum); } if (_request('retour_forum')){ $arg = forum_fichier_tmp(join('', $ids)); $securiser_action = charger_fonction('securiser_action', 'inc'); // on sait que cette fonction est dans le fichier associe $hash = calculer_action_auteur("ajout_forum-$arg"); } // pour les hidden $script_hidden = ""; foreach ($ids as $id => $v) $script_hidden .= "<input type='hidden' name='$id' value='$v' />"; $script_hidden .= "<input type='hidden' name='arg' value='$arg' />"; $script_hidden .= "<input type='hidden' name='hash' value='$hash' />"; $script_hidden .= "<input type='hidden' name='verif_".substr($hash,0,32)."' value='ok' />"; $script_hidden .= "<input type='hidden' name='afficher_texte' value='$afficher_texte' />"; $script_hidden .= "<input type='hidden' name='retour_forum' value='$retour_forum' />"; // l'ajout de documents est-il autorise ? // cf. verifier.php if ($formats = forum_documents_acceptes()) { include_spip('inc/securiser_action'); $cle_ajouter_document = calculer_cle_action('ajouter-document-'.join('-',array_map('intval',$ids))); } return array( 'modere' => (($type != 'pri') ? '' : ' '), 'nom_site' => '', 'table' => $table, 'texte' => '', 'config' => array('afficher_barre' => ($GLOBALS['meta']['forums_afficher_barre']!='non'?' ':'')), 'titre' => str_replace('~', ' ', extraire_multi($titre)), 'action' => $script, # ce sur quoi on fait le action='...' '_hidden' => $script_hidden, # pour les variables hidden 'url_site' => "http://", 'cle_ajouter_document' => $cle_ajouter_document, 'formats_documents_forum' => $formats, 'ajouter_document' => $_FILES['ajouter_document']['name'], 'nobot' => _request('nobot'), 'ajouter_groupe' => $ajouter_groupe, 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), 'id_forum' => $id_forum, // passer id_forum au formulaire pour lui permettre d'afficher a quoi l'internaute repond '_sign'=>implode('_',$ids) ); }
function cs_rempl_glossaire($texte, $liste=false) { global $gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id; // si [!glossaire] est trouve on sort if(strpos($texte, _CS_SANS_GLOSSAIRE)!==false) return $liste?array():str_replace(_CS_SANS_GLOSSAIRE, '', $texte); // mise en static de la table des mots pour eviter d'interrroger la base a chaque fois // attention aux besoins de memoire... static $limit, $glossaire_generer_url, $glossaire_generer_mot, $glossaire_array = NULL; if(!isset($glossaire_array)) { $glossaire_array = glossaire_query_tab(); $glossaire_generer_url = function_exists('glossaire_generer_url')?'glossaire_generer_url':'glossaire_generer_url_dist'; $limit = defined('_GLOSSAIRE_LIMITE')?_GLOSSAIRE_LIMITE:-1; $glossaire_generer_mot = function_exists('glossaire_generer_mot') ?'glossaire_generer_mot(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])':'$GLOBALS[\'gloss_mots\'][\\1]'; // 'glossaire_generer_mot_dist(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])'; $glossaire_generer_mot = '"<a $table1[\\2]_".$GLOBALS["gl_i"]++."\' class=\'cs_glossaire\'><span class=\'gl_mot\'>".'.$glossaire_generer_mot.'."</span>$table2[\\2]</a>"'; } $unicode = false; $mem = $GLOBALS['toujours_paragrapher']; $GLOBALS['toujours_paragrapher'] = false; // initialisation des globales d'echappement $gloss_ech = $gloss_mots = array(); $gloss_ech_id = $gloss_mots_id = 0; // prudence 1 : protection des liens SPIP if (strpos($texte, '[')!==false) $texte = preg_replace_callback(',\[[^][]*->>?[^]]*\],msS', 'glossaire_echappe_balises_callback', $texte); // parcours de tous les mots, sauf celui qui peut faire partie du contexte (par ex : /spip.php?mot5) $mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot'); foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) { // parser le mot-cle du glossaire // contexte de langue a prendre en compte ici list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre'])); $mot_present = false; if(count($les_regexp)) { // a chaque expression reconnue, on pose une balise temporaire cryptee // ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i $texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit); // TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu // et s'il faut construire la fenetre de glossaire. // TODO 2 : decrementer le parametre $limit pour $les_mots, si &$count est renseigne. // en attendant, constuisons qd meme la fenetre... $mot_present = true; } if($les_mots) { if(preg_match(",\W(?:$les_mots)\W,i", " $texte ")) { $texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode); $mot_present = true; } } // si un mot est trouve, on construit la fenetre de glossaire if($mot_present) { $lien = $glossaire_generer_url($gloss_id, $titre); // $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte']; if($liste) $table1[$gloss_id] = array($gloss_id, $lien, $les_titres); else { $table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons $table2[$gloss_id] = recuperer_fond( defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css', array('id_mot' => $gloss_id, 'titre' => $les_titres, 'texte' => glossaire_safe($mot['texte']), 'descriptif' => glossaire_safe($mot['descriptif']))); } } } $GLOBALS['toujours_paragrapher'] = $mem; $GLOBALS['gl_i'] = 0; if($liste) $texte = (preg_match_all(',@@M(\d+)#(\d+)@@,', $texte, $reg, PREG_SET_ORDER) && array_walk($reg, create_function('&$v,$k,&$t1', '$v=array_merge(array($GLOBALS[\'gloss_mots\'][$v[1]]),$t1[$v[2]]);'), $table1) )?$reg:array(); else { // remplacement des echappements $texte = preg_replace(',@@E(\d+)@@,e', '$GLOBALS[\'gloss_ech\'][\\1]', $texte); // remplacement final des balises posees ci-dessus $texte = preg_replace(',@@M(\d+)#(\d+)@@,e', $glossaire_generer_mot, $texte); } // nettoyage unset($gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id); return $texte; }
/** * Récupérer les infos utiles des paquet * * Crée un tableau de description pour chaque paquet dans une * écriture courte comme index ('i' pour identifiant) tel que : * - i = identifiant * - p = prefixe (en majuscule) * - n = nom du plugin * - v = version * - e = etat * - a = actif * - du = dépendances utilise * - dn = dépendances nécessite * - dl = dépendances librairie * - procure = prefixes procurés * - maj = mise à jour * * * On passe un where ($condition) et on crée deux tableaux, l'un des paquets * triés par identifiant, l'autre par prefixe. * * @param array|string $condition * Condition where * @param bool $multiple * Si multiple, le tableau par préfixe est un sous-tableau (il peut alors * y avoir plusieurs paquets pour un même prefixe, classés par états décroissants) * @return array * Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description * Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description * ou, avec $multiple=true : [p][MOTS][] = tableau de description */ public function infos_courtes($condition, $multiple = false) { $plugs = array('i' => array(), 'p' => array()); $from = array('spip_paquets AS pa', 'spip_plugins AS pl'); $orderby = $multiple ? 'pa.etatnum DESC' : ''; $where = array('pa.id_plugin = pl.id_plugin'); if (is_array($condition)) { $where = array_merge($where, $condition); } else { $where[] = $condition; } include_spip('inc/filtres'); // extraire_multi() $res = sql_allfetsel(array('pa.id_paquet AS i', 'pl.nom AS n', 'pl.prefixe AS p', 'pa.version AS v', 'pa.etatnum AS e', 'pa.compatibilite_spip', 'pa.dependances', 'pa.procure', 'pa.id_depot', 'pa.maj_version AS maj', 'pa.actif AS a'), $from, $where, '', $orderby); foreach ($res as $r) { $r['p'] = strtoupper($r['p']); // on s'assure du prefixe en majuscule. // savoir si un paquet est en local ou non... $r['local'] = $r['id_depot'] == 0 ? true : false; unset($r['id_depot']); $d = unserialize($r['dependances']); // voir pour enregistrer en bdd simplement 'n' et 'u' (pas la peine d'encombrer)... $deps = array('necessite' => array(array()), 'utilise' => array(array()), 'librairie' => array(array())); if (!$d) { $d = $deps; } unset($r['dependances']); if (!$r['procure'] or !($proc = unserialize($r['procure']))) { $proc = array(); } $r['procure'] = $proc; /* * On extrait les multi sur le nom du plugin */ $r['n'] = extraire_multi($r['n']); $plugs['i'][$r['i']] = $r; // pour chaque type de dependences... (necessite, utilise, librairie) // on cree un tableau unique [$dependence] = array() // au lieu de plusieurs tableaux par version de spip // en ne mettant dans 0 que ce qui concerne notre spip local foreach ($deps as $cle => $defaut) { if (!isset($d[$cle])) { $d[$cle] = $defaut; } // gerer les dependences autres que dans 0 (communs ou local) !!!! // il peut exister des cles info[dn]["[version_spip_min;version_spip_max]"] de dependences if (!isset($d[$cle][0]) or count($d[$cle]) > 1) { $dep = array(); $dep[0] = isset($d[$cle][0]) ? $d[$cle][0] : array(); unset($d[$cle][0]); foreach ($d[$cle] as $version => $dependences) { if (svp_verifier_compatibilite_spip($version)) { $dep = array_merge($dep[0], $dependences); } } $d[$cle] = $dep; } } // passer les prefixes en majuscule foreach ($d['necessite'][0] as $i => $n) { $d['necessite'][0][$i]['nom'] = strtoupper($n['nom']); } $plugs['i'][$r['i']]['dn'] = $d['necessite'][0]; $plugs['i'][$r['i']]['du'] = $d['utilise'][0]; $plugs['i'][$r['i']]['dl'] = $d['librairie'][0]; if ($multiple) { $plugs['p'][$r['p']][] =& $plugs['i'][$r['i']]; // alias } else { $plugs['p'][$r['p']] =& $plugs['i'][$r['i']]; // alias } } return $plugs; }
function controle_forum_boucle($row, $args) { $id_forum = $row['id_forum']; $forum_id_parent = $row['id_parent']; $forum_id_rubrique = $row['id_rubrique']; $forum_id_article = $row['id_article']; $forum_id_breve = $row['id_breve']; $forum_date_heure = $row['date_heure']; $forum_titre = echapper_tags($row['titre']); $forum_texte = $row['texte']; $forum_auteur = echapper_tags(extraire_multi($row['auteur'])); $forum_email_auteur = echapper_tags($row['email_auteur']); $forum_nom_site = echapper_tags($row['nom_site']); $forum_url_site = echapper_tags($row['url_site']); $forum_stat = $row['statut']; $forum_ip = $row['ip']; $forum_id_auteur = $row["id_auteur"]; $r = forum_parent($id_forum); $avant = $r['avant']; $url = $r['url']; $titre = $r['titre']; $type = $r['type']; $valeur = $r['valeur']; $pref = $r['pref']; if ($documents = sql_allfetsel('doc.id_document, doc.fichier AS fichier', 'spip_documents AS doc LEFT JOIN spip_documents_liens AS lien ON doc.id_document=lien.id_document', 'lien.id_objet='.intval($id_forum)." AND objet='forum'")) { include_spip('inc/documents'); foreach ($documents as $k => $t) { $h = generer_url_entite($t['id_document'], 'document'); $documents[$k] = "<a href='".$h."'>".basename($t['fichier'])."</a>"; } } switch($forum_stat) { case 'off': case 'privoff': $style = " style='border: 2px #ff0000 dashed;'"; break; case 'prop': $style = " style='border: 2px yellow solid; background-color: white;'"; break; case 'spam': $style = " style='border: 2px black dotted;'"; break; default: $style = ""; break; } if ($forum_email_auteur) { if (email_valide($forum_email_auteur)) $forum_email_auteur = "<a href='mailto:" .htmlspecialchars($forum_email_auteur) ."?subject=".rawurlencode($forum_titre)."'>".$forum_email_auteur ."</a>"; $forum_auteur .= " — $forum_email_auteur"; } $suite = "\n<br />$avant<b>$pref\n<a href='$url' class='controle'>$titre</a></b>" . "<div class='controle'>".justifier(propre($forum_texte))."</div>"; include_spip('public/composer'); if ($forum_notes = safehtml(calculer_notes())) $suite .= "<div class='notes controle'>".justifier(safehtml($forum_notes))."</div>"; if (strlen($forum_url_site) > 10 AND strlen($forum_nom_site) >= 3) $suite .= "\n<div style='text-align: left' class='serif'><b><a href='$forum_url_site'>$forum_nom_site</a></b></div>"; return "\n<div><br /><a id='forum$id_forum'></a></div>" . debut_cadre_forum("", true, "", typo($forum_titre)) . "<div$style>" . date_interface($forum_date_heure) . safehtml("<span class='arial2'> / <b>$forum_auteur</b></span>") . boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur, "$type=$valeur", $forum_ip, 'controle_forum', $args) . safehtml(lignes_longues($suite)) . afficher_forum_mots($id_forum) . join(', ', $documents) . "<div class='nettoyeur'></div></div>". fin_cadre_forum(true); }
/** * http://code.spip.net/@corriger_typo * * @param string $t * @param string $lang * @return string */ function corriger_typo($t, $lang = '') { static $typographie = array(); // Plus vite ! if (!$t) { return $t; } $t = pipeline('pre_typo', $t); // Caracteres de controle "illegaux" $t = corriger_caracteres($t); // Proteger les caracteres typographiques a l'interieur des tags html if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) { foreach ($regs as $reg) { $insert = $reg[0]; // hack: on transforme les caracteres a proteger en les remplacant // par des caracteres "illegaux". (cf corriger_caracteres()) $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); $t = str_replace($reg[0], $insert, $t); } } // trouver les blocs multi et les traiter a part $t = extraire_multi($e = $t, $lang, true); $e = $e === $t; // Charger & appliquer les fonctions de typographie $idxl = "{$lang}:" . (isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang']); if (!isset($typographie[$idxl])) { $typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie'); } $t = $typographie[$idxl]($t); // Les citations en une autre langue, s'il y a lieu if (!$e) { $t = echappe_retour($t, 'multi'); } // Retablir les caracteres proteges $t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER); // pipeline $t = pipeline('post_typo', $t); # un message pour abs_url - on est passe en mode texte $GLOBALS['mode_abs_url'] = 'texte'; return $t; }
/** * 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()
/** * Retourne un texte HTML présentant la liste des dépendances d'un plugin * * Des liens vers les plugins dépendants sont présents lorsque les plugins * en dépendance sont connus dans notre base. * * @param string $balise_serialisee * Informations des dépendances (tableau sérialisé) tel que stocké * en base dans la table spip_paquets * @param string $dependance * Type de dépendances à afficher (necessite ou utilise). * Une autre valeur indique qu'on demande la liste des librairies dépendantes. * @param string $sep * Séparateur entre les noms de dépendances * @param string $lien * Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs : * * - local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut * donc que le site propose des pages publiques pour les plugins sinon une 404 sera affichée; * - pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP; * - non : aucun lien n'est affiché. * @return string * Texte informant des dépendances **/ function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', $sep = '<br />', $lien = 'local') { $texte = ''; $t = unserialize($balise_serialisee); $dependances = $t[$dependance]; if (is_array($dependances)) { ksort($dependances); foreach ($dependances as $_compatibilite => $_dependance) { $compatibilite = $_compatibilite !== 0 ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP'))) : ''; if ($compatibilite) { $texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite; } foreach ($_dependance as $_plugin) { if ($texte) { $texte .= $sep; } if ($dependance == 'necessite' or $dependance == 'utilise') { if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom']))) { $nom = extraire_multi($plugin['nom']); if ($lien == 'non') { $logiciel = $nom; } else { $url = $lien == 'local' ? generer_url_entite($plugin['id_plugin'], 'plugin') : "http://plugins.spip.net/{$_plugin['nom']}.html"; $bulle = _T('svp:bulle_aller_plugin'); $logiciel = '<a href="' . $url . '" title="' . $bulle . '">' . $nom . '</a>'; } } else { // Cas ou le plugin n'est pas encore dans la base SVP. // On affiche son préfixe, cependant ce n'est pas un affichage devant perdurer $logiciel = $_plugin['nom']; } $intervalle = ''; if (isset($_plugin['compatibilite'])) { $intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel); } $texte .= $intervalle ? $intervalle : $logiciel; } else { // On demande l'affichage des librairies $texte .= '<a href="' . $_plugin['lien'] . '" title="' . _T('svp:bulle_telecharger_librairie') . '">' . $_plugin['nom'] . '</a>'; } } } } return $texte; }
function exec_spiplistes_liste_gerer () { include_spip('inc/autoriser'); include_spip('inc/mots'); include_spip('inc/lang'); include_spip('inc/editer_auteurs'); include_spip('base/spiplistes_tables'); include_spip('inc/spiplistes_api'); include_spip('inc/spiplistes_api_presentation'); include_spip('inc/spiplistes_dater_envoi'); include_spip('inc/spiplistes_naviguer_paniers'); include_spip('inc/spiplistes_listes_selectionner_auteur'); global $meta , $connect_statut , $connect_toutes_rubriques , $connect_id_auteur , $spip_lang_left , $spip_lang_right , $couleur_claire ; // initialise les variables postees par le formulaire foreach(array( 'new' // nouvelle liste si 'oui' , 'id_liste'// si modif dans l'editeur , 'btn_liste_edit', 'titre', 'texte', 'pied_page' // renvoyes par l'editeur , 'btn_modifier_diffusion', 'changer_lang', 'statut' // local , 'btn_modifier_replyto', 'email_envoi' // local , 'btn_modifier_courrier_auto', 'message_auto' // local , 'auto_chrono', 'auto_weekly', 'auto_mois' , 'titre_message', 'patron', 'periode', 'envoyer_maintenant' , 'jour', 'mois', 'annee', 'heure', 'minute' , 'btn_patron_pied', 'btn_grand_patron' // boites gauches , 'btn_valider_forcer_abos', 'forcer_abo', 'forcer_format_abo', 'forcer_format_reception' , 'btn_supprimer_liste' //local ) as $key) { $$key = _request($key); } foreach(array('id_liste', 'periode') as $key) { $$key = intval($$key); } foreach(array('titre', 'texte', 'pied_page') as $key) { $$key = trim(corriger_caracteres($$key)); } $lang = $changer_lang; $cherche_auteur = _request('cherche_auteur'); $debut = _request('debut'); $envoyer_maintenant = ($envoyer_maintenant == 'oui'); $boite_pour_confirmer_envoi_maintenant = $grosse_boite_moderateurs = $message_erreur = $page_result = ""; if(!$id_liste) { ////////////////////////////////////////////////////// // Creer une liste //// // admin lambda peut creer une liste $flag_editable = ($connect_statut == "0minirezo"); if ($btn_liste_edit && ($new=='oui')) { if ($titre == '') { $titre = _T('spiplistes:liste_sans_titre'); } $pied_page = _SPIPLISTES_PATRON_PIED_DEFAUT; if($id_liste = spiplistes_listes_liste_creer(_SPIPLISTES_LIST_PRIVATE, $GLOBALS['spip_lang'] , $titre, $texte, $pied_page)) { spiplistes_log("id_liste #$id_liste added by id_auteur #$connect_id_auteur"); } } } else if($id_liste > 0) { ////////////////////////////////////////////////////// // Modifier une liste //// // les admins toutes rubriques et le moderateur seuls peuvent modifier la liste $flag_editable = autoriser('moderer', 'liste', $id_liste); if($flag_editable) { // Recupere les donnees de la liste courante pour optimiser l'update $sql_select = "statut,titre,date,lang"; $sql_result = sql_select($sql_select, "spip_listes", "id_liste=".sql_quote($id_liste), "", "", "1"); if($row = sql_fetch($sql_result)) { foreach(explode(",", $sql_select) as $key) { $current_liste[$key] = $row[$key]; } } /////////////////////////////////// // Les modifications (sql_upadteq) // A noter, ne pas preparer les valeurs par sql_quote() // sql_upadteq() s'en occupe $sql_champs = array(); // Retour de l'editeur ? if($btn_liste_edit) { $titre = corriger_caracteres($titre); $texte = corriger_caracteres($texte); if(empty($titre)) { $titre = filtrer_entites(_T('spiplistes:Nouvelle_liste_de_diffusion')); } $sql_champs['titre'] = $titre; $sql_champs['texte'] = $texte; } // Modifier le grand patron ? // a partir de 2.0049, le patron de pied est construit par la meleuse // afin de permettre _texte et multilingue if($btn_grand_patron && $patron) { $sql_champs['patron'] = $patron; } // Modifier patron de pied ? if($btn_patron_pied && $patron) { $sql_champs['pied_page'] = $patron; } // Modifier diffusion ? if($btn_modifier_diffusion) { $current_statut = ($statut) ? $statut : $current_liste['statut'] ; spiplistes_debug_log ('Modification diffusion statut: '.$current_statut); // Modifier le statut ? if(in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_TOUS)) && ($statut != $current_liste['statut']) ) { spiplistes_debug_log ('Modification statut: '.$statut); $sql_champs['statut'] = $statut; // si la liste passe en privee, retire les invites if($statut == _SPIPLISTES_LIST_PRIVATE) { $auteur_statut = '6forum'; spiplistes_abonnements_auteurs_supprimer($auteur_statut); spiplistes_log("AUTEURS ($auteur_statut) REMOVED FROM LISTE #$id_liste ($statut) BY ID_AUTEUR #$connect_id_auteur"); } } // Modifier la langue ? if(!empty($lang) && ($lang!=$current_liste['lang'])) { $sql_champs['lang'] = $lang; } } // Modifier l'adresse email de reponse ? if($btn_modifier_replyto && email_valide($email_envoi) && ($email_envoi!=$current_liste['email_envoi'])) { $sql_champs['email_envoi'] = $email_envoi; } //////////////////////////////////// // Modifier message_auto ? // bloc "courriers automatiques" if($btn_modifier_courrier_auto) { $current_statut = ($statut) ? $statut : $current_liste['statut'] ; spiplistes_debug_log ('Modification periodicite statut: '.$current_statut); $envoyer_quand = spiplistes_formate_date_form($annee, $mois, $jour, $heure, $minute); if(time() > strtotime($envoyer_quand)) { // envoi dans le passe est considere comme envoyer maintenant $envoyer_maintenant = true; $date_depuis = $envoyer_quand; $envoyer_quand = false; } // spiplistes_debug_log("nb vrais abos : ".spiplistes_listes_vrais_abos_compter($id_liste)); if($envoyer_maintenant && ($message_auto != 'non')) { if(!spiplistes_listes_vrais_abos_compter($id_liste)) { $boite_pour_confirmer_envoi_maintenant .= spiplistes_boite_alerte(_T('spiplistes:boite_alerte_manque_vrais_abos'), true); } else { $boite_pour_confirmer_envoi_maintenant = "" . debut_cadre_couleur('', true) // formulaire de confirmation envoi . spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE), true) . "<p style='text-align:center;font-weight:bold;' class='verdana2'>" . _T('spiplistes:boite_confirmez_envoi_liste') . "</p>" . "<input type='hidden' name='id_liste' value='$id_liste' />\n" . spiplistes_form_bouton_valider('btn_confirmer_envoi_maintenant') . spiplistes_form_fin(true) . fin_cadre_couleur(true) ; } $date_prevue = normaliser_date(time()); } if($message_auto == 'oui') { $sql_champs['message_auto'] = 'oui'; $sql_champs['titre_message'] = $titre_message; $sql_champs['date'] = (!$envoyer_maintenant) ? $envoyer_quand : ''; switch($auto_chrono) { case 'auto_jour': $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_DAILY : _SPIPLISTES_LIST_PUB_DAILY ; // force au minimum 1 jour $sql_champs['periode'] = (($periode > 0) ? $periode : 1); break; case 'auto_hebdo': if($auto_weekly == 'oui') { // debut de semaine ? $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_WEEKLY : _SPIPLISTES_LIST_PUB_WEEKLY ; // corrige la date pour le lundi de la semaine $time = strtotime($envoyer_quand); $time = mktime(0,0,0,date("m", $time),date("d", $time)-date("w", $time)+1,date("Y", $time)); $envoyer_quand = date("Y-m-d H:i:s", $time); $sql_champs['date'] = $envoyer_quand; } else { $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_HEBDO : _SPIPLISTES_LIST_PUB_HEBDO ; } $sql_champs['periode'] = 0; break; case 'auto_mensuel': if($auto_mois == 'oui') { // debut du mois ? $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_MONTHLY : _SPIPLISTES_LIST_PUB_MONTHLY ; // corrige la date, 1' du mois $envoyer_quand = substr($envoyer_quand, 0, 8)."01 00:00:00"; $sql_champs['date'] = $envoyer_quand; } else { $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_MENSUEL : _SPIPLISTES_LIST_PUB_MENSUEL ; } $sql_champs['periode'] = 0; break; case 'auto_an': $sql_champs['statut'] = ($current_statut == _SPIPLISTES_LIST_PRIVATE) ? _SPIPLISTES_LIST_PRIV_YEARLY : _SPIPLISTES_LIST_PUB_YEARLY ; $sql_champs['periode'] = 0; break; } } else if($message_auto == 'non') { $sql_champs['message_auto'] = 'non'; $sql_champs['date'] = ''; $sql_champs['periode'] = 0; } } // end if($btn_modifier_courrier_auto) // Enregistre les modifs pour cette liste if(count($sql_champs)) { sql_updateq('spip_listes', $sql_champs, 'id_liste='.sql_quote($id_liste).' LIMIT 1'); } // Forcer les abonnements if($btn_valider_forcer_abos && $forcer_abo && in_array($forcer_abo, array('tous', 'auteurs', '6forum', 'aucun'))) { $forcer_format_reception = (($forcer_format_abo == 'oui') && in_array($forcer_format_reception, spiplistes_formats_autorises())) ? $forcer_format_reception : false ; include_spip('inc/spiplistes_listes_forcer_abonnement'); if(spiplistes_listes_forcer_abonnement ($id_liste, $forcer_abo, $forcer_format_reception) === false) { $message_erreur .= spiplistes_boite_alerte(_T('spiplistes:Forcer_abonnement_erreur'), true); } } } // end if($flag_editable) } ////////////////////////////////////////////////////// // Recharge les donnees la liste $sql_select_array = array('id_liste', 'titre', 'texte' , 'titre_message', 'pied_page', 'date', 'statut', 'maj' , 'email_envoi', 'message_auto', 'periode', 'patron', 'lang'); if($row = spiplistes_listes_liste_fetsel($id_liste, $sql_select_array)) { foreach($sql_select_array as $key) { // initialise les variables du resultat SQL $$key = $row[$key]; } } // les supers-admins et le moderateur seuls peuvent modifier la liste $flag_editable = autoriser('moderer', 'liste', $id_liste); if (empty($titre_message)) { $titre_message = $titre; if (spiplistes_pref_lire_defaut('opt_completer_titre_nom_site', 'oui') == 'oui') { $titre_message .= _T('spiplistes:_de_') . spiplistes_nom_site_texte($lang); } } $nb_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste); // preparation des boutons if($flag_editable) { // Propose de modifier la liste $gros_bouton_modifier = icone ( _T('spiplistes:Modifier_cette_liste') // legende bouton , generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_EDIT,'id_liste='.$id_liste) // lien , _DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply-to-all-24.gif" // image du fond , "edit.gif" // image de la fonction. Ici, le crayon , '' // alignement , false // pas echo, demande retour ) ; // Propose de supprimer la liste $gros_bouton_supprimer = icone ( _T('spiplistes:Supprimer_cette_liste') , generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "btn_supprimer_liste=$id_liste&id_liste=$id_liste") , _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'poubelle_msg.gif' , "" , "right" , false ) ; // la grosse boite des abonnes $tri = _request('tri') ? _request('tri') : 'nom'; // // CP-20101017: Si trop d'elligibles, ca gele. // @todo: revoir la boite/liste des abonnes/elligibles // En attendant ... //if(spiplistes_auteurs_elligibles_compter() < 1000) //{ $boite_liste_abonnes = spiplistes_listes_boite_abonnements( $id_liste, $statut, $tri, $debut, _SPIPLISTES_EXEC_LISTE_GERER ); //} //else //{ // $boite_liste_abonnes = _T('spiplistes:code_en_travaux'); //} // @see http://www.spip-contrib.net/SPIP-Listes#comment444314 $titre_boite = _T('spiplistes:abos_cette_liste'); $legend = '<small id="legend-abos1">' . spiplistes_nb_abonnes_liste_str_get($id_liste) . '</small>'.PHP_EOL ; $grosse_boite_abonnements = '' . '<!-- boite abonnes/elligibles -->'.PHP_EOL . debut_cadre_enfonce('auteur-24.gif', true, '', $titre_boite) . spiplistes_bouton_block_depliable($legend , false, md5('abonnes_liste')) . (spiplistes_spip_est_inferieur_193() ? $legend : '') . spiplistes_debut_block_invisible(md5('abonnes_liste')) . debut_cadre_relief('', true) . $boite_liste_abonnes . fin_cadre_relief(true) . fin_block() . fin_cadre_enfonce(true) . '<!-- fin boite abonnes/elligibles -->'.PHP_EOL ; // la grosse boite des moderateurs $boite_liste_moderateurs = spiplistes_listes_boite_moderateurs( $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'mods-conteneur' ); $titre_boite = _T('spiplistes:mods_cette_liste'); $nb = spiplistes_mod_listes_compter($id_liste); $legend = '<small>' . spiplistes_nb_moderateurs_liste_str_get($nb) . '</small>'.PHP_EOL ; $grosse_boite_moderateurs = '' . '<!-- boite moderateurs -->'.PHP_EOL . debut_cadre_enfonce('redacteurs-24.gif', true, '', $titre_boite) . spiplistes_bouton_block_depliable($legend , false, md5('mods_liste')) . (spiplistes_spip_est_inferieur_193() ? $legend : '') . spiplistes_debut_block_invisible(md5('mods_liste')) . debut_cadre_relief('', true) . '<div id="mods-conteneur">'.PHP_EOL . $boite_liste_moderateurs . '</div>'.PHP_EOL . fin_cadre_relief(true) . fin_block() . fin_cadre_enfonce(true) . '<!-- fin boite moderateurs -->'.PHP_EOL ; } else { $gros_bouton_modifier = $gros_bouton_supprimer = $grosse_boite_abonnements = ''; } //////////////////////////////////// // PAGE CONTENU //////////////////////////////////// $titre_page = _T('spiplistes:gestion_dune_liste'); // Permet entre autres d'ajouter les classes a la page : <body class='$rubrique $sous_rubrique'> $rubrique = _SPIPLISTES_PREFIX; $sous_rubrique = 'liste_gerer'; $commencer_page = charger_fonction('commencer_page', 'inc'); echo($commencer_page(_T('spiplistes:spiplistes') . ' - ' . $titre_page, $rubrique, $sous_rubrique)); // la gestion des listes de courriers est reservee aux admins if($connect_statut != '0minirezo') { die (spiplistes_terminer_page_non_autorisee() . fin_page()); } $page_result .= '' . '<br /><br /><br />' . PHP_EOL . spiplistes_gros_titre($titre_page, '', true) . barre_onglets($rubrique, $sous_rubrique) . debut_gauche($rubrique, true) . spiplistes_boite_info_id(_T('spiplistes:liste_numero'), $id_liste, true) . spiplistes_naviguer_paniers_listes(_T('spiplistes:aller_aux_listes_'), true) . spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_grand_patron' , _SPIPLISTES_PATRONS_DIR, _T('spiplistes:Patron_grand_') , ($patron ? $patron : '') , $patron) . spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_patron_pied' , _SPIPLISTES_PATRONS_PIED_DIR, _T('spiplistes:Patron_de_pied_') , ((($ii = strlen($pied_page)) > _SPIPLISTES_PATRON_FILENAMEMAX) ? _T('taille_octets',array('taille'=>$ii)) . _T('spiplistes:conseil_regenerer_pied') : $pied_page) , $pied_page) . pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) //. creer_colonne_droite($rubrique, true) // spiplistes_boite_raccourcis() s'en occupe . spiplistes_boite_raccourcis(true) . spiplistes_boite_autocron() . pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) . debut_droite($rubrique, true) . $message_erreur ; changer_typo('','liste'.$id_liste); // message alerte et demande de confirmation si supprimer liste if(($btn_supprimer_liste > 0) && ($btn_supprimer_liste == $id_liste)) { $page_result .= '' . spiplistes_boite_alerte (_T('spiplistes:Attention_suppression_liste').'<br />'._T('spiplistes:Confirmez_requete'), true) . '<form name="form_suppr_liste" id="form_suppr_liste" method="post" action="'.generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE, '').'">' . PHP_EOL . "<div class='verdana2' style='text-align:right;'>\n" . "<input type='hidden' name='id_liste' value='$id_liste' />\n" . "<label>"._T('spiplistes:Confirmer_la_suppression_de_la_liste')."# $id_liste : \n" . "<input class='fondo' type='submit' name='btn_supprimer_liste_confirme' value='"._T('bouton_valider')."' /></label>\n" . "</div>\n" . "</form>\n" . "<br />\n" ; } $page_result .= "" . debut_cadre_relief("", true) . "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n" . "<tr><td valign='top'>\n" . spiplistes_gros_titre(spiplistes_bullet_titre_liste('puce', $statut, '', true)." " . spiplistes_calculer_balise_titre(extraire_multi($titre)) , '', true) . "</td>" . "<td rowspan='2'>" // le gros bouton modifier si besoin . $gros_bouton_modifier . "</td></tr>\n" . "<tr><td width='100%'>\n" . "<div align='$spip_lang_left' style='padding: 5px; border: 1px dashed #aaa; ' class='verdana1 spip_small'>\n" . propre($texte."~") . "</div>\n" . "</td>\n" . "</tr></table>\n" ; ////////////////////////////////////////////////////// // Modifier le statut de la liste //$email_defaut = entites_html($meta['email_webmaster']); $email_defaut = ($m = email_valide($GLOBALS['meta']['email_defaut'])) ? $m : $GLOBALS['meta']['email_webmaster'] ; $email_envoi = ($m = email_valide($email_envoi)) ? $email_envoi : $email_defaut ; $page_result .= "" //. debut_cadre_relief("racine-site-24.gif", true) . debut_cadre_relief("racine-site-24.gif", true, '', _T('spiplistes:Diffusion').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "diffusion")) // //////////////////////////// // Formulaire diffusion . ( ($flag_editable) ? '' . spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,'id_liste='.$id_liste), true) . '<input type="hidden" name="exec" value="listes" />' . PHP_EOL . '<input type="hidden" name="id_liste" value="'.$id_liste.'" />' . PHP_EOL : '' ) . '<span class="verdana2">' . _T('spiplistes:cette_liste_est_' , array('s' => spiplistes_bullet_titre_liste ('puce', $statut, 'img_statut', true))) . '</span>' . PHP_EOL ; $sel_private = ' value="' . _SPIPLISTES_LIST_PRIVATE . '" ' . ( in_array ($statut, array( _SPIPLISTES_LIST_PRIVATE , _SPIPLISTES_LIST_PRIV_DAILY , _SPIPLISTES_LIST_PRIV_HEBDO , _SPIPLISTES_LIST_PRIV_WEEKLY , _SPIPLISTES_LIST_PRIV_MENSUEL , _SPIPLISTES_LIST_PRIV_MONTHLY , _SPIPLISTES_LIST_PRIV_YEARLY ) ) ? ' selected="selected"' : '' ) ; $sel_publique = ' value="' . _SPIPLISTES_LIST_PUBLIC . '" ' . ( in_array ($statut, array( _SPIPLISTES_LIST_PUBLIC , _SPIPLISTES_LIST_PUB_DAILY , _SPIPLISTES_LIST_PUB_HEBDO , _SPIPLISTES_LIST_PUB_WEEKLY , _SPIPLISTES_LIST_PUB_MENSUEL , _SPIPLISTES_LIST_PUB_MONTHLY , _SPIPLISTES_LIST_PUB_YEARLY ) ) ? ' selected="selected"' : '' ) ; $page_result .= PHP_EOL . ( ($flag_editable) ? '' . '<select class="verdana2 fondl" name="statut" size="1" id="change_statut">' . PHP_EOL . '<option' . $sel_private . ' style="background-color:#fff">' . _T('spiplistes:statut_interne') . '</option>' . PHP_EOL . '<option' . $sel_publique . ' style="background-color:#B4E8C5">' . _T('spiplistes:statut_publique') . '</option>' . PHP_EOL . '<option' . mySel(_SPIPLISTES_TRASH_LIST, $statut) . ' style="background:url(' . _DIR_IMG_PACK.'rayures-sup.gif)">' . _T('texte_statut_poubelle').'</option>' . PHP_EOL . '</select>' . PHP_EOL : '<span class="verdana2" style="font-weight:bold;">' . spiplistes_items_get_item('alt', $statut) . '</span>'. PHP_EOL ) . '<div style="margin:10px 0px;">' . PHP_EOL . ( ($flag_editable && strpos($GLOBALS['meta']['langues_multilingue'], ',')) ? '' . '<label class="verdana2" for="changer_lang">' . _T('info_multi_herit').' : </label>' . PHP_EOL . '<select name="changer_lang" class="fondl" id="changer_lang">' . PHP_EOL . liste_options_langues('changer_lang', $lang , _T('spiplistes:langue_'), '', '') . '</select>' . PHP_EOL : '' //. "<span class='verdana2'>". _T('info_multi_herit')." : " //. "<span class='verdana2' style='font-weight:bold;'>".traduire_nom_langue($lang)."</span>\n" ) . '</div>' . PHP_EOL . ( ($flag_editable) ? spiplistes_form_bouton_valider('btn_modifier_diffusion') . spiplistes_form_fin(true) : '' ) . fin_cadre_relief(true) ; //////////////////////////// // Formulaire adresse email pour le reply-to $page_result .= '' . debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply_to-24.png" , true , '' , _T('spiplistes:adresse_de_reponse').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE , "replyto") ) . spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste"), true) . "<p class='verdana2'>\n" . _T('spiplistes:adresse_mail_retour').":<br />\n" . ( ($flag_editable) ? _T('spiplistes:adresse')."</p>\n" . "<div style='text-align:center'>\n" . "<input type='text' name='email_envoi' value=\"".$email_envoi."\" size='40' class='fondl' /></div>\n" . spiplistes_form_bouton_valider('btn_modifier_replyto') : "</p><p style='font-weight:bold;text-align:center;'>$email_envoi</p>\n" ) . spiplistes_form_fin(true) . fin_cadre_relief(true) ; //////////////////////////// // Formulaire planifier un courrier automatique $page_result .= "" . "<a name='form-programmer' id='form-programmer'></a>\n" . debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."stock_timer.png", true, '', _T('spiplistes:messages_auto') . spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "temporiser")) ; $page_result .= "" . $boite_pour_confirmer_envoi_maintenant . spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste")."#form-programmer", true) . "<table border='0' cellspacing='1' cellpadding='3' width='100%'>\n" . "<tr><td align='$spip_lang_left' class='verdana2'>\n" ; if(empty($patron)) { $page_result .= "" . ( $flag_editable ? spiplistes_boite_alerte(_T('spiplistes:patron_manquant_message'), true) : "<p class='verdana2'>" . _T('spiplistes:liste_sans_patron') . "</p>\n" ) . "</td>\n" . "</tr>\n" . "<tr><td align='$spip_lang_left' class='verdana2'>\n" ; } if ($message_auto != "oui") { $page_result .= "<div class='verdana2'>"._T('spiplistes:pas_denvoi_auto_programme')."</div>\n"; } else { $page_result .= "" // petite ligne d'info si envoi programme . "<p class='verdana2'>"._T('spiplistes:sujet_courrier_auto')."<br />\n" . "<span class='spip_large'> " . spiplistes_calculer_balise_titre(extraire_multi($titre_message)) . "</span></p>\n" . "<p class='verdana2'>" . spiplistes_items_get_item('alt', $statut)."<br />\n" . ( ($statut == _SPIPLISTES_LIST_PUB_MONTHLY) ? "<strong>" . spiplistes_items_get_item("tab_t", $statut) . "</strong><br />" : "" ) . ( ($periode > 0) ? _T('spiplistes:periodicite_tous_les_n_s' , array('n' => " <strong>".$periode."</strong> " , 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false) ) ) : "" ) . ( (!in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_PERIODIQUES))) ? " <strong>"._T('spiplistes:Pas_de_periodicite')."</strong><br />" ._T('spiplistes:Ce_courrier_ne_sera_envoye_qu_une_fois') : "" ) . "<br />" . ( (intval($maj)) ? _T('spiplistes:Dernier_envoi_le_') . " <strong>" . affdate_heure($maj) . "</strong>" . ( ($last = round((time() - strtotime($maj)) / _SPIPLISTES_TIME_1_DAY)) ? " (".spiplistes_singulier_pluriel_str_get($last, _T('spiplistes:jour'), _T('spiplistes:jours')).")" : "" ). "<br />" : "" ) . ( ($date_prevue || (intval($date) && (time() < strtotime($date)))) ? _T('spiplistes:prochain_envoi_prevu')." : <strong>" . affdate_heure($date_prevue ? $date_prevue : $date) . "</strong>" . ( (!$date_prevue && ($next = round((strtotime($date) - time()) / _SPIPLISTES_TIME_1_DAY))) ? " (".spiplistes_singulier_pluriel_str_get($next, _T('spiplistes:jour'), _T('spiplistes:jours')).")" : "" ) : "" ) . "</p>\n" ; if($btn_modifier_courrier_auto) { $page_result .= "" . "<p class='verdana2'>"._T('spiplistes:date_act')."<br />" . _T('spiplistes:env_esquel')." <em>".$patron."</em>" . "</p>\n" ; } } $date_debut_envoi = (!empty($date_prevue) ? $date_prevue : (($date && intval($date)) ? $date : normaliser_date(time()))); $page_result .= "" . "</td>\n" . "</tr>\n" ; if($flag_editable) { $page_result .= "" . "<tr><td align='$spip_lang_left' class='verdana2'>" . "<input type='radio' name='message_auto' value='oui' id='auto_oui' " . (empty($patron) ? " disabled='disabled' " : "") . ($auto_checked = ($message_auto=='oui' ? "checked='checked'" : "")) . " />" . "<label for='auto_oui' ".($auto_checked ? "style='font-weight:bold;'" : "").">" . _T('spiplistes:prog_env')."</label>\n" . "<div id='auto_oui_detail' " .((empty($patron) || !$auto_checked) ? "style='display:none;'" : "") .">" . "<ul style='list-style-type:none;'>\n" . "<li>"._T('spiplistes:message_sujet') . ': <input type="text" name="titre_message" value="'.$titre_message.'" size="50" class="fondl" /> </li>'."\n" ; // // chrono jour $ii = ($periode > 0) ? $periode : 1; $page_result .= "" . "<li style='margin-top:0.5em'>" . spiplistes_form_input_radio ('auto_chrono', 'auto_jour' , '' , ($statut == _SPIPLISTES_LIST_PUB_DAILY) , true, false ) . _T('spiplistes:Tous_les') . " <input type='text' name='periode' value='".$ii."' size='4' maxlength='4' class='fondl' /> " . _T('info_jours') . "</li>\n" // chrono hebdo . "<li>" . spiplistes_form_input_radio ('auto_chrono', 'auto_hebdo' , _T('spiplistes:Toutes_les_semaines') , (($statut == _SPIPLISTES_LIST_PUB_HEBDO) || ($statut == _SPIPLISTES_LIST_PUB_WEEKLY)) , true, false) . spiplistes_form_input_checkbox('auto_weekly', 'oui' , _T('spiplistes:en_debut_de_semaine'), ($statut == _SPIPLISTES_LIST_PUB_WEEKLY), true, false) . "</li>\n" // chrono mois . "<li>" . spiplistes_form_input_radio ('auto_chrono', 'auto_mensuel' , _T('spiplistes:Tous_les_mois') , (($statut == _SPIPLISTES_LIST_PUB_MENSUEL) || ($statut == _SPIPLISTES_LIST_PUB_MONTHLY)) , true, false) . spiplistes_form_input_checkbox('auto_mois', 'oui' , _T('spiplistes:en_debut_de_mois'), ($statut == _SPIPLISTES_LIST_PUB_MONTHLY), true, false) . "</li>\n" // chrono annee . "<li>" . spiplistes_form_input_radio ('auto_chrono', 'auto_an' , _T('spiplistes:Tous_les_ans') , ($statut == _SPIPLISTES_LIST_PUB_YEARLY) , true, false) . "</li>\n" . "<li style='margin-top:0.5em'>"._T('spiplistes:A_partir_de')." : <br />\n" // . spiplistes_dater_envoi( 'liste', $id_liste, $statut , $flag_editable , _T('spiplistes:date_expedition_') , $date_debut_envoi, 'btn_changer_date' , false ) . "</li>\n" . ( (!$envoyer_maintenant) ? " <li>" . spiplistes_form_input_checkbox('envoyer_maintenant', 'oui' , _T('spiplistes:env_maint'), false, true) . "</li>\n" : "" ) . "</ul></div>\n" ; $checked = ($message_auto=='non') ? "checked='checked'" : ""; $class = $checked ? "class='bold'" : ""; $disabled = (empty($patron) ? " disabled='disabled' " : ""); $page_result .= "" . "<br /><input type='radio' name='message_auto' value='non' id='auto_non' $disabled $checked />" . "<span $class >" . " <label for='auto_non'>"._T('spiplistes:prog_env_non')."</label> " . "</span>\n" . "</td></tr>\n" ; $page_result .= "" . "<tr><td style='text-align:$spip_lang_right;'>" . ( ($id_liste) ? "<input type='hidden' name='id_liste' value='$id_liste' />" : "" ) . ( ($new) ? "<input type='hidden' name='new' value='$new' />" : "" ) // bouton de validation . (!empty($patron) ? spiplistes_form_bouton_valider('btn_modifier_courrier_auto', _T('bouton_valider'), true) : "") . "</td></tr>" ; } $page_result .= "" . "</table>\n" . spiplistes_form_fin(true) . fin_cadre_relief(true) ; // fin formulaire planifier $page_result .= "" . fin_cadre_relief(true) . $grosse_boite_abonnements . $grosse_boite_moderateurs ; // le super-admin peut abonner en masse if($connect_toutes_rubriques) { $page_result .= "" . "\n<!-- forcer abo -->\n" . debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."abonner-24.png", true, '', _T('spiplistes:forcer_les_abonnement_liste').spiplistes_plugin_aide("forcerliste"))."\n" . "<p class='verdana2'>\n" . _T('spiplistes:forcer_abonnement_desc') . "</p>\n" . "<p class='verdana2' style='margin-bottom:1em'><em>" . _T('spiplistes:forcer_abonnement_aide', array('lien_retour' => generer_url_ecrire(_SPIPLISTES_EXEC_ABONNES_LISTE))) . "</em></p>\n" . "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste#auteurs")."' id='form_forcer_abo' name='form_forcer_abo' method='post'>\n" . debut_cadre_relief("", true)."\n" // ////////////////////////// // propose de forcer les membres sauf invites si la liste est privee . ( ($statut==_SPIPLISTES_LIST_PRIVATE) ? "<div class='verdana2'><input type='radio' name='forcer_abo' value='auteurs' id='forcer_abo_tous' />\n" . "<label for='forcer_abo_tous'>"._T('spiplistes:Abonner_tous_les_inscrits_prives')."</label>" . "</div>\n" . spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux')) : "" ) // // propose de forcer les invites si la liste est publique ou periodique . ( (($statut!=_SPIPLISTES_LIST_PRIVATE) && ($statut!=_SPIPLISTES_TRASH_LIST)) ? "<div class='verdana2'><input type='radio' name='forcer_abo' value='6forum' id='forcer_abo_6forum' />\n" . "<label for='forcer_abo_6forum'>"._T('spiplistes:Abonner_tous_les_invites_public')."</label></div>\n" . spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux')) : "" ) . ( ($nb_abonnes) ? "<hr />\n" . "<div class='verdana2'><input type='radio' name='forcer_abo' value='aucun' id='forcer_desabo' />\n" . "<label for='forcer_desabo'>"._T('spiplistes:Forcer_desabonner_tous_les_inscrits')."</label></div>\n" : "" ) . fin_cadre_relief(true)."\n" . "<div style='text-align:right;'><input type='submit' name='btn_valider_forcer_abos' value='"._T('bouton_valider')."' class='fondo' /></div>\n" . "</form>\n" . fin_cadre_enfonce (true)."\n" ; } // $page_result .= "" . $gros_bouton_supprimer ; echo($page_result); echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) , spiplistes_html_signature(_SPIPLISTES_PREFIX) , fin_gauche(), fin_page(); } // end exec_spiplistes_liste_gerer()
function spiplistes_lister_courriers_listes ( $titre_tableau , $image , $element='listes' , $statut='' , $apres_maintenant=false , $nom_position='position' , $exec , $id_auteur=0 , $pas=10 , $return=true) { include_spip('inc/spiplistes_api'); include_spip('inc/spiplistes_api_courrier'); $position = intval($_GET[$nom_position]); $pas = intval($pas); $id_auteur = intval($id_auteur); //$retour = _DIR_RESTREINT_ABS.self(); $clause_where = ''; ////////////////////////////////// // requete // construction de la requete SQL // sera (en partie) utilisee plus bas pour compter et pagination switch($element) { case 'abonnements': $sql_select = "listes.id_liste,listes.titre,listes.statut,listes.date,abos.id_auteur"; $sql_from = "spip_auteurs_listes AS abos LEFT JOIN spip_listes AS listes ON abos.id_liste=listes.id_liste"; $sql_where = "abos.id_auteur=".sql_quote($id_auteur); $sql_order = "listes.titre"; break; case 'courriers': $sql_select = "id_courrier, titre, date, date_debut_envoi,date_fin_envoi, nb_emails_envoyes,total_abonnes,email_test"; $sql_from = "spip_courriers"; $sql_where = "statut=".sql_quote($statut); $sql_order = "date"; break; case 'listes': if ( // pour lister les listes programmees dans un futur in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_OK)) && ($apres_maintenant == true) ) { $clause_where.= " AND (maj NOT BETWEEN 0 AND NOW())"; } $sql_select = "id_liste,titre,date,patron,maj,periode,statut"; $sql_from = "spip_listes"; $sql_where = "statut=".sql_quote($statut)." $clause_where"; $sql_order = "date"; break; } // $resultat_aff = sql_select($sql_select, $sql_from, $sql_where, '', array($sql_order." DESC "), $position.",".$pas); ////////////////////// if (($nb_ = @sql_count($resultat_aff)) > 0) { // titre du tableau $en_liste = "" . "<div class='liste'>\n" . "<div style='position: relative;'>\n" . "<div style='position: absolute; top: -12px; left: 3px;'>\n" . "<img src='$image' alt='' width='24' height='24' />\n" . "</div>\n" . "<div style='background-color:white; color:black; padding:3px; padding-left:30px; border-bottom:1px solid #444;' class='verdana2'>\n" . "<strong>\n" . $titre_tableau . "</strong>\n" . "</div>\n" . "</div>\n" . "<table width='100%' cellpadding='2' cellspacing='0' border='0'>\n" ; while ($row = sql_fetch($resultat_aff)) { $titre = $row['titre']; $date = $row['date']; switch ($element){ case 'abonnements': $id_row = $row['id_liste']; $url_row = generer_url_ecrire($exec, 'id_liste='.$id_row); $retour = self(); $url_desabo = generer_action_auteur(_SPIPLISTES_ACTION_CHANGER_STATUT_ABONNE , $row['id_auteur'].'-listedesabo-'.$id_row , $retour); spiplistes_debug_log('desabo: '.$url_desabo); spiplistes_debug_log('retour: '.$retour); $statut = $row['statut']; break; case 'courriers': $id_row = $row['id_courrier']; $nb_emails_envoyes = $row['nb_emails_envoyes']; $date_debut_envoi = $row['date_debut_envoi']; $date_fin_envoi = $row['date_fin_envoi']; $total_abonnes = $row['total_abonnes']; $email_test = $row['email_test']; $url_row = generer_url_ecrire($exec, 'id_courrier='.$id_row); break; case 'listes': $id_row = $row['id_liste']; $url_row = generer_url_ecrire($exec, 'id_liste='.$id_row); $patron = $row['patron']; $maj = $row['maj']; $periode = $row['periode']; break; } $en_liste.= "" . "<tr class='tr_liste'>\n" . "<td width='11' style='vertical-align:top;'>" . "<img src='".spiplistes_items_get_item("puce", $statut)."' alt=\"" . spiplistes_items_get_item("alt", $statut)."\" border='0' style='margin: 3px 1px 1px;' />" . "</td>" . "<td class='arial2'>\n" . "<div>\n" . "<a href=\"".$url_row."\" dir='ltr' style='display:block;'>\n" . spiplistes_calculer_balise_titre(extraire_multi($titre)) ; switch($element) { // si courriers, donne le nombre de destinataires case 'courriers': $nb_abo = ""; if(empty($email_test)) { $nb_abo = spiplistes_nb_destinataire_str_get($total_abonnes); } else { $nb_abo = _T('spiplistes:email_adresse'); } if($nb_abo) { $en_liste .= " <span class='spiplistes-legend-stitre' dir='ltr'>($nb_abo)</span>\n" ; } break; // si liste, donne le nombre d'abonnes case 'listes': //$nb_abo = spiplistes_nb_abonnes_liste($id_row); // affiche infos complementaires pour les listes $en_liste .= "" . " <span style='font-size:100%;color:#666666' dir='ltr'>\n" . "<span class='spiplistes-legend-stitre'>".spiplistes_nb_abonnes_liste_str_get($id_row)."</span>" . "<br />" . ( empty($patron) ? "<span class='texte-alerte'>" . _T('spiplistes:liste_sans_patron') . "</span>" : _T('spiplistes:patron_') . " <strong>".$patron."</strong>" ) ; if (!empty($date) && intval($date)) { if($periode) { $en_liste .= "<br />" . _T('spiplistes:periodicite_tous_les_n_s' , array('n' => " <strong>".$periode."</strong> " , 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false) ) ) ; } else { // inutile de preciser le statut, c'est dans le titre du bloc } $en_liste .= "" . "" . "<br />" . _T('spiplistes:Prochain_envoi_') . " : <strong>".affdate_heure($date)."</strong>" ; } $en_liste .= "" . "</span>\n" ; break; } ////////////////////// $en_liste .= "" . "</a>\n" . "</div>\n" . "</td>\n" . "<td width='120' class='arial1'>" ; switch($element) { case 'abonnements': $en_liste .= "" . "<a href=\"$url_desabo\" dir='ltr' style='display:block;'>"._T('spiplistes:desabonnement')."</a>\n" ; break; case 'courriers': // - date debut envoi si encour, sinon date de publication if(!in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_REDAC, _SPIPLISTES_COURRIER_STATUT_READY))) { $en_liste .= "" . ( ($statut==_SPIPLISTES_COURRIER_STATUT_ENCOURS) ? _T('spiplistes:envoi_en_cours') : affdate_heure($date_fin_envoi) ) ; } break; } $en_liste .= "" . "</td>\n" . "<td width='50' class='arial1'><strong>"._T('info_numero_abbreviation').$id_row."</strong></td>\n" . "</tr>\n" ; } $en_liste.= "</table>\n"; ////////////////////// // Pagination si besoin switch ($element){ case 'abonnements': $sql_select = "COUNT(listes.id_liste) AS n"; $param = "&id_auteur=$id_auteur"; break; case 'courriers': $sql_select = "COUNT(id_courrier) AS n"; $param = "&statut=$statut"; break; case 'listes': $sql_select = "COUNT(id_liste) AS n"; $param = ""; break; } $sql_result = sql_select($sql_select, $sql_from, $sql_where); if( $sql_result && ($row = sql_fetch($sql_result)) && ($total = $row['n']) ) { $retour = _request('exec'); $en_liste .= spiplistes_afficher_pagination($retour, $param, $total, $position, $nom_position, $pas); } $en_liste .= "" . "</div>\n" . "<br />\n" ; } if($return) return($en_liste); else echo($en_liste); }
/** * @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(); } }
/** * CP-20110321 * Retourne une version texte pure du nom du site * @return string */ function spiplistes_nom_site_texte ($lang = '') { static $nom_site; $lang = trim ($lang); if (empty($lang)) { $lang = $GLOBALS['meta']['langue_site']; } if ($nom_site === null) { $nom_site = array(); } if (!isset($nom_site[$lang])) { $n = strip_tags(html_entity_decode(extraire_multi($GLOBALS['meta']['nom_site']))); // incorrect avec utf-8. Abime les diacritiques //$n = preg_replace ('@\s*@', ' ', $n); $nom_site[$lang] = trim($n); } return ($nom_site[$lang]); }
/** * Calcule une liste des paquets en fonctions de critères de recherche * * Cette liste : * - est sans doublons, ie on ne garde que la version la plus récente * - correspond aux critères * - est compatible avec la version SPIP installée sur le site * - ne liste pas ceux étant déjà installés (ces paquets peuvent toutefois être affichés) * - est triée par nom ou score * * @uses liste_des_champs() * @uses recherche_en_base() * * @param string $phrase * Texte de la recherche * @param string $categorie * Type de catégorie de plugin (auteur, date...) * @param string $etat * État de plugin (stable, test...) * @param string|int $depot * Identifiant de dépot * @param string $version_spip * Version de SPIP dont le paquet doit être compatible * @param array $exclusions * Liste d'identifiants de plugin à ne pas intégrer dans la liste * @param bool $afficher_exclusions * Afficher aussi les paquets déjà installés (true) * ou ceux qui ne le sont pas (false) ? * @param bool $doublon * Afficher toutes les versions de paquet (true) * ou seulement la plus récente (false) ? * @param string $tri * Ordre du tri : nom | score * * @return array * Tableau classé par pertinence de résultat * - 'prefixe' => tableau de description du paquet (si pas de doublons demandé) * - n => tableau de descriptions du paquet (si doublons autorisés) **/ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $version_spip = '', $exclusions = array(), $afficher_exclusions = false, $doublon = false, $tri = 'nom') { include_spip('inc/rechercher'); $plugins = array(); $scores = array(); $ids_paquets = array(); // On prepare l'utilisation de la recherche en base SPIP en la limitant aux tables spip_plugins // et spip_paquets si elle n'est pas vide if ($phrase) { $liste = liste_des_champs(); $tables = array('plugin' => $liste['plugin']); $options = array('jointures' => true, 'score' => true); // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui // correspondent a la phrase recherchee // -- On obtient une liste d'id de plugins et d'id de paquets $resultats = array('plugin' => array(), 'paquet' => array()); $resultats = recherche_en_base($phrase, $tables, $options); // -- On prepare le tableau des scores avec les paquets trouves par la recherche if ($resultats) { // -- On convertit les id de plugins en id de paquets $ids = array(); if (isset($resultats['plugin']) and $resultats['plugin']) { $ids_plugin = array_keys($resultats['plugin']); $where[] = sql_in('id_plugin', $ids_plugin); $ids = sql_allfetsel('id_paquet, id_plugin', 'spip_paquets', $where); } // -- On prepare les listes des id de paquet et des scores de ces memes paquets if (isset($resultats['paquet']) and $resultats['paquet']) { $ids_paquets = array_keys($resultats['paquet']); foreach ($resultats['paquet'] as $_id => $_score) { $scores[$_id] = intval($resultats['paquet'][$_id]['score']); } } // -- On merge les deux tableaux de paquets sans doublon en mettant a jour un tableau des scores foreach ($ids as $_ids) { $id_paquet = intval($_ids['id_paquet']); $id_plugin = intval($_ids['id_plugin']); if (array_search($id_paquet, $ids_paquets) === false) { $ids_paquets[] = $id_paquet; $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']); } else { $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score']) + intval($resultats['plugin'][$id_plugin]['score']); } } } } else { if ($ids_paquets = sql_allfetsel('id_paquet', 'spip_paquets')) { $ids_paquets = array_map('reset', $ids_paquets); foreach ($ids_paquets as $_id) { $scores[$_id] = 0; } } } // Maintenant, on continue la recherche en appliquant, sur la liste des id de paquets, // les filtres complementaires : categorie, etat, exclusions et compatibilite spip // si on a bien trouve des resultats precedemment ou si aucune phrase n'a ete saisie // -- Preparation de la requete if ($ids_paquets) { $from = array('spip_plugins AS t1', 'spip_paquets AS t2', 'spip_depots AS t3'); $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe', 't1.id_plugin AS id_plugin', 't2.id_paquet AS id_paquet', 't2.description AS description', 't2.compatibilite_spip AS compatibilite_spip', 't2.lien_doc AS lien_doc', 't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat', 't2.logo AS logo', 't2.version AS version', 't2.nom_archive AS nom_archive', 't3.url_archives AS url_archives'); $where = array('t1.id_plugin=t2.id_plugin', 't2.id_depot=t3.id_depot'); if ($ids_paquets) { $where[] = sql_in('t2.id_paquet', $ids_paquets); } if ($categorie and $categorie != 'toute_categorie') { $where[] = 't1.categorie=' . sql_quote($categorie); } if ($etat and $etat != 'tout_etat') { $where[] = 't2.etat=' . sql_quote($etat); } if ($depot and $depot != 'tout_depot') { $where[] = 't2.id_depot=' . sql_quote($depot); } if ($exclusions and !$afficher_exclusions) { $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT'); } if ($resultats = sql_select($select, $from, $where)) { while ($paquets = sql_fetch($resultats)) { $prefixe = $paquets['prefixe']; $version = $paquets['version']; $nom = extraire_multi($paquets['nom']); $slogan = extraire_multi($paquets['slogan']); $description = extraire_multi($paquets['description']); if (svp_verifier_compatibilite_spip($paquets['compatibilite_spip'], $version_spip)) { // Le paquet remplit tous les criteres, on peut le selectionner // -- on utilise uniquement la langue du site $paquets['nom'] = $nom; $paquets['slogan'] = $slogan; $paquets['description'] = $description; // -- on ajoute le score si on a bien saisi une phrase if ($phrase) { $paquets['score'] = $scores[intval($paquets['id_paquet'])]; } else { $paquets['score'] = 0; } // -- on construit l'url de l'archive $paquets['url_archive'] = $paquets['url_archives'] . '/' . $paquets['nom_archive']; // -- on gere les exclusions si elle doivent etre affichees if ($afficher_exclusions and in_array($paquets['id_plugin'], $exclusions)) { $paquets['installe'] = true; } else { $paquets['installe'] = false; } // -- On traite les doublons (meme plugin, versions differentes) if ($doublon) { $plugins[] = $paquets; } else { // ajout // - si pas encore trouve // - ou si sa version est inferieure (on garde que la derniere version) if (!isset($plugins[$prefixe]) or !$plugins[$prefixe] or $plugins[$prefixe] and spip_version_compare($plugins[$prefixe]['version'], $version, '<')) { $plugins[$prefixe] = $paquets; } } } } } // On trie le tableau par score décroissant ou nom croissant $fonction = 'svp_trier_par_' . $tri; if ($doublon) { usort($plugins, $fonction); } else { uasort($plugins, $fonction); } } return $plugins; }
function picker_identifie_id_rapide($ref,$rubriques=0,$articles=0){ include_spip("inc/json"); include_spip("inc/lien"); if (!($match = typer_raccourci($ref))) return json_export(false); @list($type,,$id,,,,) = $match; if (!in_array($type,array($rubriques?'rubrique':'x',$articles?'article':'x'))) return json_export(false); $table_sql = table_objet_sql($type); $id_table_objet = id_table_objet($type); if (!$titre = sql_getfetsel('titre',$table_sql,"$id_table_objet=".intval($id))) return json_export(false); $titre = attribut_html(extraire_multi($titre)); return json_export(array('type'=>$type,'id'=>"$type|$id",'titre'=>$titre)); }
function filtre_introduction_dist($descriptif, $texte, $longueur, $connect) { // Si un descriptif est envoye, on l'utilise directement if (strlen($descriptif)) { return propre($descriptif, $connect); } // De preference ce qui est marque <intro>...</intro> $intro = ''; $texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte); // minuscules while ($fin = strpos($texte, "</intro>")) { $zone = substr($texte, 0, $fin); $texte = substr($texte, $fin + strlen("</intro>")); if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") { $zone = substr($zone, $deb + 7); } $intro .= $zone; } // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut, // qui inclus raccourcis et modeles // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ... // par ailleurs le nettoyage des raccourcis ne tient pas compte // des surcharges et enrichissement de propre // couper doit se faire apres propre //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect); // Cependant pour des questions de perfs on coupe quand meme, en prenant // large et en se mefiant des tableaux #1323 if (strlen($intro)) { $texte = $intro; } else { if (strpos("\n" . $texte, "\n|") === false and strlen($texte) > 2.5 * $longueur) { if (strpos($texte, "<multi") !== false) { $texte = extraire_multi($texte); } $texte = couper($texte, 2 * $longueur); } } // ne pas tenir compte des notes if ($notes = charger_fonction('notes', 'inc', true)) { $notes('', 'empiler'); } // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable // dans l'introduction. $texte = supprime_img($texte, ''); $texte = propre($texte, $connect); if ($notes) { $notes('', 'depiler'); } if (!defined('_INTRODUCTION_SUITE')) { define('_INTRODUCTION_SUITE', ' (...)'); } $texte = couper($texte, $longueur, _INTRODUCTION_SUITE); // et reparagrapher si necessaire (coherence avec le cas descriptif) if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); } return $texte; }
/** * Trouver le titre d'un objet publie * * @param string $objet * @param int $id_objet * @param int $id_forum * @param bool $publie * @return bool|string */ function forum_recuperer_titre_dist($objet, $id_objet, $id_forum = 0, $publie = true) { include_spip('inc/filtres'); $titre = ""; if ($f = charger_fonction($objet . '_forum_extraire_titre', 'inc', true)) { $titre = $f($id_objet); } else { include_spip('base/objets'); if ($publie and !objet_test_si_publie($objet, $id_objet)) { return false; } $titre = generer_info_entite($id_objet, $objet, 'titre', '*'); } if ($titre and $id_forum) { $titre_m = sql_getfetsel('titre', 'spip_forum', "id_forum = " . intval($id_forum)); if (!$titre_m) { return false; // URL fabriquee } $titre = $titre_m; } $titre = supprimer_numero($titre); $titre = str_replace('~', ' ', extraire_multi($titre)); return $titre; }
function initiale($nom) { return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1); }
/** * Formulaire de selection destinataire * * $flag_admin: si true, possibilite de modifier le destinataire * sinon, ne fait qu'afficher l'etat * * Renvoie : * $$nom_bouton_validation: si bouton de validation presse * $radio_destination: determine le choix * -> soit 'email_test' si adresse mail choisie * -> soit 'id_liste' si c'est une liste qui est choisie * $email_test: adresse email de test * $id_liste: id de la liste choisie */ function spiplistes_destiner_envoi ( $id_courrier, $id_liste , $flag_admin , $flag_moderateur , $listes_moderees , $statut, $type, $nom_bouton_validation, $email_test = "") { include_spip('inc/presentation'); include_spip('inc/texte'); include_spip('inc/actions'); include_spip('inc/date'); global $spip_lang_left , $spip_lang_right , $options ; $id_liste = intval($id_liste); $result = $destinataire = ""; if($id_liste) { if($row = sql_fetsel("titre", "spip_listes", "id_liste=".sql_quote($id_liste))) { $destinataire = $row['titre']; } } else if (!empty($email_test)) { $destinataire = $email_test; } if(empty($destinataire)) { $destinataire = "<span style='color:gray;font-size:90%;'>"._T('spiplistes:Choix_non_defini')."</span>"; } $invite = "<strong><span class='verdana1' style='text-transform: uppercase;'>" . _T('spiplistes:Destination') . ' : </span> ' . $destinataire . "</strong>" ; if( ($flag_admin || $flag_moderateur) && (($statut == _SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut == _SPIPLISTES_COURRIER_STATUT_READY)) ) { $adresse_test = $GLOBALS['auteur_session']['email']; $listes_abos = spiplistes_listes_lister_abos(); $liste_disabled = $listes_abos ? "" : " disabled='disabled'"; // propose l'envoi en test $masque = "" . "<ul class='verdana2' style='list-style-type:none;padding-left:0;'>" . "<li> <input type='radio' name='radio_destination' value='email_test' checked='checked' id='desttest' />" . "<label for='desttest'>"._T('spiplistes:email_tester')."</label> : " . "<input type='text' name='email_test' value='$adresse_test' class='fondo' size='35' />\n" . "</li>" . "<li> <input type='radio' name='radio_destination' value='id_liste' id='destlist' $liste_disabled />" . "<label for='destlist'>"._T('spiplistes:listes_de_diffusion_')."</label> : " ; // propose les listes if($listes_abos) { $masque .= "" . "<select class='verdana2' name='id_liste' onchange='document.getElementById(\"destlist\").checked=true;' >\n" ; foreach($listes_abos as $row) { if( ($row['nb_abos'] > 0) && ( $flag_admin || ($flag_moderateur && in_array($row['id_liste'], $listes_moderees)) ) ) { $checked = ($id_liste == $row['id_liste']) ? "checked='checked'" : ""; $nb_abos = spiplistes_singulier_pluriel_str_get( $row['nb_abos'] , _T('spiplistes:nb_abonnes_sing') , _T('spiplistes:nb_abonnes_plur') ) ; $masque .= "<option value='" . $row['id_liste'] . "' $checked >" . spiplistes_calculer_balise_titre(extraire_multi($row['titre'])) . " (" . $nb_abos . ")</option>\n"; } } $masque .= "" . "</select>\n" ; } else { $masque .= _T('spiplistes:aucune_liste_dispo'); } $masque .= "" . "</li>" . "</ul>" . "<div style='text-align:right;'>" . "<input type='submit' name='$nom_bouton_validation' value=\""._T('bouton_valider')."\" class='fondo' /></div>\n" ; // enveloppe dans un formulaire $masque = "" . "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER,'id_courrier='.$id_courrier)."' method='post'>\n" . $masque . "</form>\n" ; $result = block_parfois_visible('destinerblock', $invite, $masque, 'text-align: left'); } else { $result = $invite; } if(!empty($result)) { $result = "<div style='margin-top:1ex;'>" . debut_cadre_couleur('',true) . $result . fin_cadre_couleur(true) ."</div>\n"; } return ($result); }