1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
sitemap.php
См. документацию.
1<?php
3
4class CAllSiteMap extends CDBResult
5{
6 var $m_href = ''; //URL for result
7 var $m_error = ''; //Error message
8 var $m_events = []; //Events cache
9 var $m_errors_count = 0; //Number of wrong URLs
10 var $m_errors_href = ''; //URL for errors file
11
13 {
14 @set_time_limit(0);
15 if (!is_array($NS))
16 {
17 $NS = [
18 'ID' => 0,
19 'CNT' => 0,
20 'FILE_SIZE' => 0,
21 'FILE_ID' => 1,
22 'FILE_URL_CNT' => 0,
23 'ERROR_CNT' => 0,
24 'PARAM2' => 0,
25 ];
26 }
27 else
28 {
29 $NS = [
30 'ID' => intval($NS['ID']),
31 'CNT' => intval($NS['CNT']),
32 'FILE_SIZE' => intval($NS['FILE_SIZE']),
33 'FILE_ID' => intval($NS['FILE_ID']),
34 'FILE_URL_CNT' => intval($NS['FILE_URL_CNT']),
35 'ERROR_CNT' => intval($NS['ERROR_CNT']),
36 'PARAM2' => intval($NS['ID']),
37 ];
38 }
39
40 if (is_array($max_execution_time))
41 {
42 $record_limit = $max_execution_time[1];
44 }
45 else
46 {
47 $record_limit = 5000;
48 }
49
50 if ($max_execution_time > 0)
51 {
52 $end_of_execution = time() + $max_execution_time;
53 }
54 else
55 {
56 $end_of_execution = 0;
57 }
58
59 if (is_array($arOptions) && ($arOptions['FORUM_TOPICS_ONLY'] == 'Y'))
60 {
61 $bForumTopicsOnly = CModule::IncludeModule('forum');
62 }
63 else
64 {
65 $bForumTopicsOnly = false;
66 }
67
68 if (is_array($arOptions) && ($arOptions['BLOG_NO_COMMENTS'] == 'Y'))
69 {
70 $bBlogNoComments = CModule::IncludeModule('blog');
71 }
72 else
73 {
74 $bBlogNoComments = false;
75 }
76
77 if (is_array($arOptions) && ($arOptions['USE_HTTPS'] == 'Y'))
78 {
79 $strProto = 'https://';
80 }
81 else
82 {
83 $strProto = 'http://';
84 }
85
86 $rsSite = CSite::GetByID($site_id);
87 if ($arSite = $rsSite->Fetch())
88 {
89 $SERVER_NAME = trim($arSite['SERVER_NAME']);
90 if ($SERVER_NAME == '')
91 {
92 $this->m_error = GetMessage('SEARCH_ERROR_SERVER_NAME', ['#SITE_ID#' => '<a href="site_edit.php?LID=' . urlencode($site_id) . '&lang=' . urlencode(LANGUAGE_ID) . '">' . htmlspecialcharsbx($site_id) . '</a>']) . '<br>';
93 return false;
94 }
95 //Cache events
96 $this->m_events = GetModuleEvents('search', 'OnSearchGetURL', true);
97
98 //Clear error file
99 if ($NS['ID'] == 0 && $NS['CNT'] == 0)
100 {
101 $e = fopen($arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_errors.xml', 'w');
102 $strBegin = "<?xml version='1.0' encoding='UTF-8'?>\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
103 fwrite($e, $strBegin);
104 }
105 //Or open it for append
106 else
107 {
108 $e = fopen($arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_errors.xml', 'a');
109 }
110 if (!$e)
111 {
112 $this->m_error = GetMessage('SEARCH_ERROR_OPEN_FILE') . ' ' . $arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_errors.xml' . '<br>';
113 return false;
114 }
115 //Open current sitemap file
116 if ($NS['FILE_SIZE'] == 0)
117 {
118 $f = fopen($arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_' . sprintf('%03d', $NS['FILE_ID']) . '.xml', 'w');
119 $strBegin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
120 fwrite($f, $strBegin);
121 $NS['FILE_SIZE'] += mb_strlen($strBegin);
122 }
123 else
124 {
125 $f = fopen($arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_' . sprintf('%03d', $NS['FILE_ID']) . '.xml', 'a');
126 }
127 if (!$f)
128 {
129 $this->m_error = GetMessage('SEARCH_ERROR_OPEN_FILE') . ' ' . $arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_' . sprintf('%03d', $NS['FILE_ID']) . '.xml' . '<br>';
130 return false;
131 }
132
133 CTimeZone::Disable();
134 $this->GetURLs($site_id, $NS['ID'], $record_limit);
135 $bFileIsFull = false;
136 while (!$bFileIsFull && $ar = $this->Fetch())
137 {
138 $record_limit--;
139 $NS['ID'] = $ar['ID'];
140 if (mb_strlen($ar['URL']) < 1)
141 {
142 continue;
143 }
144
145 if ($bForumTopicsOnly && ($ar['MODULE_ID'] == 'forum'))
146 {
147 //Forum topic ID
148 $PARAM2 = intval($ar['PARAM2']);
149 if ($NS['PARAM2'] < $PARAM2)
150 {
151 $NS['PARAM2'] = $PARAM2;
152 $arTopic = CForumTopic::GetByIDEx($PARAM2);
153 if ($arTopic)
154 {
155 $ar['FULL_DATE_CHANGE'] = $arTopic['LAST_POST_DATE'];
156 }
157 }
158 else
159 {
160 continue;
161 }
162 }
163
164 if ($bBlogNoComments && ($ar['MODULE_ID'] == 'blog'))
165 {
166 if (mb_substr($ar['ITEM_ID'], 0, 1) === 'C')
167 {
168 continue;
169 }
170 }
171
172 if (preg_match('/^[a-z]+:\\/\\//', $ar['URL']))
173 {
174 $strURL = $ar['URL'];
175 }
176 else
177 {
178 $strURL = $strProto . $ar['SERVER_NAME'] . $ar['URL'];
179 }
180 $strURL = $this->LocationEncode($this->URLEncode($strURL, 'UTF-8'));
181
182 $strTime = $this->TimeEncode(MakeTimeStamp(ConvertDateTime($ar['FULL_DATE_CHANGE'], 'DD.MM.YYYY HH:MI:SS'), 'DD.MM.YYYY HH:MI:SS'));
183
184 $strToWrite = "\t<url>\n\t\t<loc>" . $strURL . "</loc>\n\t\t<lastmod>" . $strTime . "</lastmod>\n\t</url>\n";
185
186 if (mb_strlen($strURL) > 2048)
187 {
188 fwrite($e, $strToWrite);
189 $NS['ERROR_CNT']++;
190 }
191 else
192 {
193 $NS['CNT']++;
194 $NS['FILE_SIZE'] += fwrite($f, $strToWrite);
195 $NS['FILE_URL_CNT']++;
196 }
197 //Next File on file size or url count limit
198 if ($NS['FILE_SIZE'] > 9000000 || $NS['FILE_URL_CNT'] >= 50000)
199 {
200 $bFileIsFull = true;
201 }
202 elseif ($end_of_execution)
203 {
204 if (time() > $end_of_execution)
205 {
206 fclose($e);
207 fclose($f);
208 CTimeZone::Enable();
209 return $NS;
210 }
211 }
212 }
213
214 CTimeZone::Enable();
215
216 if ($bFileIsFull)
217 {
218 fwrite($e, "</urlset>\n");
219 fclose($e);
220 fwrite($f, "</urlset>\n");
221 fclose($f);
222
223 $NS['FILE_SIZE'] = 0;
224 $NS['FILE_URL_CNT'] = 0;
225 $NS['FILE_ID']++;
226 return $NS;
227 }
228 elseif ($record_limit <= 0)
229 {
230 return $NS;
231 }
232 else
233 {
234 fwrite($e, "</urlset>\n");
235 fclose($e);
236 fwrite($f, "</urlset>\n");
237 fclose($f);
238 }
239 //WRITE INDEX FILE HERE
240 $f = fopen($arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_index.xml', 'w');
241 if (!$f)
242 {
243 $this->m_error = GetMessage('SEARCH_ERROR_OPEN_FILE') . ' ' . $arSite['ABS_DOC_ROOT'] . $arSite['DIR'] . 'sitemap_index.xml' . '<br>';
244 return false;
245 }
246 $strBegin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
247 fwrite($f, $strBegin);
248 for ($i = 0; $i <= $NS['FILE_ID']; $i++)
249 {
250 $strFile = $arSite['DIR'] . 'sitemap_' . sprintf('%03d', $i) . '.xml';
251 $strTime = $this->TimeEncode(filemtime($arSite['ABS_DOC_ROOT'] . $strFile));
252 fwrite($f, "\t<sitemap>\n\t\t<loc>" . $this->URLEncode($strProto . $arSite['SERVER_NAME'] . $strFile, 'UTF-8') . "</loc>\n\t\t<lastmod>" . $strTime . "</lastmod>\n\t</sitemap>\n");
253 }
254 fwrite($f, "</sitemapindex>\n");
255 fclose($f);
256 $this->m_errors_count = $NS['ERROR_CNT'];
257 $this->m_errors_href = $strProto . $arSite['SERVER_NAME'] . $arSite['DIR'] . 'sitemap_errors.xml';
258 $this->m_href = $strProto . $arSite['SERVER_NAME'] . $arSite['DIR'] . 'sitemap_index.xml';
259 return true;
260 }
261 else
262 {
263 $this->m_error = GetMessage('SEARCH_ERROR_SITE_ID') . '<br>';
264 return false;
265 }
266 }
267
268 function Fetch()
269 {
270 static $index = false;
271
272 $r = parent::Fetch();
273 if ($r)
274 {
275 if ($r['SITE_URL'] <> '')
276 {
277 $r['URL'] = $r['SITE_URL'];
278 }
279
280 if (mb_substr($r['URL'], 0, 1) == '=')
281 {
282 foreach ($this->m_events as $arEvent)
283 {
284 $newUrl = ExecuteModuleEventEx($arEvent, [$r]);
285 if (isset($newUrl))
286 {
287 $r['URL'] = $newUrl;
288 }
289 }
290 }
291 $r['URL'] = str_replace(
292 ['#LANG#', '#SITE_DIR#', '#SERVER_NAME#'],
293 [$r['DIR'], $r['DIR'], $r['SERVER_NAME']],
294 $r['URL']
295 );
296 $r['URL'] = preg_replace("'(?<!:)/+'s", '/', $r['URL']);
297 if (defined('BX_DISABLE_INDEX_PAGE') && BX_DISABLE_INDEX_PAGE)
298 {
299 if (!$index)
300 {
301 $index = '#/(' . str_replace(' ', '|', preg_quote(implode(' ', GetDirIndexArray()), '#')) . ')$#';
302 }
303 $r['URL'] = preg_replace($index, '/', $r['URL']);
304 }
305
306 //Remove anchor otherwise Google will ignore this link
307 $p = mb_strpos($r['URL'], '#');
308 if ($p !== false)
309 {
310 $r['URL'] = mb_substr($r['URL'], 0, $p);
311 }
312 }
313 return $r;
314 }
315
316 function URLEncode($str, $charset)
317 {
318 $strEncodedURL = '';
319 $arUrlComponents = preg_split('#(://|/|\\?|=|&)#', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
320 foreach ($arUrlComponents as $i => $part_of_url)
321 {
322 if ($i % 2)
323 {
324 $strEncodedURL .= $part_of_url;
325 }
326 else
327 {
328 if ($i > 1 && $arUrlComponents[$i - 1] === '://')
329 {
330 $converter = CBXPunycode::GetConverter();
331 $strEncodedURL .= $converter->Encode($part_of_url);
332 }
333 else
334 {
335 $strEncodedURL .= urlencode(\Bitrix\Main\Text\Encoding::convertEncoding(urldecode($part_of_url), LANG_CHARSET, $charset));
336 }
337 }
338 }
339 return $strEncodedURL;
340 }
341
343 {
344 static $search = ['&', "'", '"', '>', '<'];
345 static $replace = ['&amp;', '&apos;', '&quot;', '&gt;', '&lt;'];
346 return str_replace($search, $replace, $str);
347 }
348
349 function TimeEncode($iTime)
350 {
351 $iTZ = date('Z', $iTime);
352 $iTZHour = intval(abs($iTZ) / 3600);
353 $iTZMinutes = intval((abs($iTZ) - $iTZHour * 3600) / 60);
354 $strTZ = ($iTZ < 0 ? '-' : '+') . sprintf('%02d:%02d', $iTZHour, $iTZMinutes);
355 return date('Y-m-d', $iTime) . 'T' . date('H:i:s', $iTime) . $strTZ;
356 }
357
358 function GetURLs($site_id, $ID, $limit=0)
359 {
360 }
361}
static GetByIDEx($ID, $arAddParams=array())
Определения topic.php:482
Определения sitemap.php:5
$m_error
Определения sitemap.php:7
$m_errors_count
Определения sitemap.php:9
TimeEncode($iTime)
Определения sitemap.php:349
Create($site_id, $max_execution_time, $NS, $arOptions=[])
Определения sitemap.php:12
$m_errors_href
Определения sitemap.php:10
Fetch()
Определения sitemap.php:268
$m_href
Определения sitemap.php:6
GetURLs($site_id, $ID, $limit=0)
Определения sitemap.php:358
LocationEncode($str)
Определения sitemap.php:342
URLEncode($str, $charset)
Определения sitemap.php:316
$m_events
Определения sitemap.php:8
static GetConverter()
Определения punycode.php:25
$str
Определения commerceml2.php:63
$f
Определения component_props.php:52
if($ajaxMode) $ID
Определения get_user.php:27
$p
Определения group_list_element_edit.php:23
if(! $ar_profile) $strFile
Определения cron_frame.php:59
$max_execution_time
Определения csv_new_run.php:85
const LANG_CHARSET
Определения include.php:65
$arOptions
Определения structure.php:223
if(!defined('NOT_CHECK_PERMISSIONS')) $NS
Определения backup.php:24
ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly=false)
Определения tools.php:724
GetDirIndexArray($strDirIndex=false)
Определения tools.php:3112
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
$i
Определения factura.php:643
$site_id
Определения sonet_set_content_view.php:9