[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / referenceurs.php
1 <?php
2
3 if (!defined('_ECRIRE_INC_VERSION')) return;
4
5 //
6 // Afficher les referers d'un article (ou du site)
7 //
8
9 // http://doc.spip.org/@inc_referenceurs_dist
10 function inc_referenceurs_dist ($id_article, $select, $table, $where, $groupby, $limit, $serveur='') {
11
12 $nbvisites = $lescriteres = array();
13
14 $result = sql_select("maj, referer_md5, referer, $select AS vis", $table, $where, $groupby, "maj DESC", $limit,'',$serveur);
15 while ($row = sql_fetch($result,$serveur)) {
16 $referer = interdire_scripts($row['referer']);
17 $buff = stats_show_keywords($referer, $referer);
18
19 if ($buff["host"]) {
20 $numero = $buff["hostname"];
21 $visites = $row['vis'];
22 $referermd5 = $row['referer_md5'];
23 $lesreferermd5[$numero] = $referermd5;
24 $lesliens[$numero] = $referer;
25 $lesurls[$numero] = $buff["host"];
26 if (!isset($nbvisites[$numero]))
27 $nbvisites[$numero] = $visites;
28 else
29 $nbvisites[$numero] += $visites;
30 if (!isset($lesreferers[$numero]))
31 $lesreferers[$numero] = array();
32 if (!isset($lesliensracine[$numero]))
33 $lesliensracine[$numero]=0;
34
35 if (isset($buff["keywords"])
36 AND $c = $buff["keywords"]) {
37 if (!isset($lescriteres[$numero][$c])) {
38 $lescriteres[$numero][$c] = true;
39 $tmp= " &laquo;&nbsp;$c&nbsp;&raquo;";
40 } else $tmp = "";
41 } else {
42 $tmp = $buff["path"];
43 if ($buff["query"])
44 $tmp .= "?".$buff['query'];
45 if (strlen($tmp) > 18)
46 $tmp = "/".substr($tmp, 0, 15)."...";
47 else if (strlen($tmp) > 0)
48 $tmp = "/$tmp";
49 }
50 if ($tmp) {
51 $lesreferers[$numero][] = "<a href=\"".attribut_html($referer)."\">".quote_amp(urldecode($tmp))."</a>" . (($visites > 1)?" ($visites)":""). ($id_article ? '' : referes($referermd5));
52 } else $lesliensracine[$numero] += $visites;
53 }
54 }
55
56 if (!count($nbvisites)) return array();
57 arsort($nbvisites);
58 return referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls);
59 }
60
61 function referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls)
62 {
63 global $spip_lang_right, $source_vignettes;
64 $vign = ((strlen($source_vignettes) > 0) &&
65 $GLOBALS['meta']["activer_captures_referers"]!='non');
66 $aff = array();
67 foreach($nbvisites as $numero => $visites) {
68 if (!$numero) next;
69 $referermd5 = $lesreferermd5[$numero];
70 $bouton = $ret = "";
71
72 if ($vign)
73 $ret = "\n<a href=\"http://".$lesurls[$numero]."\"><img src=\"$source_vignettes".rawurlencode($lesurls[$numero])."\"\nstyle=\"float: $spip_lang_right; margin-bottom: 3px; margin-left: 3px;\" alt='' /></a>";
74
75 if ($visites > 5) $bouton .= "<span class='visites visites3'>$visites "._T('info_visites')."</span> ";
76 else if ($visites > 1) $bouton .= "<span class='visites visites2'>$visites "._T('info_visites')."</span> ";
77 else $bouton .= "<span class='visites visites1'>$visites "._T('info_visite')."</span> ";
78
79 if ($numero == "(email)") {
80 $ret .= $bouton . "<b>".$numero."</b>";
81 } else {
82 $n = count($lesreferers[$numero]);
83 if (($n > 1) || ($n > 0 && substr(supprimer_tags($lesreferers[$numero][0]),0,1) != '/')) {
84 $rac = $lesliensracine[$numero];
85 $bouton .= "<a href=\"http://".attribut_html($lesurls[$numero])."\" style='font-weight: bold;'>".$numero."</a>"
86 . (!$rac ? '': (" <span class='spip_x-small'>(" . $rac .")</span>"));
87 $ret .= bouton_block_depliable($bouton,false)
88 . debut_block_depliable(false)
89 . "\n<ul><li>"
90 . join ("</li><li>",$lesreferers[$numero])
91 . "</li></ul>"
92 . fin_block();
93 } else {
94 $ret .= $bouton;
95 $lien = $n ? $lesreferers[$numero][0] : '';
96 if (preg_match(",^(<a [^>]+>)([^ ]*)( \([0-9]+\))?,i", $lien, $regs)) {
97 $lien = quote_amp($regs[1]).$numero.$regs[2];
98 if (!strpos($lien, '</a>')) $lien .= '</a>';
99 } else
100 $lien = "<a href=\"http://".attribut_html($numero)."\">".$numero."</a>";
101 $ret .= "<b>".quote_amp($lien)."</b>"
102 . ($id_article ? '' : referes($referermd5));
103 }
104 }
105 $aff[]= $ret;
106 }
107 return $aff;
108 }
109
110 // Les deux fonctions suivantes sont adaptees du code des "Visiteurs",
111 // par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
112
113 // http://doc.spip.org/@stats_load_engines
114 function stats_load_engines() {
115 $arr_engines = Array();
116 lire_fichier(find_in_path('engines-list.txt'), $moteurs);
117 foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) {
118 $ligne = trim($ligne);
119 if (preg_match(',^\[([^][]*)\]$,S', $ligne, $regs)) {
120 $moteur = $regs[1];
121 $query = '';
122 } else if (preg_match(',=$,', $ligne, $regs))
123 $query = $ligne;
124 else
125 $arr_engines[] = array($moteur,$query,$ligne);
126 }
127 return $arr_engines;
128 }
129
130 // http://doc.spip.org/@stats_show_keywords
131 function stats_show_keywords($kw_referer, $kw_referer_host) {
132 static $arr_engines = '';
133 static $url_site;
134
135 if (!is_array($arr_engines)) {
136 // Charger les moteurs de recherche
137 $arr_engines = stats_load_engines();
138
139 // initialiser la recherche interne
140 $url_site = $GLOBALS['meta']['adresse_site'];
141 $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site));
142 }
143
144 if ($url = @parse_url( $kw_referer )) {
145 $query = isset($url['query'])?$url['query']:"";
146 $host = strtolower($url['host']);
147 $path = $url['path'];
148 } else $query = $host = $path ='';
149
150 // construire un array des variables directement depuis la query-string
151 parse_str($query, $Tquery);
152
153 $keywords = '';
154 $found = false;
155
156 if (!empty($url_site)) {
157 if (strpos('-'.$kw_referer, $url_site)!==false) {
158 if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs))
159 $keywords = urldecode($regs[2]);
160
161
162 else
163 return array('host' => '');
164 } else
165 for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++)
166 {
167 if ( $found = preg_match(','.$arr_engines[$cnt][2].',', $host)
168 OR $found = preg_match(','.$arr_engines[$cnt][2].',', $path))
169 {
170 $kw_referer_host = $arr_engines[$cnt][0];
171
172 if (strpos($arr_engines[$cnt][1],'=')!==false) {
173
174 // Fonctionnement simple: la variable existe dans l'array
175 $v = str_replace('=', '', $arr_engines[$cnt][1]);
176 $keywords = isset($Tquery[$v]) ? $Tquery[$v]: "";
177
178 // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
179 if (! strlen($keywords) > 0) {
180 if (preg_match(",".$arr_engines[$cnt][1]."([^\&]*),", $query, $vals)) {
181 $keywords = urldecode($vals[2]);
182 }
183 }
184 } else {
185 $keywords = "";
186 }
187
188 if (( ($kw_referer_host == "Google")
189 || ($kw_referer_host == "AOL" && strpos($query,'enc=iso')===false)
190 || ($kw_referer_host == "MSN")
191 )) {
192 include_spip('inc/charsets');
193 if (!isset($ie) OR !$cset = $ie) $cset = 'utf-8';
194 $keywords = importer_charset($keywords,$cset);
195 }
196 $buffer["hostname"] = $kw_referer_host;
197 }
198 }
199 }
200
201 $buffer["host"] = $host;
202 if (!isset($buffer["hostname"]) OR !$buffer["hostname"])
203 $buffer["hostname"] = $host;
204
205 $buffer["path"] = substr($path, 1, strlen($path));
206 $buffer["query"] = $query;
207
208 if ($keywords != '')
209 {
210 if (strlen($keywords) > 150) {
211 $keywords = spip_substr($keywords, 0, 148);
212 // supprimer l'eventuelle entite finale mal coupee
213 $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
214 }
215 $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
216 }
217
218 return $buffer;
219
220 }
221
222
223 //
224 // Recherche des articles pointes par le referer
225 //
226 // http://doc.spip.org/@referes
227 function referes($referermd5, $serveur='') {
228 $retarts = sql_allfetsel('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).", INTERVAL 2 DAY))", '', "titre",'','',$serveur);
229
230 foreach ($retarts as $k => $rowart) {
231 $titre = typo($rowart['titre']);
232 $url = generer_url_entite($rowart['id_article'], 'article');
233 $retarts[$k] = "<a href='$url'><i>$titre</i></a>";
234 }
235
236 if (count($retarts) > 1)
237 return '<br />&rarr; '.join(',<br />&rarr; ',$retarts);
238 if (count($retarts) == 1)
239 return '<br />&rarr; '. array_shift($retarts);
240 return '';
241 }
242
243
244 ?>