1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
statistic.php
См. документацию.
1<?php
2
4{
5 var $phrase_id = 0;
6
7 var $_phrase = false;
8 var $_tags = false;
9 var $_session_id = '';
10 var $_stat_sess_id = false;
11
12 function __construct($phrase = '', $tags = '')
13 {
14 $phrase = mb_strtolower(trim($phrase, " \t\n\r"));
15 if ($l = mb_strlen($phrase))
16 {
17 if ($l > 250)
18 {
19 $p = mb_strrpos($phrase, ' ');
20 if ($p === false)
21 {
22 $this->_phrase = mb_substr($phrase, 0, 250);
23 }
24 else
25 {
26 $this->_phrase = mb_substr($phrase, 0, $p);
27 }
28 }
29 else
30 {
31 $this->_phrase = $phrase;
32 }
33 }
34 else
35 {
36 $this->_phrase = false;
37 }
38
39 $arTags = tags_prepare($tags);
40 if (count($arTags))
41 {
42 asort($arTags);
43 $this->_tags = implode(', ', $arTags);
44 }
45 else
46 {
47 $this->_tags = false;
48 }
49
50 $this->_session_id = bitrix_sessid();
51
52 if (isset($_SESSION['SESS_SESSION_ID']))
53 {
54 $this->_stat_sess_id = intval($_SESSION['SESS_SESSION_ID']);
55 }
56 }
57
58 function PhraseStat($result_count = 0, $page_num = 0)
59 {
60 $DB = CDatabase::GetModuleConnection('search');
61 $DB->StartUsingMasterOnly();
62
63 $result_count = intval($result_count);
64 $page_num = intval($page_num);
65
66 $strSql = "
67 SELECT *
68 FROM b_search_phrase
69 WHERE SESSION_ID = '" . $DB->ForSQL($this->_session_id) . "'
70 AND " . ($this->_phrase === false ? 'PHRASE IS NULL' : "PHRASE = '" . $DB->ForSQL($this->_phrase) . "'") . '
71 AND ' . ($this->_tags === false ? 'TAGS IS NULL' : "TAGS = '" . $DB->ForSQL($this->_tags) . "'") . '
72 ';
73 $rs = $DB->Query($strSql);
74 if ($ar = $rs->Fetch())
75 {
76 $this->phrase_id = $ar['ID'];
77 if ($page_num > $ar['PAGES'])
78 {
79 $DB->Query('UPDATE b_search_phrase SET PAGES = ' . $page_num . ' WHERE ID = ' . $ar['ID']);
80 }
81 }
82 else
83 {
84 $this->phrase_id = $DB->Add('b_search_phrase',
85 [
86 '~TIMESTAMP_X' => $DB->CurrentTimeFunction(),
87 'SITE_ID' => SITE_ID,
88 '~RESULT_COUNT' => $result_count,
89 '~PAGES' => $page_num,
90 'SESSION_ID' => $this->_session_id,
91 'PHRASE' => $this->_phrase,
92 'TAGS' => $this->_tags,
93 'STAT_SESS_ID' => $this->_stat_sess_id,
94 ]
95 );
96 }
97 $DB->StopUsingMasterOnly();
98 }
99
100 public static function GetList($arOrder = false, $arFilter = false, $arSelect = false, $bGroup = false)
101 {
102 $DB = CDatabase::GetModuleConnection('search');
103
104 static $arDefSelect = [
105 'ID',
106 'TIMESTAMP_X',
107 'SITE_ID',
108 'RESULT_COUNT',
109 'PAGES',
110 'PHRASE',
111 'TAGS',
112 'URL_TO',
113 'URL_TO_404',
114 'URL_TO_SITE_ID',
115 'STAT_SESS_ID',
116 ];
117
118 if (!is_array($arSelect))
119 {
120 $arSelect = [];
121 }
122 if (count($arSelect) < 1)
123 {
124 $arSelect = $arDefSelect;
125 }
126
127 if (!is_array($arOrder))
128 {
129 $arOrder = [];
130 }
131 if (count($arOrder) < 1)
132 {
133 $arOrder = [
134 'ID' => 'DESC',
135 ];
136 }
137
138 $arQueryOrder = [];
139 foreach ($arOrder as $strColumn => $strDirection)
140 {
141 $strColumn = mb_strtoupper($strColumn);
142 $strDirection = mb_strtoupper($strDirection) == 'ASC' ? 'ASC' : 'DESC';
143 if (in_array($strColumn, $arDefSelect))
144 {
145 $arSelect[] = $strColumn;
146 if ($strColumn == 'TIMESTAMP_X')
147 {
148 $arQueryOrder[$strColumn] = 'TMP_TS ' . $strDirection;
149 }
150 else
151 {
152 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
153 }
154 }
155 elseif ($strColumn == 'COUNT' && $bGroup)
156 {
157 $arSelect[] = $strColumn;
158 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
159 }
160 }
161
162 $arQueryGroup = [];
163 $arQuerySelect = [];
164 foreach ($arSelect as $strColumn)
165 {
166 $strColumn = mb_strtoupper($strColumn);
167 if (in_array($strColumn, $arDefSelect))
168 {
169 if ($strColumn == 'TIMESTAMP_X')
170 {
171 $arQuerySelect['TMP_TS'] = 'sph.' . $strColumn . ' TMP_TS';
172 $arQuerySelect[$strColumn] = $DB->DateToCharFunction('sph.' . $strColumn, 'FULL') . ' ' . $strColumn;
173 }
174 else
175 {
176 $arQuerySelect[$strColumn] = 'sph.' . $strColumn;
177 }
178
179 if ($bGroup)
180 {
181 $arQueryGroup[$strColumn] = 'sph.' . $strColumn;
182 }
183 }
184 elseif ($strColumn == 'COUNT' && $bGroup)
185 {
186 $arQuerySelect[$strColumn] = 'count(*) ' . $strColumn;
187 }
188 }
189
190 $obQueryWhere = new CSQLWhere;
191 $obQueryWhere->SetFields([
192 'ID' => [
193 'TABLE_ALIAS' => 'sph',
194 'FIELD_NAME' => 'sph.ID',
195 'FIELD_TYPE' => 'int', //int, double, file, enum, int, string, date, datetime
196 'JOIN' => false,
197 ],
198 'PHRASE' => [
199 'TABLE_ALIAS' => 'sph',
200 'FIELD_NAME' => 'sph.PHRASE',
201 'FIELD_TYPE' => 'string',
202 'JOIN' => false,
203 ],
204 'TAGS' => [
205 'TABLE_ALIAS' => 'sph',
206 'FIELD_NAME' => 'sph.TAGS',
207 'FIELD_TYPE' => 'string',
208 'JOIN' => false,
209 ],
210 'TIMESTAMP_X' => [
211 'TABLE_ALIAS' => 'sph',
212 'FIELD_NAME' => 'sph.TIMESTAMP_X',
213 'FIELD_TYPE' => 'datetime',
214 'JOIN' => false,
215 ],
216 'SITE_ID' => [
217 'TABLE_ALIAS' => 'sph',
218 'FIELD_NAME' => 'sph.SITE_ID',
219 'FIELD_TYPE' => 'string',
220 'JOIN' => false,
221 ],
222 'URL_TO' => [
223 'TABLE_ALIAS' => 'sph',
224 'FIELD_NAME' => 'sph.URL_TO',
225 'FIELD_TYPE' => 'string',
226 'JOIN' => false,
227 ],
228 'URL_TO_404' => [
229 'TABLE_ALIAS' => 'sph',
230 'FIELD_NAME' => 'sph.URL_TO_404',
231 'FIELD_TYPE' => 'string',
232 'JOIN' => false,
233 ],
234 'STAT_SESS_ID' => [
235 'TABLE_ALIAS' => 'sph',
236 'FIELD_NAME' => 'sph.STAT_SESS_ID',
237 'FIELD_TYPE' => 'int',
238 'JOIN' => false,
239 ],
240 'RESULT_COUNT' => [
241 'TABLE_ALIAS' => 'sph',
242 'FIELD_NAME' => 'sph.RESULT_COUNT',
243 'FIELD_TYPE' => 'int',
244 'JOIN' => false,
245 ],
246 ]);
247
248 if (count($arQuerySelect) < 1)
249 {
250 $arQuerySelect = ['ID' => 'sph.ID'];
251 }
252
253 $strSql = '
254 SELECT
255 ' . implode(', ', $arQuerySelect) . '
256 FROM
257 b_search_phrase sph
258 ';
259
260 if (!is_array($arFilter))
261 {
262 $arFilter = [];
263 }
264 if ($strQueryWhere = $obQueryWhere->GetQuery($arFilter))
265 {
266 $strSql .= '
267 WHERE
268 ' . $strQueryWhere . '
269 ';
270 }
271
272 if ($bGroup && count($arQueryGroup) > 0)
273 {
274 $strSql .= '
275 GROUP BY
276 ' . implode(', ', $arQueryGroup) . '
277 ';
278 }
279
280 if (count($arQueryOrder) > 0)
281 {
282 $strSql .= '
283 ORDER BY
284 ' . implode(', ', $arQueryOrder) . '
285 ';
286 }
287
288 return $DB->Query($strSql);
289 }
290
291 public static function CleanUpAgent()
292 {
293 $DB = CDatabase::GetModuleConnection('search');
294 $cleanup_days = COption::GetOptionInt('search', 'stat_phrase_save_days');
295 if ($cleanup_days > 0)
296 {
297 $arDate = localtime(time());
298 $date = mktime(0, 0, 0, $arDate[4] + 1, $arDate[3] - $cleanup_days, 1900 + $arDate[5]);
299 $DB->Query('DELETE FROM b_search_phrase WHERE TIMESTAMP_X <= ' . $DB->CharToDateFunction(ConvertTimeStamp($date, 'FULL')));
300 }
301 return 'CSearchStatistic::CleanUpAgent();';
302 }
303
304 public static function IsActive()
305 {
306 $bActive = false;
307 foreach (GetModuleEvents('main', 'OnEpilog', true) as $arEvent)
308 {
309 if (
310 $arEvent['TO_MODULE_ID'] == 'search'
311 && $arEvent['TO_CLASS'] == 'CSearchStatistic'
312 )
313 {
314 $bActive = true;
315 break;
316 }
317 }
318 return $bActive;
319 }
320
321 public static function SetActive($bActive = false)
322 {
323 if ($bActive)
324 {
326 {
327 RegisterModuleDependences('main', 'OnEpilog', 'search', 'CSearchStatistic', 'OnEpilog', '90');
328 }
329 }
330 else
331 {
333 {
334 UnRegisterModuleDependences('main', 'OnEpilog', 'search', 'CSearchStatistic', 'OnEpilog');
335 }
336 }
337 }
338
339 public static function GetCurrentURL()
340 {
341 $res = (CMain::IsHTTPS() ? 'https' : 'http') . '://';
342
343 $host = $_SERVER['HTTP_HOST'];
344 $res .= $host;
345
346 $port = intval($_SERVER['SERVER_PORT']);
347 if ($port > 0 && $port != 80 && $port != 443 && mb_strpos($host, ':') === false)
348 {
349 $res .= ':' . $port;
350 }
351
352 $url = preg_replace('/\\?sphrase_id=\\d+&/', '?', $_SERVER['REQUEST_URI']);
353 $url = preg_replace('/\\?sphrase_id=\\d+/', '', $url);
354 $url = preg_replace('/&sphrase_id=\\d+/', '', $url);
355
356 $res .= $url;
357
358 return $res;
359 }
360
361 public static function OnEpilog()
362 {
363 if (isset($_REQUEST['sphrase_id']))
364 {
365 $phrase_id = intval($_REQUEST['sphrase_id']);
366 if ($phrase_id)
367 {
368 $DB = CDatabase::GetModuleConnection('search');
369 $DB->StartUsingMasterOnly();
370 $rs = $DB->Query('
371 SELECT *
372 FROM b_search_phrase
373 WHERE ID = ' . $phrase_id . "
374 AND SESSION_ID = '" . $DB->ForSQL(bitrix_sessid()) . "'
375 AND URL_TO IS NULL
376 ");
377 if ($ar = $rs->Fetch())
378 {
379 $URL_TO = $DB->ForSQL(CSearchStatistic::GetCurrentURL(), 2000);
380 $DB->Query("
381 UPDATE b_search_phrase
382 SET URL_TO = '" . $URL_TO . "'
383 ,URL_TO_404 = '" . (defined('ERROR_404') ? 'Y' : 'N') . "'
384 ,URL_TO_SITE_ID = " . (defined('SITE_ID') ? "'" . $DB->ForSQL(SITE_ID, 2) . "'" : 'null') . '
385 WHERE ID = ' . $phrase_id . '
386 ');
387 }
388 $DB->StopUsingMasterOnly();
389 }
390 }
391 }
392}
SetFields($arFields)
Определения sqlwhere.php:239
Определения sqlwhere.php:1359
Определения statistic.php:4
static GetCurrentURL()
Определения statistic.php:339
$phrase_id
Определения statistic.php:5
static GetList($arOrder=false, $arFilter=false, $arSelect=false, $bGroup=false)
Определения statistic.php:100
static IsActive()
Определения statistic.php:304
static OnEpilog()
Определения statistic.php:361
__construct($phrase='', $tags='')
Определения statistic.php:12
$_tags
Определения statistic.php:8
$_session_id
Определения statistic.php:9
$_stat_sess_id
Определения statistic.php:10
static CleanUpAgent()
Определения statistic.php:291
static SetActive($bActive=false)
Определения statistic.php:321
PhraseStat($result_count=0, $page_num=0)
Определения statistic.php:58
$_phrase
Определения statistic.php:7
$res
Определения filter_act.php:7
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$p
Определения group_list_element_edit.php:23
$host
Определения .description.php:9
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$l
Определения options.php:783
bitrix_sessid()
Определения tools.php:4656
RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5295
UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5289
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
tags_prepare($sText, $site_id=false)
Определения tags.php:4
const SITE_ID
Определения sonet_set_content_view.php:12
$rs
Определения action.php:82
$arFilter
Определения user_search.php:106
$url
Определения iframe.php:7