- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockrss.php
- Класс: CAllIBlockRSS
- Вызов: CAllIBlockRSS::GetNewsEx
static function GetNewsEx($SITE, $PORT, $PATH, $QUERY_STR, $bOutChannel = False)
{
global $APPLICATION;
$text = "";
$cacheKey = md5($SITE.$PORT.$PATH.$QUERY_STR);
$bValid = False;
$bUpdate = False;
if ($db_res_arr = CIBlockRSS::GetCache($cacheKey))
{
$bUpdate = True;
if ($db_res_arr["CACHE"] <> '')
{
if ($db_res_arr["VALID"]=="Y")
{
$bValid = True;
$text = $db_res_arr["CACHE"];
}
}
}
if (!$bValid)
{
$http = new BitrixMainWebHttpClient(array(
"socketTimeout" => 120,
));
$http->setHeader("User-Agent", "BitrixSMRSS");
$text = $http->get($SITE.":".$PORT.$PATH.($QUERY_STR <> ''? "?".$QUERY_STR: ""));
if ($text)
{
$rss_charset = "windows-1251";
if (preg_match("/<"."?XML[^>]{1,}encoding=["']([^>"']{1,})["'][^>]{0,}?".">/i", $text, $matches))
{
$rss_charset = Trim($matches[1]);
}
else
{
$headers = $http->getHeaders();
$ct = $headers->get("Content-Type");
if (preg_match("#charset=([a-zA-Z0-9-]+)#m", $ct, $match))
$rss_charset = $match[1];
}
$text = preg_replace("//i", "", $text);
$text = preg_replace("/<"."\?XML.*?\?".">/i", "", $text);
$text = $APPLICATION->ConvertCharset($text, $rss_charset, SITE_CHARSET);
}
}
if ($text != "")
{
$objXML = new CDataXML();
$res = $objXML->LoadString($text);
if($res !== false)
{
$ar = $objXML->GetArray();
if (!$bOutChannel)
{
if (
is_array($ar) && isset($ar["rss"])
&& is_array($ar["rss"]) && isset($ar["rss"]["#"])
&& is_array($ar["rss"]["#"]) && isset($ar["rss"]["#"]["channel"])
&& is_array($ar["rss"]["#"]["channel"]) && isset($ar["rss"]["#"]["channel"][0])
&& is_array($ar["rss"]["#"]["channel"][0]) && isset($ar["rss"]["#"]["channel"][0]["#"])
)
$arRes = $ar["rss"]["#"]["channel"][0]["#"];
else
$arRes = array();
}
else
{
if (
is_array($ar) && isset($ar["rss"])
&& is_array($ar["rss"]) && isset($ar["rss"]["#"])
)
$arRes = $ar["rss"]["#"];
else
$arRes = array();
}
$arRes["rss_charset"] = mb_strtolower(SITE_CHARSET);
if (!$bValid)
{
$ttl = ($arRes["ttl"][0]["#"] <> '')? intval($arRes["ttl"][0]["#"]): 60;
CIBlockRSS::UpdateCache($cacheKey, $text, array("minutes" => $ttl), $bUpdate);
}
}
return $arRes;
}
else
{
return array();
}
}