%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/iblock/lib/template/entity/ |
| Current File : /home/bitrix/www/bitrix/modules/iblock/lib/template/entity/elementproperty.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage iblock
*/
namespace Bitrix\Iblock\Template\Entity;
class ElementProperty extends Base
{
protected $iblockId = 0;
protected $properties = array();
protected $elementLinkProperties = array();
protected $sectionLinkProperties = array();
/**
* @param integer $id Iblock element identifier.
*/
public function __construct($id)
{
parent::__construct($id);
}
/**
* Set the iblock of the element.
*
* @param integer $iblockId Iblock identifier.
*
* @return void
*/
public function setIblockId($iblockId)
{
$this->iblockId = intval($iblockId);
}
/**
* Used to find entity for template processing.
*
* @param string $entity What to find.
*
* @return \Bitrix\Iblock\Template\Entity\Base
*/
public function resolve($entity)
{
if ($this->loadFromDatabase())
{
if (isset($this->elementLinkProperties[$entity]))
{
if (!is_object($this->elementLinkProperties[$entity]))
$this->elementLinkProperties[$entity] = new Element($this->elementLinkProperties[$entity]);
return $this->elementLinkProperties[$entity];
}
elseif (isset($this->sectionLinkProperties[$entity]))
{
if (!is_object($this->sectionLinkProperties[$entity]))
$this->sectionLinkProperties[$entity] = new Element($this->sectionLinkProperties[$entity]);
return $this->sectionLinkProperties[$entity];
}
}
return parent::resolve($entity);
}
/**
* Used to initialize entity fields from some external source.
*
* @param array $fields Entity fields.
*
* @return void
*/
public function setFields(array $fields)
{
parent::setFields($fields);
if (
is_array($this->fields)
&& $this->iblockId > 0
)
{
$properties = array();
$propertyList = \Bitrix\Iblock\PropertyTable::getList(array(
"select" => array("*"),
"filter" => array("=IBLOCK_ID" => $this->iblockId),
));
while ($row = $propertyList->fetch())
{
if ($row["USER_TYPE_SETTINGS"])
$row["USER_TYPE_SETTINGS"] = unserialize($row["USER_TYPE_SETTINGS"]);
$properties[$row["ID"]] = $row;
if ($row["CODE"] != "")
$properties[$row["CODE"]] = &$properties[$row["ID"]];
}
foreach ($fields as $propertyCode => $propertyValues)
{
if (is_array($propertyValues))
{
foreach ($propertyValues as $i => $propertyValue)
{
if (is_array($propertyValue) && array_key_exists("VALUE", $propertyValue))
{
if ($propertyValue["VALUE"] != "")
$propertyValues[$i] = $propertyValue["VALUE"];
else
unset($propertyValues[$i]);
}
}
}
if (isset($properties[$propertyCode]))
{
$property = $properties[$propertyCode];
$fieldCode = strtolower($propertyCode);
if ($property["PROPERTY_TYPE"] === "L")
{
if (is_numeric($propertyValues))
{
$value = new ElementPropertyEnum($propertyValues);
}
elseif (is_array($propertyValues))
{
$value = array();
foreach ($propertyValues as $propertyValue)
{
if (is_numeric($propertyValue))
$value[] = new ElementPropertyEnum($propertyValue);
}
}
else
{
$value = $propertyValues;
}
}
elseif ($property["PROPERTY_TYPE"] === "E")
{
if ($propertyValues instanceof Element)
{
$this->elementLinkProperties[$fieldCode] = $propertyValues;
$value = $propertyValues->getField("name");
}
elseif (is_numeric($propertyValues))
{
$this->elementLinkProperties[$fieldCode] = $propertyValues;
$value = new ElementPropertyElement($propertyValues);
}
elseif (is_array($propertyValues))
{
$value = array();
foreach ($propertyValues as $propertyValue)
{
if (is_numeric($propertyValue))
$value[] = new ElementPropertyElement($propertyValue);
}
}
else
{
$value = $propertyValues;
}
}
elseif ($property["PROPERTY_TYPE"] === "G")
{
if ($propertyValues instanceof Section)
{
$this->sectionLinkProperties[$fieldCode] = $propertyValues;
$value = $propertyValues->getField("name");
}
elseif (is_numeric($propertyValues))
{
$this->sectionLinkProperties[$fieldCode] = $propertyValues;
$value = new ElementPropertySection($propertyValues);
}
elseif (is_array($propertyValues))
{
$value = array();
foreach ($propertyValues as $propertyValue)
{
if (is_numeric($propertyValue))
$value[] = new ElementPropertySection($propertyValue);
}
}
else
{
$value = $propertyValues;
}
}
else
{
if(strlen($property["USER_TYPE"]))
{
if (is_array($propertyValues))
{
$value = array();
foreach ($propertyValues as $propertyValue)
{
$value[] = new ElementPropertyUserField($propertyValue, $property);
}
}
else
{
$value = new ElementPropertyUserField($propertyValues, $property);
}
}
else
{
$value = $propertyValues;
}
}
$this->fieldMap[$fieldCode] = $property["ID"];
$this->fieldMap[$property["ID"]] = $property["ID"];
if ($property["CODE"] != "")
$this->fieldMap[strtolower($property["CODE"])] = $property["ID"];
$this->fields[$property["ID"]] = $value;
}
}
}
}
/**
* Loads values from database.
* Returns true on success.
*
* @return boolean
*/
protected function loadFromDatabase()
{
if (!isset($this->fields) && $this->iblockId > 0)
{
$this->fields = array();
$this->fieldMap = array();
$propertyList = \CIBlockElement::getProperty(
$this->iblockId,
$this->id,
array("sort" => "asc"),
array("EMPTY" => "N")
);
while ($property = $propertyList->fetch())
{
if ($property["VALUE_ENUM"] != "")
{
$value = $property["VALUE_ENUM"];
}
elseif ($property["PROPERTY_TYPE"] === "E")
{
$this->elementLinkProperties[$property["ID"]] = $property["VALUE"];
if ($property["CODE"] != "")
$this->elementLinkProperties[strtolower($property["CODE"])] = $property["VALUE"];
$value = new ElementPropertyElement($property["VALUE"]);
}
elseif ($property["PROPERTY_TYPE"] === "G")
{
$this->sectionLinkProperties[$property["ID"]] = $property["VALUE"];
if ($property["CODE"] != "")
$this->sectionLinkProperties[strtolower($property["CODE"])] = $property["VALUE"];
$value = new ElementPropertySection($property["VALUE"]);
}
else
{
if(strlen($property["USER_TYPE"]))
{
$value = new ElementPropertyUserField($property["VALUE"], $property);
}
else
{
$value = $property["VALUE"];
}
}
$this->fieldMap[$property["ID"]] = $property["ID"];
if ($property["CODE"] != "")
$this->fieldMap[strtolower($property["CODE"])] = $property["ID"];
if ($property["MULTIPLE"] == "Y")
$this->fields[$property["ID"]][] = $value;
else
$this->fields[$property["ID"]] = $value;
}
}
return is_array($this->fields);
}
}
class ElementPropertyUserField extends LazyValueLoader
{
/** @var array */
private $property = null;
/**
* @param integer $key Iblock element identifier.
* @param array|mixed $property Iblock property array.
*/
function __construct($key, $property)
{
parent::__construct($key);
if (is_array(($property)))
{
$this->property = $property;
}
}
/**
* Actual work method which have to retrieve data from the DB.
*
* @return mixed
*/
protected function load()
{
$propertyFormatFunction = $this->getFormatFunction();
if ($propertyFormatFunction)
{
return call_user_func_array($propertyFormatFunction,
array(
$this->property,
array("VALUE" => $this->key),
array("MODE" => "ELEMENT_TEMPLATE"),
)
);
}
else
{
return $this->key;
}
}
/**
* Retruns GetPublicViewHTML handler function for $this->property.
* Returns false if no handler defined.
*
* @return callable|false
*/
protected function getFormatFunction()
{
static $propertyFormatFunction = null;
if (!isset($propertyFormatFunction))
{
$propertyFormatFunction = false;
if ($this->property && strlen($this->property["USER_TYPE"]))
{
$propertyUserType = \CIBlockProperty::getUserType($this->property["USER_TYPE"]);
if(
array_key_exists("GetPublicViewHTML", $propertyUserType)
&& is_callable($propertyUserType["GetPublicViewHTML"])
)
{
$propertyFormatFunction = $propertyUserType["GetPublicViewHTML"];
}
}
}
return $propertyFormatFunction;
}
}
class ElementPropertyEnum extends LazyValueLoader
{
/**
* Actual work method which have to retrieve data from the DB.
*
* @return mixed
*/
protected function load()
{
$enumList = \Bitrix\Iblock\PropertyEnumerationTable::getList(array(
"select" => array("VALUE"),
"filter" => array("=ID" => $this->key),
));
$enum = $enumList->fetch();
if ($enum)
return $enum["VALUE"];
else
return "";
}
}
class ElementPropertyElement extends LazyValueLoader
{
/**
* Actual work method which have to retrieve data from the DB.
*
* @return mixed
*/
protected function load()
{
$elementList = \Bitrix\Iblock\ElementTable::getList(array(
"select" => array("NAME"),
"filter" => array("=ID" => $this->key),
));
$element = $elementList->fetch();
if ($element)
return $element["NAME"];
else
return "";
}
}
class ElementPropertySection extends LazyValueLoader
{
/**
* Actual work method which have to retrieve data from the DB.
*
* @return mixed
*/
protected function load()
{
$sectionList = \Bitrix\Iblock\SectionTable::getList(array(
"select" => array("NAME"),
"filter" => array("=ID" => $this->key),
));
$section = $sectionList->fetch();
if ($section)
return $section["NAME"];
else
return "";
}
}