source: spip-zone/_plugins_/spip-listes/trunk/exec/spiplistes_abonnes_tous.php @ 84132

Last change on this file since 84132 was 84132, checked in by arthemis78@…, 6 years ago
  • Correction de bugs : recherches abonnées
  • Correction ergonomie : modification du css + affichage (mode verbeux)
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 16.5 KB
Line 
1<?php
2/**
3 * @package spiplistes
4 */
5 // $LastChangedRevision: 84132 $
6 // $LastChangedBy: arthemis78@free.fr $
7 // $LastChangedDate: 2014-08-10 16:09:53 +0000 (Sun, 10 Aug 2014) $
8 
9/******************************************************************************************/
10/* SPIP-Listes est un systeme de gestion de listes d'abonnes et d'envoi d'information     */
11/* par email pour SPIP. http://bloog.net/spip-listes                                      */
12/* Copyright (C) 2004 Vincent CARON  v.caron<at>laposte.net                               */
13/*                                                                                        */
14/* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes */
15/* de la Licence Publique Generale GNU publiee par la Free Software Foundation            */
16/* (version 2).                                                                           */
17/*                                                                                        */
18/* Ce programme est distribue car potentiellement utile, mais SANS AUCUNE GARANTIE,       */
19/* ni explicite ni implicite, y compris les garanties de commercialisation ou             */
20/* d'adaptation dans un but specifique. Reportez-vous a la Licence Publique Generale GNU  */
21/* pour plus de details.                                                                  */
22/*                                                                                        */
23/* Vous devez avoir recu une copie de la Licence Publique Generale GNU                    */
24/* en meme temps que ce programme ; si ce n'est pas le cas, ecrivez a la                  */
25/* Free Software Foundation,                                                              */
26/* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, Etats-Unis.                   */
27/******************************************************************************************/
28
29if (!defined('_ECRIRE_INC_VERSION')) return;
30
31include_spip('inc/spiplistes_api_globales');
32include_spip('inc/spiplistes_listes_selectionner_auteur');
33
34function exec_spiplistes_abonnes_tous () {
35
36        include_spip('inc/presentation');
37        include_spip('inc/mots');
38        include_spip('inc/spiplistes_api');
39        include_spip('inc/spiplistes_api_presentation');
40
41        global $connect_statut
42                , $connect_toutes_rubriques
43                , $connect_id_auteur
44                ;
45
46        $flag_autorise = ($connect_statut == '0minirezo');
47       
48        if($flag_autorise) {
49       
50                $total_auteurs_elligibles = spiplistes_auteurs_elligibles_compter();
51               
52                //Total des auteurs qui ne sont pas abonnes a une liste
53                $nb_abonnes_a_rien = spiplistes_auteurs_non_abonnes_compter();
54
55                //evaluer les formats de tous les auteurs + compter tous les auteurs
56                $sql_result = sql_select(
57                        "`spip_listes_format` AS format, COUNT(`spip_listes_format`) AS nb"
58                        , 'spip_auteurs_elargis', '', "`spip_listes_format`"
59                );
60                //repartition des formats
61                $total_abonnes_format = 0;
62                $nb_abonnes_par_format = array(
63                        'texte' => 0    // abonnés au format texte
64                        , 'html' => 0   // au format html
65                        , 'non' => 0    // qui a été désabonné
66                        );
67                while($row = sql_fetch($sql_result)) {
68                        $nb_abonnes_par_format[$row['format']] = $row['nb'];
69                        $total_abonnes_format += $row['nb'];
70                }
71       
72                //Compter tous les abonnes a des listes
73                $sql_result = sql_select(
74                        "listes.statut AS statut, COUNT(abonnements.id_auteur) AS nb"
75                        , "spip_listes AS listes LEFT JOIN spip_auteurs_listes AS abonnements USING (id_liste)"
76                        , "", "listes.statut"
77                );
78                // etablit l'inventaire des listes
79                // tries pas statut de la liste
80                $nb_abonnes_listes = array();
81                while ($row = sql_fetch($sql_result)) {
82                        $nb_abonnes_listes[$row['statut']] = intval($row['nb']);
83                }
84        }
85       
86////////////////////////////////////
87// PAGE CONTENU
88////////////////////////////////////
89
90        $titre_page = _T('spiplistes:suivi');
91        // Permet entre autres d'ajouter les classes a' la page : <body class='$rubrique $sous_rubrique'>
92        $rubrique = _SPIPLISTES_PREFIX;
93        $sous_rubrique = 'abonnes_tous';
94
95        $commencer_page = charger_fonction('commencer_page', 'inc');
96        echo($commencer_page( _T('spiplistes:spiplistes') . " - " . $titre_page, $rubrique, $sous_rubrique));
97       
98        // la gestion des abonnés est réservée aux admins
99        if(!$flag_autorise) {
100                die (spiplistes_terminer_page_non_autorisee() . fin_page());
101        }
102       
103        $page_result = ''
104                . '<br class="debut-page" />'.PHP_EOL
105                . spiplistes_gros_titre($titre_page, '', true)
106                . barre_onglets($rubrique, $sous_rubrique)
107                . debut_gauche($rubrique, true)
108                ;
109
110        // formulaire de recherche
111        if ($total_auteurs_elligibles > 1) {
112                $page_result .= ""
113                        . debut_cadre_relief("contact_loupe-24.png", true, "", _T('spiplistes:chercher_un_auteur'))
114                        . "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_ABONNES_LISTE)."' method='post' class='verdana2'>"
115                        . "<div style='text-align:center'>\n"
116                        . "<input type='text' name='cherche_auteur' class='fondl' value='' size='20' />"
117                        . "<div style='text-align:right;margin-top:0.5em;'><input type='submit' name='Chercher' value='"._T('bouton_chercher')."' class='fondo' /></div>"
118                        . "</div></form>"
119                        . fin_cadre_relief(true)
120                        ;
121        }
122
123        $page_result .= ""
124                . pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
125                //. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
126                . spiplistes_boite_raccourcis(true)
127                . spiplistes_boite_autocron()
128                . spiplistes_boite_info_spiplistes(true)
129                . pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
130                . debut_droite($rubrique, true)
131                // boite résultat Recherche d'auteur
132                . spiplistes_cherche_auteur()
133                ;
134       
135        // première boite des stats
136        $page_result .= ''
137                . debut_cadre_trait_couleur('forum-interne-24.gif', true)
138                . spiplistes_titre_boite_info(_T('spiplistes:abonnes_titre'))
139                . '<div class="verdana2" style="position:relative;margin:1ex;height:14em">'
140                // bloc de gauche. Répartition des abonnés.
141                . '<div style="position:absolute;top:0;left:0;width:250px" id="info_abo">'
142                . PHP_EOL
143                . '<p style="margin:0;">'._T('spiplistes:repartition_abonnes').' : </p>'
144                . PHP_EOL
145                . '<ul style="margin:0;padding:0 1ex;list-style:none">' . PHP_EOL
146
147                // Total des abonnés listes privées (internes)
148                . '<li>- '._T('spiplistes:listes_diffusion_prive') . ': '
149                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIVATE])
150                        . '</li>' . PHP_EOL
151                // Total des abonnés listes périodiques (hebdomadaires)
152                . '<li>- '. _T('spiplistes:listes_diffusion_hebdo') . ': '
153                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_HEBDO] 
154                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_WEEKLY])
155                        . '</li>' . PHP_EOL
156                // privees hebdo
157                . '<li>- '. _T('spiplistes:listes_privees_hebdo') . ': '
158                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_HEBDO] 
159                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_WEEKLY])
160                        . '</li>' . PHP_EOL
161                // Total des abonnés listes périodiques (mensuels)
162                . '<li>- '. _T('spiplistes:listes_diffusion_mensuelle') . ': '
163                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_MENSUEL] 
164                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_MONTHLY])
165                        . '</li>' . PHP_EOL
166                // privees mensuelles
167                . '<li>- '. _T('spiplistes:listes_privees_mensuelle') . ': '
168                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_MENSUEL] 
169                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_MONTHLY])
170                        . '</li>' . PHP_EOL
171                // Total des abonnés listes périodiques (annuelles)
172                . '<li>- '. _T('spiplistes:listes_diffusion_annuelle') . ': '
173                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_YEARLY])
174                        . '</li>' . PHP_EOL
175                // privees annuelles
176                . '<li>- '. _T('spiplistes:listes_privees_annuelle') . ': '
177                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_YEARLY])
178                        . '</li>' . PHP_EOL
179                // Total des abonnés listes périodiques (periode ou envoi manuel)
180                . '<li>- '. _T('spiplistes:listes_autre_periode') . ': '
181                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PUBLIC] 
182                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PUB_DAILY])
183                        . '</li>' . PHP_EOL
184                // privees quotidiennes
185                . '<li>- '. _T('spiplistes:listes_privees_autre_periode') . ': '
186                        . (0 + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIVATE] 
187                                + $nb_abonnes_listes[_SPIPLISTES_LIST_PRIV_DAILY])
188                        . '</li>' . PHP_EOL
189                // Total des non abonnés
190                . '<li>- '. _T('spiplistes:abonne_aucune_liste') . ': '.$nb_abonnes_a_rien
191                        . '</li>' . PHP_EOL
192                . '</ul>' . PHP_EOL
193                . '</div>' . PHP_EOL
194
195                // bloc de droite. Répartition des formats.
196                . "<div style='position:absolute;top:0;right:0;width:180px;' id='info_fmt'>\n"
197                . "<p style='margin:0;'>"._T('spiplistes:repartition_formats')." : </p>\n"
198                . "<ul style='margin:0;padding:0 1ex;list-style: none;'>"
199                . "<li>- "._T('spiplistes:html')." : {$nb_abonnes_par_format['html']}</li>"
200                . "<li>- "._T('spiplistes:texte')." : {$nb_abonnes_par_format['texte']}</li>"
201                . "<li>- "._T('spiplistes:format_aucun')." : {$nb_abonnes_par_format['non']}</li>"
202                . "</ul>"
203                . "</div>\n"
204                // fin des infos
205                . "</div>\n"
206                ;
207
208
209        $page_result .= ""
210                . fin_cadre_trait_couleur(true)
211                ;
212               
213        ////////////////////////////
214        // Liste des auteurs
215       
216        $tri = _request('tri') ? _request('tri') : 'nom';
217
218        $id_boite_dest_ajax = 'auteurs';
219       
220        $page_result .= 
221                debut_cadre_relief('redacteurs-24.gif', true)
222                . "<div id='$id_boite_dest_ajax'>\n"
223                //. spiplistes_listes_boite_abonnes(0, $tri, $debut, _SPIPLISTES_EXEC_ABONNES_LISTE, $id_boite_dest_ajax)
224                . spiplistes_listes_boite_abonnements(
225                        0, false, $tri, $debut, _SPIPLISTES_EXEC_ABONNES_LISTE
226                        )
227                . "</div>\n"
228                . fin_cadre_relief(true)
229                ;
230        echo($page_result);
231
232        echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
233                , spiplistes_html_signature(_SPIPLISTES_PREFIX)
234                , fin_gauche(), fin_page();
235}
236
237
238
239/*
240 * @return string boite de selection des auteurs trouves
241 */
242function spiplistes_cherche_auteur () {
243        if (!$cherche_auteur = _request('cherche_auteur')) return;
244       
245        $col = strpos($cherche_auteur, '@') !== false ? 'email' : 'nom';
246        $like = '';
247        if (strpos($cherche_auteur, '%') !== false) {
248                $like = " WHERE $col LIKE '" . $cherche_auteur . "'";
249                $cherche_auteur = str_replace('%', ' ', $cherche_auteur);
250        }
251       
252        $sql_result = sql_select("id_auteur,$col", "spip_auteurs", $like);
253       
254        while($row = sql_fetch($sql_result)) {
255                $table_auteurs[] = $row[$col];
256                $table_ids[] = $row['id_auteur'];
257        }
258       
259        $resultat = mots_ressemblants($cherche_auteur, $table_auteurs, $table_ids);
260
261        $result = ""
262                . "<div id='boite-result-chercher-auteur'>"
263                . debut_boite_info(true)
264                ;
265        if (!$resultat) {
266                $result .= ""
267                        . "<strong>"._T('texte_aucun_resultat_auteur', array('cherche_auteur' => $cherche_auteur)).".</strong><br />\n"
268                        ;
269        }
270        else if (count($resultat) == 1) {
271                list(, $nouv_auteur) = each($resultat);
272                $result .= ""
273                        . "<strong>"._T('spiplistes:une_inscription')."</strong>:<br />\n"
274                        . "<ul>"
275                        ;
276                $sql_result = sql_select("id_auteur,nom,email,bio", "spip_auteurs", "id_auteur=".sql_quote($nouv_auteur), '', '', 1);
277                while ($row = sql_fetch($sql_result)) {
278                        $id_auteur = $row['id_auteur'];
279                        $nom_auteur = $row['nom'];
280                        $email_auteur = $row['email'];
281                        $bio_auteur = $row['bio'];
282
283                        $result .= ""
284                                . "<li class='auteur'>"
285                                        . "<a class='nom_auteur' href=\"".generer_url_ecrire(_SPIPLISTES_EXEC_ABONNE_EDIT, "id_auteur=$id_auteur")."\">".typo($nom_auteur)."</a>"
286                                . " | $email_auteur"
287                                . "</li>\n"
288                                ;
289                }
290                $result .= ""
291                        . "</ul>\n"
292                        ;
293        }
294        else if (count($resultat) < 16) {
295                reset($resultat);
296                unset($les_auteurs);
297                while (list(, $id_auteur) = each($resultat)) {
298                        $les_auteurs[] = $id_auteur;
299                }
300                if($les_auteurs) {
301                        $les_auteurs = join(',', $les_auteurs);
302                        $result .= ""
303                                . "<strong>"._T('texte_plusieurs_articles', array('cherche_auteur' => $cherche_auteur))."</strong><br />"
304                                . "<ul>"
305                                ;
306                        $sql_select = array('id_auteur','nom','email','bio');
307                        $sql_result = sql_select($sql_select, "spip_auteurs", "id_auteur IN ($les_auteurs)", '', array('nom'));
308                        while ($row = sql_fetch($sql_result)) {
309                                $id_auteur = $row['id_auteur'];
310                                $nom_auteur = $row['nom'];
311                                $email_auteur = $row['email'];
312                                $bio_auteur = $row['bio'];
313                               
314                                $result .= ""
315                                        . "<li class='auteur'><span class='nom_auteur'>".typo($nom_auteur)."</span>"
316                                        ;
317                                if ($email_auteur) {
318                                        $result .= ""
319                                                . " ($email_auteur)"
320                                                ;
321                                }
322                                $result .= ""
323                                        . " | <a href=\"".generer_url_ecrire(_SPIPLISTES_EXEC_ABONNE_EDIT,"id_auteur=$id_auteur")."\">"
324                                        . _T('spiplistes:choisir')."</a>"
325                                        ;
326                                if (trim($bio_auteur)) {
327                                        $result .= ""
328                                                . "<br /><font size=1>".couper(propre($bio_auteur), 100)."</font>\n"
329                                                ;
330                                }
331                                $result .= ""
332                                        . "</li>\n"
333                                        ;
334                        }
335                        $result .= ""
336                                . "</ul>\n"
337                                ;
338                }
339        }
340        else {
341                $result .= ""
342                        . "<strong>"._T('texte_trop_resultats_auteurs', array('cherche_auteur' => $cherche_auteur))."</strong><br />"
343                        ;
344        }
345       
346        $result .= ""
347                . fin_boite_info(true)
348                . "</div>"
349                ;
350
351        return($result);
352} // end spiplistes_cherche_auteur()
353
354function mots_ressemblants($mot, $table_mots, $table_ids='') {
355
356        $result = array();
357
358        if (!$table_mots) return $result;
359
360        $lim = 2;
361        $nb = 0;
362        $opt = 1000000;
363        $mot_opt = '';
364        $mot = reduire_mot($mot);
365        $len = strlen($mot);
366
367        while (!$nb AND $lim < 10) {
368                reset($table_mots);
369                if ($table_ids) reset($table_ids);
370                while (list(, $val) = each($table_mots)) {
371                        if ($table_ids) list(, $id) = each($table_ids);
372                        else $id = $val;
373                        $val2 = trim($val);
374                        if ($val2) {
375                                if (!isset($distance[$id])) {
376                                        $val2 = reduire_mot($val2);
377                                        $len2 = strlen($val2);
378                                        if ($val2 == $mot)
379                                                $m = -2; # resultat exact
380                                        else if (substr($val2, 0, $len) == $mot)
381                                                $m = -1; # sous-chaine
382                                        else {
383                                                # distance
384                                                $m = levenshtein255($val2, $mot);
385                                                # ne pas compter la distance due a la longueur
386                                                $m -= max(0, $len2 - $len);
387                                        }
388                                        $distance[$id] = $m;
389                                } else $m = 0;
390                                if ($m <= $lim) {
391                                        $selection[$id] = $m;
392                                        if ($m < $opt) {
393                                                $opt = $m;
394                                                $mot_opt = $val;
395                                        }
396                                        $nb++;
397                                }
398                        }
399                }
400                $lim += 2;
401        }
402
403        if (!$nb) return $result;
404        reset($selection);
405        if ($opt > -1) {
406                $moy = 1;
407                while(list(, $val) = each($selection)) $moy *= $val;
408                if($moy) $moy = pow($moy, 1.0/$nb);
409                $lim = ($opt + $moy) / 2;
410        }
411        else $lim = -1;
412
413        reset($selection);
414        while (list($key, $val) = each($selection)) {
415                if ($val <= $lim) {
416                        $result[] = $key;
417                }
418        }
419        return $result;
420}
421
422// reduit un mot a sa valeur translitteree et en minuscules
423function reduire_mot($mot) {
424        return strtr(
425                        translitteration(trim($mot)),
426                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
427                        'abcdefghijklmnopqrstuvwxyz'
428        );
429}
430
431// ne pas faire d'erreur si les chaines sont > 254 caracteres
432function levenshtein255 ($a, $b) {
433        $a = substr($a, 0, 254);
434        $b = substr($b, 0, 254);
435        return @levenshtein($a,$b);
436}
437
438/******************************************************************************************/
439/* SPIP-Listes est un systeme de gestion de listes d'abonnes et d'envoi d'information     */
440/* par email pour SPIP. http://bloog.net/spip-listes                                      */
441/* Copyright (C) 2004 Vincent CARON  v.caron<at>laposte.net                               */
442/*                                                                                        */
443/* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes */
444/* de la Licence Publique Generale GNU publiee par la Free Software Foundation            */
445/* (version 2).                                                                           */
446/*                                                                                        */
447/* Ce programme est distribue car potentiellement utile, mais SANS AUCUNE GARANTIE,       */
448/* ni explicite ni implicite, y compris les garanties de commercialisation ou             */
449/* d'adaptation dans un but specifique. Reportez-vous a la Licence Publique Generale GNU  */
450/* pour plus de details.                                                                  */
451/*                                                                                        */
452/* Vous devez avoir recu une copie de la Licence Publique Generale GNU                    */
453/* en meme temps que ce programme ; si ce n'est pas le cas, ecrivez a la                  */
454/* Free Software Foundation,                                                              */
455/* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, Etats-Unis.                   */
456/******************************************************************************************/
Note: See TracBrowser for help on using the repository browser.