Your IP : 18.216.78.8


Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/iblock/lib/template/entity/
Upload File :
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/iblock/lib/template/entity/base.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage iblock
 */
namespace Bitrix\Iblock\Template\Entity;

/**
 * Class Base
 *
 * @package Bitrix\Iblock\Template\Entity
 */
class Base
{
	/** @var integer  */
	protected $id = null;
	/** @var array[string]mixed  */
	protected $fields = null;
	/** @var array[string]string  */
	protected $fieldMap = array();

	/**
	 * @param integer $id Entity identifier.
	 */
	public function __construct($id)
	{
		$this->id = $id;
	}

	/**
	 * Returns entity identifier.
	 *
	 * @return integer
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Used to find entity for template processing.
	 *
	 * @param string $entity What to find.
	 *
	 * @return \Bitrix\Iblock\Template\Entity\Base
	 */
	public function resolve($entity)
	{
		if ($entity === "this")
			return $this;
		else
			return new Base(0);
	}

	/**
	 * Used to initialize entity fields from some external source.
	 *
	 * @param array $fields Entity fields.
	 *
	 * @return void
	 */
	public function setFields(array $fields)
	{
		$this->fields = $fields;
	}

	/**
	 * Returns field value.
	 *
	 * @param string $fieldName Name of the field to retrieve data from.
	 *
	 * @return string
	 */
	public function getField($fieldName)
	{
		if (!$this->loadFromDatabase())
			return "";

		if (!isset($this->fieldMap[$fieldName]))
			return "";

		$fieldName = $this->fieldMap[$fieldName];
		if (!isset($this->fields[$fieldName]))
			return "";

		$fieldValue = $this->fields[$fieldName];
		if (is_array($fieldValue))
		{
			$result = array();
			foreach($fieldValue as $key => $value)
			{
				if ($value instanceof LazyValueLoader)
					$result[$key] = $value->getValue();
				else
					$result[$key] = $value;

			}
			return $result;
		}
		else
		{
			if ($fieldValue instanceof LazyValueLoader)
			{
				return $fieldValue->getValue();
			}
			return $this->fields[$fieldName];
		}
	}

	/**
	 * Loads values from database.
	 * Returns true on success.
	 *
	 * @return boolean
	 */
	protected function loadFromDatabase()
	{
		if (!isset($this->fields))
		{
			$this->fields = array();
		}
		return true;
	}

	/**
	 * Sets new field value only when is not set yet.
	 * Adds mapping from field name to it's internal presentation.
	 *
	 * @param string $fieldName The name of the field.
	 * @param string $internalName Internal name of the field.
	 * @param string $value Value to be stored.
	 *
	 * @return void
	 */
	protected function addField($fieldName, $internalName, $value)
	{
		if (!isset($this->fields[$internalName]))
			$this->fields[$internalName] = $value;
		$this->fieldMap[mb_strtolower($fieldName)] = $internalName;
	}
}

/**
 * Class LazyValueLoader
 * Strategy class used for delaying queries to DB.
 *
 * @package Bitrix\Iblock\Template\Entity
 */
class LazyValueLoader
{
	protected $value = null;
	protected $key = null;

	/**
	 * @param string|integer $key Unique identifier.
	 */
	function __construct($key)
	{
		$this->key = $key;
	}

	/**
	 * Calls load method if value was not loaded yet.
	 *
	 * @return mixed
	 */
	public function __toString()
	{
		if (!isset($this->value))
			$this->value = $this->load();
		return $this->value;
	}

	/**
	 * Calls load method if value was not loaded yet.
	 *
	 * @return mixed
	 */
	public function getValue()
	{
		if (!isset($this->value))
			$this->value = $this->load();
		return $this->value;
	}

	/**
	 * Actual work method which have to retrieve data from the DB.
	 *
	 * @return mixed
	 */
	protected function load()
	{
		return "";
	}
}