/** * Permet de forcer l'abonnement a une liste * $statut = "tous" => '6forum' + '1comite' + '0minirezo' * si statut == 'aucun', desabonne tous * @global string $connect_id_auteur * @global boolean $connect_toutes_rubriques * @global int $connect_id_auteur * @param int $id_liste * @param string $statut * @param boolean $forcer_format_reception * @return boolean */ function spiplistes_listes_forcer_abonnement ($id_liste, $statut, $forcer_format_reception) { global $connect_statut , $connect_toutes_rubriques , $connect_id_auteur ; $id_liste = intval($id_liste); if ($id_liste <= 0) { return(false); } $sql_where = ''; if($statut=="tous") { $sql_where = " (statut=".sql_quote('6forum')." OR statut=".sql_quote('1comite')." OR statut=".sql_quote('0minirezo').")"; } if($statut=="auteurs") { $sql_where = " (statut=".sql_quote('1comite')." OR statut=".sql_quote('0minirezo').")"; } else if(in_array($statut, array('6forum', '1comite', '0minirezo'))) { $sql_where = " statut=".sql_quote($statut).""; } if(!empty($sql_where)) { // cherche les non-abonnes /* * "SELECT id_auteur FROM spip_auteurs WHERE $sql_where AND LENGTH(email) AND id_auteur NOT IN ($selection)" */ $selection = (spiplistes_spip_est_inferieur_193()) ? "SELECT id_auteur FROM spip_auteurs_listes WHERE id_liste=".sql_quote($id_liste) : sql_select("id_auteur", "spip_auteurs_listes", "id_liste=".sql_quote($id_liste),'','','','','',false) ; $sql_result = sql_select( 'id_auteur' , 'spip_auteurs' , array( $sql_where , "LENGTH(email)" , "id_auteur NOT IN ($selection)" ) ); if($sql_result) { $sql_values = $elargis = ""; $nb = sql_count($sql_result); if($nb > 0) { while($row = sql_fetch($sql_result)) { $sql_values .= " (".sql_quote(intval($row['id_auteur'])) . ", $id_liste, NOW()" // rajoute le format si force' . (($forcer_format_reception) ? "," . sql_quote($forcer_format_reception) : "") . "),"; $elargis .= sql_quote(intval($row['id_auteur'])); } if(!empty($sql_values)) { $sql_values = rtrim($sql_values, ","); $sql_result = sql_insert('spip_auteurs_listes' , "(id_auteur, id_liste, date_inscription" . ($forcer_format_reception ? ",format" : "") . ")" , $sql_values ); if($sql_result === false) { spiplistes_sqlerror_log("listes_forcer_abonnement"); return(false); } else { spiplistes_log($nb . " AUTEURS ($statut) ADDED TO LISTE #$id_liste BY ID_AUTEUR #$connect_id_auteur"); if($forcer_format_reception) { // le format est demande' force'. // rajouter les abonnes manquants a spip_auteurs_elargis $sql_insert = " INSERT INTO spip_auteurs_elargis (id_auteur,`spip_listes_format`) SELECT l.id_auteur,l.format FROM spip_auteurs_listes AS l WHERE l.id_liste=" . sql_quote($id_liste) . " AND NOT EXISTS (SELECT NULL FROM spip_auteurs_elargis AS e WHERE l.id_auteur = e.id_auteur) "; if(sql_query($sql_insert) === false) { spiplistes_sqlerror_log("listes_forcer_abonnement"); } else { spiplistes_log("RECEPT. FORMAT MODIFIED FOR ID_LISTE #$id_liste BY ID_AUTEUR #$connect_id_auteur"); } } return($nb); } } } return(0); // pas d'abo a rajouter. Pas une erreur. } return(false); } else if($statut == "aucun") { // desabonner tous $result = 0; $sql_result = sql_delete('spip_auteurs_listes', "id_liste=".sql_quote($id_liste)); if($sql_result) { spiplistes_log("auteurs (tous) removed from id_liste #$id_liste by id_auteur #$connect_id_auteur"); $result++; return($result); } } return(false); } // end spiplistes_listes_forcer_abonnement()
function spiplistes_import( $filename , $realname , $abos_liste , $format_abo = 'non' , $separateur = "\t" , $flag_admin , $listes_autorisees , $forcer_abo = false ) { $result_affiche = ''; if(is_readable($filename)) { // abonner les adresses importees // aux listes... if(!is_array($abos_liste)) { if(($ii = intval($abos_liste)) <= 0) { return(false); } $abos_liste = array($ii); } else { $abos_liste = array_map('intval', $abos_liste); } // recupere les logins et mails existants dans la base // pour eviter les doublons $current_entries = array(); $sql_result = sql_select(array('id_auteur', 'login', 'email', 'nom'), 'spip_auteurs'); while($row = spip_fetch_array($sql_result)) { // ne prendre que les comptes qui ont un email if($m = $row['email']) { $m = strtolower($m); $current_entries[$m] = array('login' => strtolower($row['login']) , 'id_auteur' => $row['id_auteur'] , 'nom' => $row['nom'] ); } } //syslog(LOG_NOTICE, 'memory_get_usage[2]: ' . memory_get_usage()); // spiplistes_log('import fichier '.$filename); $new_entries = file($filename); //syslog(LOG_NOTICE, 'memory_get_usage[3]: ' . memory_get_usage()); $nb_new_entries = count($new_entries); $bad_dupli = $bad_email = 0; $statuts_auteurs = array('6forum', '1comite', '0minirezo'); // charger la table des abonnements en ram afin d'eviter les petites requettes $abonnements = array(); if(($sql_result = sql_select('id_auteur,id_liste' , 'spip_auteurs_listes') ) !== false) { while($row = sql_fetch($sql_result)) { if(!isset($abonnements[$row['id_liste']])) { $abonnements[$row['id_liste']] = array(); } $abonnements[$row['id_liste']][] = $row['id_auteur']; } } else { spiplistes_sqlerror_log('module import (abonnements)'); } if($forcer_abo) { $auteurs_format = array(); // charger la table des formats afin d'eviter les petites requettes if(($sql_result = sql_select("id_auteur,`spip_listes_format` AS format" , 'spip_auteurs_elargis')) !== false) { while($row = sql_fetch($sql_result)) { $auteurs_format[$row['id_auteur']] = $row['format']; } } else { spiplistes_sqlerror_log("module import (format)"); } } // les formats $modifier_format = array(); $err_import = _T('spiplistes:erreur_import_base'); //syslog(LOG_NOTICE, 'memory_get_usage[2]: ' . memory_get_usage()); //syslog(LOG_NOTICE, 'memory_get_peak_usage[2]: ' . memory_get_peak_usage()); $start_time = microtime(1); $stack_new_auteurs = array(); // statut temporaire $tmp_statut = '6abo'.date('YmdGis'); for($jj = 0; $jj < $nb_new_entries; $jj++) { $nouvelle_entree = trim($new_entries[$jj]); if(!empty($nouvelle_entree) // ni une ligne de commentaire && !ereg("^[/#]", $nouvelle_entree)) { list($email, $login, $nom) = explode($separateur, $nouvelle_entree); $email = strtolower(trim($email)); $mail_exist = false; if(($email = email_valide($email)) && ( !($mail_exist = array_key_exists($email, $current_entries)) || $forcer_abo ) ) { if(!$mail_exist) { // si le compte n'existe pas, le creer // commencer par calculer le login $login = trim($login); if(empty($login)) { $login = spiplistes_login_from_email($email); } else { $login = strtolower($login); } // puis le nom $nom = trim($nom); if(empty($nom)) { $nom = ucfirst($login); } // ajoute l'invite' dans la table des auteurs $pass = creer_pass_aleatoire(8, $email); // nouvel abo dans la pile des "a creer" $stack_new_auteurs[] = array( 'nom' => $nom , 'email' => $email , 'login' => $login , 'pass' => md5($pass) , 'statut' => $tmp_statut , 'htpass' => generer_htpass($pass) ); } // end if(!$mail_exist) // adresse mail existe dans la base // si on passe par ici, c'est sous-entendu $forcer_abo (abonne' un compte existant) else { $id_auteur = intval($current_entries[$email]['id_auteur']); // forcer le format dans la foulee if(!isset($auteurs_format[$id_auteur])) { $modifier_format[] = '(' . sql_quote($id_auteur) . ',' . sql_quote($format_abo) . ')'; } } // est-ce vraiment utile (voir plus bas) } else { if($mail_exist) { $bad_dupli++; spiplistes_log('import dupli: '.$mail); } else { $bad_email++; spiplistes_log('import bad: '.$mail); } } } } // end for($jj = 0; $jj < $nb_new_entries; $jj++) // importer les nouveaux abonnés if(count($stack_new_auteurs)) { $sql_col_names = '('.implode(',', array_keys($stack_new_auteurs[0])).')'; $sql_col_values = ''; //syslog(LOG_NOTICE, 'memory_get_usage[5]: ' . memory_get_usage()); foreach($stack_new_auteurs as $auteur) { $values = array_map('sql_quote', $auteur); $sql_col_values .= '('.implode(',', $values).'),'; } $sql_col_values = rtrim($sql_col_values,','); $r = sql_insert('spip_auteurs', $sql_col_names, $sql_col_values); spiplistes_debug_log ('size of imported values: ' . strlen($sql_col_values)); //syslog(LOG_NOTICE, 'memory_get_usage[6]: ' . memory_get_usage()); // nouveaux abonnements foreach($abos_liste as $id_liste) { // un INSERT sans VALUES // @todo: vérifier compatibilite sqlite et pg if(sql_query( 'INSERT INTO spip_auteurs_listes (id_auteur,id_liste) SELECT a.id_auteur,'.$id_liste .' FROM spip_auteurs AS a WHERE a.statut='.sql_quote($tmp_statut)) === false ) { spiplistes_sqlerror_log('import nouveaux abos dans spip_auteurs_listes'); } } // format pour les nouveaux auteurs // un INSERT sans VALUES // @todo: vérifier compatibilite sqlite et pg if(sql_query( 'INSERT INTO spip_auteurs_elargis (id_auteur,`spip_listes_format`) SELECT a.id_auteur,'.sql_quote($format_abo) .' FROM spip_auteurs AS a WHERE a.statut='.sql_quote($tmp_statut)) === false ) { spiplistes_sqlerror_log('import nouveauxformats dans spip_auteurs_elargis'); } } // Comptes deja existants, inclus dans le fichier import // - changer son format de réception ? // - l'ajouter aux listes sélectionnées ? // - ou ignorer ? if(count($modifier_format)) { // pour l'instant: ignorer ! // } // redonner le bon statut visiteur aux nouveaux sql_update(array('spip_auteurs'), array('statut' => sql_quote('6forum')), array('statut='.sql_quote($tmp_statut))); // fin des req $result_affiche .= ($tt = ($ii = count($stack_new_auteurs)) + ($jj = count($modifier_format))) ? '<ul>'.PHP_EOL . '<li class="verdana2">'._T('spiplistes:nb_comptes_importees_en_ms_dont_' , array('nb' => $tt, 'ms' => (microtime(1) - $start_time))) . '<ul>'.PHP_EOL . '<li>'._T('spiplistes:nb_fiches_crees', array('nb' => $ii)).'</li>'.PHP_EOL //. '<li>'._T('spiplistes:nb_comptes_modifies', array('nb' => $jj)).'</li>'.PHP_EOL . '<li>'._T('spiplistes:nb_comptes_ignores', array('nb' => $jj)).'</li>'.PHP_EOL . '</ul>'.PHP_EOL . '</li>'.PHP_EOL . '</ul>'.PHP_EOL : '<br />'._T('spiplistes:pas_dimport').PHP_EOL ; if($bad_dupli) { $result_affiche .= '<br />'._T('pass_erreur').' email: '._T('spiplistes:n_duplicata_mail', array('n' => $bad_dupli)).PHP_EOL; } if($bad_email) { $result_affiche .= '<br />'._T('pass_erreur').' email: '._T('spiplistes:n_incorrect_mail', array('n' => $bad_email)).PHP_EOL; } $result_affiche = _T('spiplistes:fichier_') . ' : <strong>'.$realname.'</strong><br />'.PHP_EOL . _T('spiplistes:' . ((count($abos_liste) > 1) ? 'Listes_de_destination_s' : 'Liste_de_destination_s') , array('s' => '#' . implode(',#', $abos_liste))) .'<br />'.PHP_EOL . $result_affiche ; } return($result_affiche); }
function spiplistes_auteurs_auteur_valider ($id_auteur, $as_redact = false) { if($id_auteur = intval($id_auteur)) { if(($result = sql_update( "spip_auteurs_listes" , array('statut' => sql_quote('valide')) , "id_auteur=$id_auteur LIMIT 1" )) === false) { spiplistes_sqlerror_log("auteurs_auteur_valider"); } else { } } return($result); }
function spiplistes_listes_selectionner_elligibles ( $non_abonnes , $nb_non_abonnes , $id_liste , $tri , $script_action , $script_exec , $id_grosse_boite , $args_action = '' , $retour_ajax = false ) { static $bouton_id; $bouton_id++; $type_ajout = ($script_action == _SPIPLISTES_ACTION_MOD_GERER) ? "mod" : "abo"; // si retour de formulaire, les vars sont dans le $_POST $cherche_auteur = trim(urldecode(_request('cherche_auteur'))); $icone_loupe = trim(urldecode(_request('icone_loupe'))); if(empty($icone_loupe)) { // En ajax, find_in_path() ne trouve pas le chemin correct. // Oblige' de le noter au premier appel // et le transmettre dans le form. $icone_loupe = find_in_path('images/loupe.png'); } foreach(array('id_grosse_boite', 'script_exec', 'script_action') as $key) { if(empty($$key)) { $$key = urldecode(_request($key)); } } $select_abo = ""; $btn_ajouter = "" . "<span><input type='submit' value='"._T('bouton_ajouter')."' " . " onclick=\"return AjaxSqueeze(this.form, '$id_grosse_boite')\" " . " class='fondo' id='btn_ajouter_id_".$type_ajout."'/></span>\n" ; if(empty($args_action)) { $args_action = "id_liste=$id_liste"; } $action = generer_action_auteur($script_action, $args_action); $exec = generer_url_ecrire($script_exec, $args_action); // retour de formulaire ? if(!empty($cherche_auteur) && $id_liste) { $statut_liste = spiplistes_listes_liste_statut($id_liste); $nb_elligibles = 0; $sql_from = "spip_auteurs AS a"; $sql_where = array( "a.nom LIKE '%$cherche_auteur%'" , "LENGTH(a.email)" , "(statut=".sql_quote('0minirezo')." OR statut=".sql_quote('1comite') // si pas une liste privée, complète le where . (($statut_liste != _SPIPLISTES_LIST_PRIVATE) ? " OR statut=".sql_quote('6forum') : "") . ")" , "NOT EXISTS (SELECT NULL FROM spip_auteurs_listes AS l WHERE l.id_auteur = a.id_auteur AND l.id_liste = ".sql_quote($id_liste).")" ); /* * la requete ci-dessus en + clair *//* $sql_query = "SELECT id_auteur,nom,statut FROM spip_auteurs AS a WHERE nom LIKE '%$cherche_auteur%' AND LENGTH(a.email) AND (statut='0minirezo' OR statut='1comite' OR statut='6forum') AND NOT EXISTS (SELECT NULL FROM spip_auteurs_listes AS l WHERE l.id_auteur = a.id_auteur AND l.id_liste = $id_liste)"; */ // demande la liste des elligibles recherches $sql_result = sql_select("id_auteur,nom,statut", $sql_from, $sql_where, '', array('statut','nom')); if($sql_result) { $elligibles = array(); while($row = spip_fetch_array($sql_result)) { if(!isset($elligibles[$row['statut']])) { $elligibles[$row['statut']] = array(); } $elligibles[$row['statut']][$row['id_auteur']] = $row['nom']; $nb_elligibles++; } $select_abo = spiplistes_elligibles_select ($elligibles, $nb_elligibles, $type_ajout) . $btn_ajouter; } else { spiplistes_sqlerror_log("listes_selectionner_elligibles"); } } if(empty($select_abo) && ($nb_non_abonnes <= _SPIPLISTES_SELECT_MIN_AUTEURS)) { $select_abo = spiplistes_elligibles_select ($non_abonnes, $nb_non_abonnes, $type_ajout) . $btn_ajouter; } // au dela de _SPIPLISTES_SELECT_MIN_AUTEURS, afficher la boite de recherche. else { $select_abo = "" . "<div>" . "<label id='spiplistes_l_recherche'>" // en ajax, http_img_pack() ne retrouve pas son petit //. http_img_pack("loupe.png", _T('info_rechercher'), "width='26' height='20'") . "<img src='$icone_loupe' alt='"._T('info_rechercher')."' width='26' height='20' />" . "<input type='text' name='cherche_auteur' id='in_cherche_auteur' class='fondl' value='' size='20' style='margin:0 4px' />\n" . "</label>\n" . "<span><input type='submit' value='"._T('bouton_chercher')."' " . " id='btn_chercher_id' name='spiplistes_bouton_chercher'" // recherche ne rafraichit que ce formulaire . " onclick=\"return AjaxSqueeze(this.form, '"._SPIPLISTES_ID_FROM_ELLIGIBL."$bouton_id')\" " . " class='fondo' /></span>\n" . "</div>" . $select_abo ; } $result = "" // si retour ajax, ne pas ajouter le conteneur dans le conteneur ;-) . (($retour_ajax) ? "" : "<div id='"._SPIPLISTES_ID_FROM_ELLIGIBL."$bouton_id'>\n") . "<form style='margin:0px; border:0px' action='$action' method='post'>\n" . "<div id='boite_selection_elligibles_$bouton_id' style='padding:0;margin:0.5em 0 0'>\n" . $select_abo . "</div>\n" . "<input name='arg' type='hidden' value='$id_liste' />\n" . "<input name='action' type='hidden' value='".$script_action."' />\n" . "<input name='redirect' type='hidden' value='".$exec."' />\n" . "<input name='id_liste' type='hidden' value='$id_liste' />\n" . "<input name='tri' type='hidden' value='$tri' />\n" . "<input name='script_action' type='hidden' value='$script_action' />\n" . "<input name='script_exec' type='hidden' value='$script_exec' />\n" . "<input name='id_grosse_boite' type='hidden' value='$id_grosse_boite' />\n" . "<input name='icone_loupe' type='hidden' value='$icone_loupe' />\n" . "</form>\n" . (($retour_ajax) ? "" : "</div>\n") ; return($result); }