• Модуль: 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();
	}
}