%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/iblock/lib/inheritedproperty/ |
| Current File : /home/bitrix/www/bitrix/modules/iblock/lib/inheritedproperty/basetemplate.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage iblock
*/
namespace Bitrix\Iblock\InheritedProperty;
class BaseTemplate
{
/** @var \Bitrix\Iblock\InheritedProperty\BaseValues|null */
protected $entity = null;
/**
* @param BaseValues $entity Sets the context for template substitution.
*/
function __construct(BaseValues $entity)
{
$this->entity = $entity;
}
/**
* Returns entity for which this template is executing.
*
* @return BaseValues|null
*/
public function getValuesEntity()
{
return $this->entity;
}
/**
* Stores templates for entity into database.
*
* @param array $templates Templates to be stored to DB.
*
* @return void
* @throws \Bitrix\Main\ArgumentException
*/
public function set(array $templates)
{
$templateList = \Bitrix\Iblock\InheritedPropertyTable::getList(array(
"select" => array("ID", "CODE", "TEMPLATE"),
"filter" => array(
"=IBLOCK_ID" => $this->entity->getIblockId(),
"=ENTITY_TYPE" => $this->entity->getType(),
"=ENTITY_ID" => $this->entity->getId(),
),
));
array_map("trim", $templates);
while ($row = $templateList->fetch())
{
$CODE = $row["CODE"];
if (array_key_exists($CODE, $templates))
{
if ($templates[$CODE] !== $row["TEMPLATE"])
{
if ($templates[$CODE] != "")
\Bitrix\Iblock\InheritedPropertyTable::update($row["ID"], array(
"TEMPLATE" => $templates[$CODE],
));
else
\Bitrix\Iblock\InheritedPropertyTable::delete($row["ID"]);
$this->entity->deleteValues($row["ID"]);
}
unset($templates[$CODE]);
}
}
if (!empty($templates))
{
foreach ($templates as $CODE => $TEMPLATE)
{
if ($TEMPLATE != "")
{
\Bitrix\Iblock\InheritedPropertyTable::add(array(
"IBLOCK_ID" => $this->entity->getIblockId(),
"CODE" => $CODE,
"ENTITY_TYPE" => $this->entity->getType(),
"ENTITY_ID" => $this->entity->getId(),
"TEMPLATE" => $TEMPLATE,
));
}
}
$this->entity->clearValues();
}
}
/**
* Returns array of templates stored for the entity from database.
*
* @param BaseValues $entity Entity.
* @return array
* @throws \Bitrix\Main\ArgumentException
*/
public function get(BaseValues $entity = null)
{
static $cache = array();
if ($entity === null)
$entity = $this->entity;
$filter = array(
"=IBLOCK_ID" => $entity->getIblockId(),
"=ENTITY_TYPE" => $entity->getType(),
"=ENTITY_ID" => $entity->getId(),
);
$cacheKey = implode('|', $filter);
if (!isset($cache[$cacheKey]))
{
$result = array();
$templateList = \Bitrix\Iblock\InheritedPropertyTable::getList(array(
"select" => array("ID", "CODE", "TEMPLATE", "ENTITY_TYPE", "ENTITY_ID"),
"filter" => $filter,
));
while ($row = $templateList->fetch())
{
$result[$row["CODE"]] = $row;
}
$cache[$cacheKey] = $result;
}
return $cache[$cacheKey];
}
/**
* Checks if entity has any templates stored in the database.
* Caches the result in static variable.
*
* @param BaseValues $entity Entity.
*
* @return boolean
* @throws \Bitrix\Main\ArgumentException
*/
public function hasTemplates(BaseValues $entity)
{
static $cache = array();
$iblockId = $entity->getIblockId();
if (!isset($cache[$iblockId]))
{
$templateList = \Bitrix\Iblock\InheritedPropertyTable::getList(array(
"select" => array("ID"),
"filter" => array(
"=IBLOCK_ID" => $iblockId,
),
"limit" => 1,
));
$cache[$iblockId] = is_array($templateList->fetch());
}
return $cache[$iblockId];
}
/**
* Deletes templates for this entity from database.
*
* @return void
* @throws \Bitrix\Main\ArgumentException
*/
public function delete()
{
$templateList = \Bitrix\Iblock\InheritedPropertyTable::getList(array(
"select" => array("ID"),
"filter" => array(
"=IBLOCK_ID" => $this->entity->getIblockId(),
"=ENTITY_TYPE" => $this->entity->getType(),
"=ENTITY_ID" => $this->entity->getId(),
),
));
while ($row = $templateList->fetch())
{
\Bitrix\Iblock\InheritedPropertyTable::delete($row["ID"]);
}
}
/**
* Returns templates for the entity and all it's parents
* into $templates parameter.
*
* @param BaseValues $entity Entity.
* @param array &$templates Templates returned.
*
* @return void
*/
protected function findTemplatesRecursive(BaseValues $entity, array &$templates)
{
foreach ($this->get($entity) as $CODE => $templateData)
{
if (!array_key_exists($CODE, $templates))
$templates[$CODE] = $templateData;
}
foreach ($entity->getParents() as $parent)
{
$this->findTemplatesRecursive($parent, $templates);
}
}
/**
* Returns templates for the entity and all it's parents.
* Adds INHERITED flag to each template found.
*
* @return array
*/
public function findTemplates()
{
$templates = array();
if ($this->hasTemplates($this->entity))
{
$this->findTemplatesRecursive($this->entity, $templates);
foreach ($templates as $CODE => $row)
{
if ($row["ENTITY_TYPE"] == $this->entity->getType() && $row["ENTITY_ID"] == $this->entity->getId())
$templates[$CODE]["INHERITED"] = "N";
else
$templates[$CODE]["INHERITED"] = "Y";
}
}
return $templates;
}
}