Your IP : 18.224.95.213


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/main/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/main/lib/framecache.php

<?php
namespace Bitrix\Main;

class FrameCache
{
	private static $instance;
	private static $isEnable = false;
	private static $isBackgroundRequest = false;
	private static $useAppCache = false;
	private static $onBeforeHandleKey = false;
	private static $onHandleKey = false;
	private $arDynamicIDs = array();
	private $curDynamicId = false;

	public $arDynamicData = Array();

	private function __construct()
	{
		//use self::getInstance()
	}
	private function __clone()
	{
		//you can't clone it
	}
	public static function getInstance()
	{
		if (is_null(self::$instance))
			self::$instance = new  FrameCache();

		return self::$instance;
	}

	/**
	 * Gets ids of the dynamic blocks
	 * @return array
	 */
	public function getDynamicIDs()
	{
		return $this->arDynamicIDs;
	}

	/**
	 * Sets isEnable property value
	 * @param bool $isEnable
	 */
	public static function setEnable($isEnable = true)
	{
		if ($isEnable && !self::$isEnable)
		{
			self::$onBeforeHandleKey = AddEventHandler("main", "OnBeforeEndBufferContent", Array(__CLASS__, "OnBeforeEndBufferContent"));
			self::$onHandleKey = AddEventHandler("main", "OnEndBufferContent", Array(__CLASS__, "OnEndBufferContent"));
			self::$isEnable = true;

			\CJSCore::init(Array("fc"), false);

			$actionType = \Bitrix\Main\Context::getCurrent()->getServer()->get("HTTP_BX_ACTION_TYPE");
			if ($actionType == "get_dynamic")//Is it the background request?
				self::$isBackgroundRequest = true;
		}
		elseif (!$isEnable && self::$isEnable)
		{
			if (self::$onBeforeHandleKey >= 0)
				RemoveEventHandler("main", "OnBeforeEndBufferContent", self::$onBeforeHandleKey);
			if (self::$onBeforeHandleKey >= 0)
				RemoveEventHandler("main", "OnEndBufferContent", self::$onHandleKey);

			self::$isEnable = false;
		}
	}

	/**
	 * Marks start of a dynamic block
	 * @param $ID
	 * @return bool
	 */
	public function startDynamicWithID($ID)
	{
		if (in_array($ID, $this->arDynamicIDs) && $ID == $this->curDynamicId)
			return false;

		self::setEnable();
		$this->arDynamicIDs[] = $ID;
		$this->curDynamicId = $ID;
		echo "##start_frame_cache_" . $ID . "##";

		return true;
	}

	/**
	 * Marks end of the dynamic block if it's the current dynamic block
	 * and its start was being marked early.
	 * @param $ID
	 */
	public function finishDynamicWithID($ID)
	{
		if ($this->curDynamicId !== $ID)
			return;
		$this->curDynamicId = false;
		echo "##end_frame_cache_" . $ID . "##";
	}

	/**
	 * OnBeforeEndBufferContent handler
	 */
	public static function onBeforeEndBufferContent()
	{
		global $APPLICATION;

		$fcache = FrameCache::getInstance();

		$manifest = \Bitrix\Main\Data\AppCacheManifest::getInstance();
		if (self::getUseAppCache() == true)
			$appCacheParams = $manifest->OnBeforeEndBufferContent();
		else
			$appCacheParams = Array();

		if (!self::$isBackgroundRequest)
		{
			$checkParams = array_merge(Array("dynamic" => $fcache->getDynamicIDs()), $appCacheParams);
			$checkScript = "<script>BX.ready(function(){ BX.frameCache.vars = " . json_encode($checkParams) . ";BX.frameCache.update();})</script>";
			$APPLICATION->AddHeadString($checkScript);
		}
	}

	/**
	 * OnEndBufferContent handler
	 * @param $content
	 */
	public static function onEndBufferContent(&$content)
	{

		global $APPLICATION;

		if (self::getUseAppCache() == true) //Do we use html5 application cache?
			\Bitrix\Main\Data\AppCacheManifest::onEndBufferContent($content);
		else
			\Bitrix\Main\Data\AppCacheManifest::checkObsoleteManifest();//it checks if the manifest is still alive.

		$selfObject = self::getInstance();
		$ids = $selfObject->getDynamicIDs();


		if (count($ids) > 0) //Do we have any dynamic blocks?
		{
			$match = array();
			$regexp = "/##start_frame_cache_(" . implode("|", $ids) . ")##(.+?)##end_frame_cache_(?:" . implode("|", $ids) . ")##/is";
			preg_match_all($regexp, $content, $match);

			/*
				Notes:
				$match[0] -	array of dynamic blocks with macros'
				$match[1] - ids of the dynamic blocks
				$match[2] - array of dynamic blocks
			*/

			$count = count($match[1]);
			if (self::$isBackgroundRequest)
			{
				//$fcache->arDynamicData = array_combine($match[1], $match[2]);
				for ($i = 0; $i < $count; $i++)
				{
					$selfObject->arDynamicData[] = Array("ID" => $match[1][$i], "CONTENT" => $match[2][$i], "HASH" => md5($match[2][$i]));
				}
			}
			else
			{
				$replacedArray = array();
				for ($i = 0; $i < $count; $i++)
				{
					$replacedArray[] = '<div id="bxdynamic_' . $match[1][$i] . '"></div>';
				}
				$content = str_replace($match[0], $replacedArray, $content);

			}
		}

		if (self::$isBackgroundRequest) //Is it a check request?
		{
			header("Content-Type: application/x-javascript");
			$content = Array(
				"isManifestUpdated" => \Bitrix\Main\Data\AppCacheManifest::getInstance()->getIsModified(),
				"dynamicBlocks" => $selfObject->arDynamicData,
			);
			if (!Application::getInstance()->isUtfMode())
				//TODO I use it because there is no similar method in the new Bitrix Framework yet
				$content = $APPLICATION->convertCharsetArray($content, SITE_CHARSET, "UTF-8");
			$content = json_encode($content);
		}
	}

	/**
	 * Sets useAppCache property
	 * @param bool $useAppCache
	 */
	public function setUseAppCache($useAppCache = true)
	{
		self::$useAppCache = $useAppCache;
	}

	/**
	 * Gets useAppCache property
	 * @return bool
	 */
	public function getUseAppCache()
	{
		return self::$useAppCache;
	}

}