Your IP : 3.16.50.98


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/rest/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/rest/lib/placement.php

<?php
namespace Bitrix\Rest;

use Bitrix\Main;
use Bitrix\Rest\UserField\Callback;


/**
 * Class PlacementTable
 *
 * Fields:
 * <ul>
 * <li> ID int mandatory
 * <li> APP_ID int optional
 * <li> PLACEMENT string(255) mandatory
 * <li> PLACEMENT_HANDLER string(255) mandatory
 * <li> TITLE string(255) optional
 * <li> COMMENT string(255) optional
 * <li> DATE_CREATE datetime optional
 * </ul>
 *
 * @package Bitrix\Rest
 **/
class PlacementTable extends Main\Entity\DataManager
{
	const PLACEMENT_DEFAULT = 'DEFAULT';

	const ERROR_PLACEMENT_NOT_FOUND = 'ERROR_PLACEMENT_NOT_FOUND';

	const CACHE_TTL = 86400;
	const CACHE_DIR = 'rest/placement';

	protected static $handlersListCache = array();

	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_rest_placement';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return array(
			'ID' => array(
				'data_type' => 'integer',
				'primary' => true,
				'autocomplete' => true,
			),
			'APP_ID' => array(
				'data_type' => 'integer',
			),
			'PLACEMENT' => array(
				'data_type' => 'string',
				'required' => true,
			),
			'PLACEMENT_HANDLER' => array(
				'data_type' => 'string',
				'required' => true,
			),
			'TITLE' => array(
				'data_type' => 'string',
			),
			'COMMENT' => array(
				'data_type' => 'string',
			),
			'DATE_CREATE' => array(
				'data_type' => 'datetime',
			),
			'ADDITIONAL' => array(
				'data_type' => 'string',
			),
			'REST_APP' => array(
				'data_type' => 'Bitrix\Rest\AppTable',
				'reference' => array('=this.APP_ID' => 'ref.ID'),
			),
		);
	}

	/**
	 * Returns list of placement handlers. Use \Bitrix\Rest\PlacementTable::getHandlersList.
	 *
	 * @param string $placement Placement ID.
	 *
	 * @return Main\DB\Result
	 */
	public static function getHandlers($placement)
	{
		$dbRes = static::getList(array(
			'filter' => array(
				'=PLACEMENT' => $placement,
				'=REST_APP.ACTIVE' => AppTable::ACTIVE,
			),
			'select' => array(
				'ID', 'TITLE', 'COMMENT', 'APP_ID', 'ADDITIONAL',
				'INSTALLED' => 'REST_APP.INSTALLED',
				'APP_NAME' => 'REST_APP.APP_NAME',
				'APP_ACCESS' => 'REST_APP.ACCESS',
			),
		));

		return $dbRes;
	}

	/**
	 * Removes all application placement handlers.
	 *
	 * @param int $appId Application ID.
	 *
	 * @return Main\DB\Result
	 */
	public static function deleteByApp($appId)
	{
		$connection = Main\Application::getConnection();

		$queryResult = $connection->query("DELETE FROM ".static::getTableName()." WHERE APP_ID='".intval($appId)."'");

		static::clearHandlerCache();

		return $queryResult;
	}

	/**
	 * Returns cached list of placement handlers.
	 *
	 * @param string $placement Placement ID
	 * @param bool $skipInstallCheck Optional flag to allow placement from apps with unfinished install
	 *
	 * @return array
	 */
	public static function getHandlersList($placement, $skipInstallCheck = false)
	{
		if(!array_key_exists($placement, static::$handlersListCache))
		{
			static::$handlersListCache[$placement] = array();

			$cache = Main\Application::getInstance()->getManagedCache();
			if($cache->read(static::CACHE_TTL, static::getCacheId($placement), static::CACHE_DIR))
			{
				static::$handlersListCache = $cache->get(static::getCacheId($placement));
			}
			else
			{
				$dbRes = static::getHandlers($placement);
				while($handler = $dbRes->fetch())
				{
					static::$handlersListCache[$placement][] = $handler;
				}

				$cache->set(static::getCacheId($placement), static::$handlersListCache);
			}
		}

		$result = static::$handlersListCache[$placement];

		foreach($result as $key => $handler)
		{
			if(!$skipInstallCheck && $handler['INSTALLED'] === AppTable::NOT_INSTALLED)
			{
				unset($result[$key]);
			}
			elseif(
				$placement !== Api\UserFieldType::PLACEMENT_UF_TYPE
				&& !\CRestUtil::checkAppAccess($handler['APP_ID'], array(
					'ACCESS' => $handler['APP_ACCESS']
				)
				)
			)
			{
				unset($result[$key]);
			}
		}

		$result = array_values($result);

		return $result;
	}

	public static function clearHandlerCache()
	{
		$cache = Main\Application::getInstance()->getManagedCache();
		$cache->cleanDir(static::CACHE_DIR);
		static::$handlersListCache = array();
	}

	public static function onBeforeUpdate(Main\Entity\Event $event)
	{
		return static::checkUniq($event);
	}

	public static function onBeforeAdd(Main\Entity\Event $event)
	{
		return static::checkUniq($event, true);
	}

	public static function onAfterAdd(Main\Entity\Event $event)
	{
		static::clearHandlerCache();
	}

	public static function onAfterUpdate(Main\Entity\Event $event)
	{
		static::clearHandlerCache();
	}

	public static function onAfterDelete(Main\Entity\Event $event)
	{
		static::clearHandlerCache();
	}

	protected static function getCacheId($placement)
	{
		return 'rest_placement_list|'.$placement.'|'.LANGUAGE_ID;
	}

	protected static function checkUniq(Main\Entity\Event $event, $add = false)
	{
		$result = new Main\Entity\EventResult();
		$data = $event->getParameter("fields");

		$filter = array(
			'=APP_ID' => $data['APP_ID'],
			'=PLACEMENT' => $data['PLACEMENT'],
			'=PLACEMENT_HANDLER' => $data['PLACEMENT_HANDLER'],
		);

		if(!empty($data['ADDITIONAL']))
		{
			$filter = array(
				'LOGIC' => 'OR',
				array('=ADDITIONAL' => $data['ADDITIONAL']),
				$filter
			);
		}

		$dbRes = static::getList(array(
			'filter' => $filter,
			'select' => array('ID')
		));

		if($dbRes->fetch())
		{
			$result->addError(new Main\Entity\EntityError(
				"Handler already binded"
			));
		}
		elseif($add)
		{
			$result->modifyFields(array(
				"DATE_CREATE" => new Main\Type\DateTime(),
			));
		}

		return $result;
	}
}