1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
iblockrss.php
См. документацию.
1<?php
2
4{
5 public static function GetCache($cacheKey)
6 {
7 global $DB;
9 $helper = $connection->getSqlHelper();
10
11 $db_res = $DB->Query(
12 "SELECT CACHE, case when CACHE_DATE > " . $helper->getCurrentDateTimeFunction() . " then 'Y' else 'N' end as VALID ".
13 "FROM b_iblock_cache ".
14 "WHERE CACHE_KEY = '".$DB->ForSql($cacheKey, 0)."' ");
15 return $db_res->Fetch();
16 }
17
18 public static function Add($IBLOCK_ID, $NODE, $NODE_VALUE)
19 {
20 global $DB;
21 $IBLOCK_ID = intval($IBLOCK_ID);
22 $DB->Query(
23 "INSERT INTO b_iblock_rss (IBLOCK_ID, NODE, NODE_VALUE) ".
24 "VALUES(".$IBLOCK_ID.", '".$DB->ForSql($NODE, 50)."', '".$DB->ForSql($NODE_VALUE, 255)."')");
25 }
26
27 public static function UpdateCache($cacheKey, $CACHE, $HOURS_CACHE, $bCACHED)
28 {
29 global $DB;
31 $helper = $connection->getSqlHelper();
32
33 if(is_array($HOURS_CACHE) && array_key_exists("minutes", $HOURS_CACHE))
34 $TTL = intval($HOURS_CACHE["minutes"]) * 60;
35 else
36 $TTL = intval($HOURS_CACHE) * 3600;
37
38 if ($bCACHED)
39 {
40 $db_res = $DB->Query(
41 "UPDATE b_iblock_cache SET ".
42 " CACHE = '".$DB->ForSql($CACHE, 0)."', ".
43 " CACHE_DATE = " . $helper->addSecondsToDateTime(intval($TTL)) .
44 " WHERE CACHE_KEY = '".$DB->ForSql($cacheKey, 0)."' ");
45 }
46 else
47 {
48 $db_res = $DB->Query(
49 "INSERT INTO b_iblock_cache (CACHE_KEY, CACHE, CACHE_DATE) ".
50 "VALUES('".$DB->ForSql($cacheKey, 0)."', '".$DB->ForSql($CACHE, 0)."', " . $helper->addSecondsToDateTime(intval($TTL)) . ") ");
51 }
52 $db_res = $DB->Query("DELETE from b_iblock_cache WHERE CACHE_DATE < " . $helper->getCurrentDateTimeFunction());
53 }
54
55 public static function GetRSSText($arIBLOCK, $LIMIT_NUM = false, $LIMIT_DAY = false, $yandex = false)
56 {
57 global $DB;
58
59 $strRes = "";
60
61 $protocol = \Bitrix\Main\Context::getCurrent()->getRequest()->isHttps() ? 'https://' : 'http://';
62
63 $serverName = "";
64
65 if (isset($arIBLOCK["SERVER_NAME"]) && $arIBLOCK["SERVER_NAME"] <> '')
66 $serverName = $arIBLOCK["SERVER_NAME"];
67
68 if ($serverName == '' && !isset($arIBLOCK["SERVER_NAME"]))
69 {
70 $dbSite = CSite::GetList('', '', array("LID" => $arIBLOCK["LID"]));
71 if ($arSite = $dbSite->Fetch())
72 $serverName = $arSite["SERVER_NAME"];
73 }
74
75 if ($serverName == '')
76 {
77 if (defined("SITE_SERVER_NAME") && SITE_SERVER_NAME <> '')
78 $serverName = SITE_SERVER_NAME;
79 else
80 $serverName = COption::GetOptionString("main", "server_name");
81 }
82
83 $strRes .= "<channel>\n";
84 $strRes .= "<title>".htmlspecialcharsbx($arIBLOCK["NAME"])."</title>\n";
85 $strRes .= "<link>".$protocol.htmlspecialcharsbx($serverName)."</link>\n";
86 $strRes .= "<description>".htmlspecialcharsbx($arIBLOCK["DESCRIPTION"])."</description>\n";
87 $strRes .= "<lastBuildDate>".date("r")."</lastBuildDate>\n";
88 $strRes .= "<ttl>".$arIBLOCK["RSS_TTL"]."</ttl>\n";
89
90 $db_img_arr = CFile::GetFileArray($arIBLOCK["PICTURE"]);
91 if ($db_img_arr)
92 {
93 if(mb_substr($db_img_arr["SRC"], 0, 1) == "/")
94 $strImage = $protocol.$serverName.$db_img_arr["SRC"];
95 else
96 $strImage = $db_img_arr["SRC"];
97
98 if ($yandex)
99 {
100 $strRes .= "<yandex:logo>".htmlspecialcharsbx($strImage)."</yandex:logo>\n";
101 $squareSize = min($db_img_arr["WIDTH"], $db_img_arr["HEIGHT"]);
102 if ($squareSize > 0)
103 {
104 $squarePicture = CFile::ResizeImageGet(
105 $db_img_arr,
106 array("width" => $squareSize, "height" => $squareSize),
108 );
109 if ($squarePicture)
110 {
111 if(mb_substr($squarePicture["src"], 0, 1) == "/")
112 $squareImage = $protocol.$serverName.$squarePicture["src"];
113 else
114 $squareImage = $squarePicture["src"];
115 $strRes .= "<yandex:logo type=\"square\">".htmlspecialcharsbx($squareImage)."</yandex:logo>\n";
116 }
117 }
118 }
119 else
120 {
121 $strRes .= "<image>\n";
122 $strRes .= "<title>".htmlspecialcharsbx($arIBLOCK["NAME"])."</title>\n";
123 $strRes .= "<url>".htmlspecialcharsbx($strImage)."</url>\n";
124 $strRes .= "<link>".$protocol.htmlspecialcharsbx($serverName)."</link>\n";
125 $strRes .= "<width>".$db_img_arr["WIDTH"]."</width>\n";
126 $strRes .= "<height>".$db_img_arr["HEIGHT"]."</height>\n";
127 $strRes .= "</image>\n";
128 }
129 }
130
131 $arNodes = array();
132 $db_res = $DB->Query("SELECT NODE, NODE_VALUE FROM b_iblock_rss WHERE IBLOCK_ID = ".intval($arIBLOCK["ID"]));
133 while ($db_res_arr = $db_res->Fetch())
134 {
135 $arNodes[$db_res_arr["NODE"]] = $db_res_arr["NODE_VALUE"];
136 }
137
138 $formatActiveDates = CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-");
139 CPageOption::SetOptionString("iblock", "FORMAT_ACTIVE_DATES", "FULL");
140
141 $nav = $LIMIT_NUM > 0? array("nTopCount" => $LIMIT_NUM): false;
142
144 "IBLOCK_ID" => $arIBLOCK["ID"],
145 "ACTIVE_DATE" => "Y",
146 "ACTIVE" => "Y",
147 );
148 if ($LIMIT_DAY !== false)
149 {
150 $date = new \Bitrix\Main\Type\DateTime();
151 $date->add("- $LIMIT_DAY days");
152 $arFilter["ACTIVE_FROM"] = $date->toString();
153 }
154
155 CTimeZone::Disable();
156 $items = CIBlockElement::GetList(array("ACTIVE_FROM"=>"DESC", "SORT"=>"ASC", "ID"=>"DESC"), $arFilter, false, $nav);
157 CTimeZone::Enable();
158
159 CPageOption::SetOptionString("iblock", "FORMAT_ACTIVE_DATES", $formatActiveDates);
160
161 while ($arItem = $items->GetNext())
162 {
163 $props = CIBlockElement::GetProperty($arIBLOCK["ID"], $arItem["ID"], "sort", "asc", Array("ACTIVE"=>"Y", "NON_EMPTY"=>"Y"));
164 $arProps = Array();
165 while ($arProp = $props->Fetch())
166 {
167 if ($arProp["CODE"] <> '')
168 $arProps[$arProp["CODE"]] = Array("NAME"=>htmlspecialcharsbx($arProp["NAME"]), "VALUE"=>htmlspecialcharsex($arProp["VALUE"]));
169 else
170 $arProps[$arProp["ID"]] = Array("NAME"=>htmlspecialcharsbx($arProp["NAME"]), "VALUE"=>htmlspecialcharsex($arProp["VALUE"]));
171 }
172
173 $arLinkProp = $arProps["DOC_LINK"];
174
175 $strRes .= "<item>\n";
176 if ($arNodes["title"] <> '')
177 {
178 $strRes .= "<title>".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["title"], $arProps, $arItem))."</title>\n";
179 }
180 else
181 {
182 $strRes .= "<title>".htmlspecialcharsbx($arItem["~NAME"])."</title>\n";
183 }
184 if ($arNodes["link"] <> '')
185 {
186 $strRes .= "<link>".CIBlockRSS::ExtractProperties($arNodes["link"], $arProps, $arItem)."</link>\n";
187 }
188 else
189 {
190 $strRes .= "<link>".$protocol.htmlspecialcharsbx($serverName).(($arLinkProp["VALUE"]) ? $arLinkProp["VALUE"] : $arItem["DETAIL_PAGE_URL"])."</link>\n";
191 }
192 if ($arNodes["description"] <> '')
193 {
194 $strRes .= "<description>".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["description"], $arProps, $arItem))."</description>\n";
195 }
196 else
197 {
198 $strRes .= "<description>".(($arItem["PREVIEW_TEXT"] || $yandex) ? htmlspecialcharsbx($arItem["PREVIEW_TEXT"]) : htmlspecialcharsbx($arItem["DETAIL_TEXT"]))."</description>\n";
199 }
200 if ($arNodes["enclosure"] <> '')
201 {
202 $strRes .= "<enclosure url=\"".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["enclosure"], $arProps, $arItem))."\" length=\"".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["enclosure_length"], $arProps, $arItem))."\" type=\"".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["enclosure_type"], $arProps, $arItem))."\"/>\n";
203 }
204 else
205 {
206 $db_img_arr = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]);
207 if ($db_img_arr)
208 {
209 if(mb_substr($db_img_arr["SRC"], 0, 1) == "/")
210 $strImage = $protocol.$serverName.$db_img_arr["SRC"];
211 else
212 $strImage = $db_img_arr["SRC"];
213
214 $strRes .= "<enclosure url=\"".htmlspecialcharsbx($strImage)."\" length=\"".$db_img_arr["FILE_SIZE"]."\" type=\"".$db_img_arr["CONTENT_TYPE"]."\" width=\"".$db_img_arr["WIDTH"]."\" height=\"".$db_img_arr["HEIGHT"]."\"/>\n";
215 }
216 }
217 if ($arNodes["category"] <> '')
218 {
219 $strRes .= "<category>".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["category"], $arProps, $arItem))."</category>\n";
220 }
221 else
222 {
223 $strPath = "";
224 $nav = CIBlockSection::GetNavChain(
225 $arIBLOCK["ID"],
226 $arItem["IBLOCK_SECTION_ID"],
227 [
228 'ID',
229 'NAME',
230 ],
231 true
232 );
233 foreach ($nav as $ar_nav)
234 {
235 $strPath .= $ar_nav["NAME"]."/";
236 }
237 unset($ar_nav, $nav);
238 if ($strPath !== '')
239 {
240 $strRes .= "<category>".htmlspecialcharsbx($strPath)."</category>\n";
241 }
242 }
243 if ($yandex)
244 {
245 $strRes .= "<yandex:full-text>".htmlspecialcharsbx($arItem["DETAIL_TEXT"])."</yandex:full-text>\n";
246 }
247 if ($arNodes["pubDate"] <> '')
248 {
249 $strRes .= "<pubDate>".htmlspecialcharsbx(CIBlockRSS::ExtractProperties($arNodes["pubDate"], $arProps, $arItem))."</pubDate>\n";
250 }
251 else
252 {
253 if ($arItem["ACTIVE_FROM"] <> '')
254 {
255 $strRes .= "<pubDate>".date("r", MkDateTime($DB->FormatDate($arItem["ACTIVE_FROM"], Clang::GetDateFormat("FULL"), "DD.MM.YYYY H:I:S"), "d.m.Y H:i:s"))."</pubDate>\n";
256 }
257 else
258 {
259 $strRes .= "<pubDate>".date("r")."</pubDate>\n";
260 }
261 }
262 $strRes .= "</item>\n";
263 }
264 $strRes .= "</channel>\n";
265 return $strRes;
266 }
267
268 // Agent
269 public static function PreGenerateRSS($IBLOCK_ID, $yandex = true)
270 {
271 global $DB;
272
273 $protocol = \Bitrix\Main\Context::getCurrent()->getRequest()->isHttps() ? 'https://' : 'http://';
274
275 $strSql =
276 "SELECT DISTINCT B.*, C.CHARSET, S.SERVER_NAME, ".$DB->DateToCharFunction("B.TIMESTAMP_X")." as TIMESTAMP_X ".
277 "FROM b_iblock B LEFT JOIN b_iblock_group IBG ON IBG.IBLOCK_ID=B.ID ".
278 " LEFT JOIN b_lang S ON S.LID=B.LID ".
279 " LEFT JOIN b_culture C ON C.ID=S.CULTURE_ID ".
280 "WHERE B.ID = ".intval($IBLOCK_ID).
281 " AND IBG.GROUP_ID IN (2) ".
282 " AND IBG.PERMISSION>='R'".
283 " AND (IBG.PERMISSION='X' OR B.ACTIVE='Y')";
284 $dbr = $DB->Query($strSql);
285 $bAccessable = False;
286 if (($arIBlock = $dbr->GetNext()) && ($arIBlock["RSS_FILE_ACTIVE"]=="Y" && !$yandex || $arIBlock["RSS_YANDEX_ACTIVE"]=="Y" && $yandex))
287 $bAccessable = True;
288
289 if (!$bAccessable) return "";
290
291 $strRes = "";
292 $strRes .= "<"."?xml version=\"1.0\" encoding=\"".$arIBlock["CHARSET"]."\"?".">\n";
293 $strRes .= "<rss version=\"2.0\"";
294// $strRes .= "<rss version=\"2.0\" xmlns=\"http://backend.userland.com/rss2\"";
295 if ($yandex)
296 {
297 $strRes .= ' xmlns:yandex="'.$protocol.'news.yandex.ru"';
298 }
299 $strRes .= ">\n";
300
301 $limit_num = false;
302 $limit_day = 2;
303 if (!$yandex)
304 {
305 $limit_num = false;
306 if ($arIBlock["RSS_FILE_LIMIT"] <> '' && intval($arIBlock["RSS_FILE_LIMIT"])>0)
307 $limit_num = intval($arIBlock["RSS_FILE_LIMIT"]);
308
309 $limit_day = false;
310 if ($arIBlock["RSS_FILE_DAYS"] <> '' && intval($arIBlock["RSS_FILE_DAYS"])>0)
311 $limit_day = intval($arIBlock["RSS_FILE_DAYS"]);
312 }
313 $strRes .= CIBlockRSS::GetRSSText($arIBlock, $limit_num, $limit_day, $yandex);
314
315 $strRes .= "</rss>\n";
316
317 $rss_file = $_SERVER["DOCUMENT_ROOT"].COption::GetOptionString("iblock", "path2rss", "/upload/");
318 if ($yandex)
319 $rss_file .= "yandex_rss_".intval($arIBlock["ID"]).".xml";
320 else
321 $rss_file .= "iblock_rss_".intval($arIBlock["ID"]).".xml";
322 $fp = fopen($rss_file, "w");
323 fwrite($fp, $strRes);
324 fclose($fp);
325
326 global $pPERIOD;
327 $pPERIOD = intval($arIBlock["RSS_TTL"])*60*60;
328 return "CIBlockRSS::PreGenerateRSS(".$IBLOCK_ID.", ".($yandex?"true":"false").");";
329 }
330}
$connection
Определения actionsdefinitions.php:38
$db_res
Определения options_user_settings.php:8
static getConnection($name="")
Определения application.php:638
Определения iblockrss.php:4
static ExtractProperties($str, &$arProps, &$arItem)
Определения iblockrss.php:304
static GetOptionString($module_id, $name, $def="", $site=false)
Определения pageoption.php:10
static SetOptionString($module_id, $name, $value="", $desc=false, $site="")
Определения pageoption.php:22
Определения iblockrss.php:4
static GetRSSText($arIBLOCK, $LIMIT_NUM=false, $LIMIT_DAY=false, $yandex=false)
Определения iblockrss.php:55
static UpdateCache($cacheKey, $CACHE, $HOURS_CACHE, $bCACHED)
Определения iblockrss.php:27
static Add($IBLOCK_ID, $NODE, $NODE_VALUE)
Определения iblockrss.php:18
static GetCache($cacheKey)
Определения iblockrss.php:5
static PreGenerateRSS($IBLOCK_ID, $yandex=true)
Определения iblockrss.php:269
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$protocol
Определения .description.php:9
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$IBLOCK_ID
Определения csv_new_run.php:168
const BX_RESIZE_IMAGE_EXACT
Определения constants.php:12
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
MkDateTime($strDT, $format="d.m.Y H:i:s")
Определения tools.php:1977
$props
Определения template.php:269
$items
Определения template.php:224
$arFilter
Определения user_search.php:106
$arIBlock['PROPERTY']
Определения yandex_detail.php:172