%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/iblock/lib/model/
Upload File :
Create Path :
Current File : //home/bitrix/www/bitrix/modules/iblock/lib/model/propertyfeature.php

<?php
namespace Bitrix\Iblock\Model;

use Bitrix\Main,
	Bitrix\Main\Localization\Loc,
	Bitrix\Iblock;

Loc::loadMessages(__FILE__);

class PropertyFeature
{
	const EVENT_ID_FEATURE_LIST = 'OnPropertyFeatureBuildList';

	const FEATURE_ID_LIST_PAGE_SHOW = 'LIST_PAGE_SHOW';
	const FEATURE_ID_DETAIL_PAGE_SHOW = 'DETAIL_PAGE_SHOW';

	/**
	 * Add features for new property. Do not check features in database.
	 *
	 * @param int $propertyId	Property id.
	 * @param array $features	Feature list.
	 * @return Main\Entity\Result
	 */
	public static function addFeatures($propertyId, array $features)
	{
		$result = new Main\Entity\Result();

		$propertyId = (int)$propertyId;
		if ($propertyId <= 0)
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_BAD_PROPERTY_ID')
			));
			return $result;
		}

		if (empty($features))
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_EMPTY_FEATURE_LIST')
			));
			return $result;
		}
		$features = self::checkFeatureList($features);
		if ($features === null)
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_BAD_FEATURE_LIST')
			));
			return $result;
		}

		foreach ($features as $row)
		{
			$row['PROPERTY_ID'] = $propertyId;
			$internalResult = Iblock\PropertyFeatureTable::add($row);
			if (!$internalResult->isSuccess())
			{
				$result->addErrors($internalResult->getErrors());
				return $result;
			}
		}
		unset($internalResult, $row);

		return $result;
	}

	public static function updateFeatures($propertyId, array $features)
	{
		$result = new Main\Entity\Result();

		$propertyId = (int)$propertyId;
		if ($propertyId <= 0)
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_BAD_PROPERTY_ID')
			));
			return $result;
		}

		return $result;
	}

	/**
	 * Upsert property features.
	 *
	 * @param int $propertyId	Property id.
	 * @param array $features	Feature list.
	 * @return Main\Entity\Result
	 * @throws Main\ArgumentException
	 * @throws Main\Db\SqlQueryException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	public static function setFeatures($propertyId, array $features)
	{
		$result = new Main\Entity\Result();

		$propertyId = (int)$propertyId;
		if ($propertyId <= 0)
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_BAD_PROPERTY_ID')
			));
			return $result;
		}

		if (empty($features))
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_EMPTY_FEATURE_LIST')
			));
			return $result;
		}
		$features = self::checkFeatureList($features);
		if ($features === null)
		{
			$result->addError(new Main\Error(
				Loc::getMessage('PROPERTY_FEATURE_ERR_BAD_FEATURE_LIST')
			));
			return $result;
		}

		$currentList = [];
		$idList = [];
		$iterator = Iblock\PropertyFeatureTable::getList([
			'select' => ['*'],
			'filter' => ['=PROPERTY_ID' => $propertyId]
		]);
		while ($row = $iterator->fetch())
		{
			$row['ID'] = (int)$row['ID'];
			$currentList[self::getIndex($row)] = $row;
			$idList[$row['ID']] = $row['ID'];
		}
		unset($row, $iterator);

		foreach ($features as $index => $row)
		{
			if (isset($currentList[$index]))
			{
				$internalResult = Iblock\PropertyFeatureTable::update(
					$currentList[$index]['ID'],
					['IS_ENABLED' => $row['IS_ENABLED']]
				);
				if ($internalResult->isSuccess())
					unset($idList[$currentList[$index]['ID']]);
			}
			else
			{
				$row['PROPERTY_ID'] = $propertyId;
				$internalResult = Iblock\PropertyFeatureTable::add($row);
			}
			if (!$internalResult->isSuccess())
			{
				$result->addErrors($internalResult->getErrors());
				return $result;
			}
		}
		unset($internalResult, $index, $row);
		unset($currentList);

		if (!empty($idList))
		{
			$conn = Main\Application::getConnection();
			$helper = $conn->getSqlHelper();
			$query = 'delete from '.$helper->quote(Iblock\PropertyFeatureTable::getTableName()).
				' where '.$helper->quote('PROPERTY_ID').' = '.$propertyId.
				' and '.$helper->quote('ID').' in ('.implode(',', $idList).')';
			$conn->queryExecute($query);
			unset($query, $helper, $conn);
		}
		unset($idList);

		return $result;
	}

	protected static function checkFeatureList(array $list)
	{
		if (empty($list))
			return null;

		$result = [];
		foreach ($list as $rawRow)
		{
			$row = self::checkFeature($rawRow);
			if ($row === null)
				return null;
			$result[self::getIndex($row)] = $row;
		}
		unset($rawRow);

		return $result;
	}

	protected static function checkFeature(array $feature)
	{
		if (empty($feature))
			return null;
		if (!isset($feature['MODULE_ID']))
			return null;
		$feature['MODULE_ID'] = trim((string)$feature['MODULE_ID']);
		if ($feature['MODULE_ID'] === '')
			return null;
		if (!isset($feature['FEATURE_ID']))
			return null;
		$feature['FEATURE_ID'] = trim((string)$feature['FEATURE_ID']);
		if ($feature['FEATURE_ID'] === '')
			return null;
		if (!isset($feature['IS_ENABLED']))
			return null;
		$feature['IS_ENABLED'] = trim((string)$feature['IS_ENABLED']);
		if ($feature['IS_ENABLED'] !== 'Y' && $feature['IS_ENABLED'] !== 'N')
			return null;

		return [
			'MODULE_ID' => $feature['MODULE_ID'],
			'FEATURE_ID' => $feature['FEATURE_ID'],
			'IS_ENABLED' => $feature['IS_ENABLED']
		];
	}

	public static function getIndex(array $feature)
	{
		return $feature['MODULE_ID'].':'.$feature['FEATURE_ID'];
	}

	/**
	 * @param array $property
	 * @param array $description
	 * @return array
	 */
	public static function getPropertyFeatureList(array $property, array $description = [])
	{
		$result = self::getIblockFeatureList();

		$event = new Main\Event(
			'iblock',
			__CLASS__.'::'.self::EVENT_ID_FEATURE_LIST,
			['property' => $property, 'description' => $description]
		);
		$event->send();
		foreach($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() !== Main\EventResult::SUCCESS)
				continue;
			$list = $eventResult->getParameters();
			if (empty($list) || !is_array($list))
				continue;
			foreach ($list as $item)
			{
				if (empty($item) || !is_array($item))
					continue;
				$item = self::prepareFeatureDescription($item);
				if (empty($item))
					continue;
				$result[] = $item;
			}
			unset($item, $list);
		}
		unset($eventResult);

		return $result;
	}

	public static function getListPageShowPropertyCodes($iblockId, array $parameters = [])
	{
		$iblockId = (int)$iblockId;
		if ($iblockId <= 0)
			return null;

		return self::getFilteredPropertyCodes(
			$iblockId,
			[
				'=MODULE_ID' => 'iblock',
				'=FEATURE_ID' => self::FEATURE_ID_LIST_PAGE_SHOW
			],
			$parameters
		);
	}

	public static function getDetailPageShowProperties($iblockId, array $parameters = [])
	{
		$iblockId = (int)$iblockId;
		if ($iblockId <= 0)
			return null;

		return self::getFilteredPropertyCodes(
			$iblockId,
			[
				'=MODULE_ID' => 'iblock',
				'=FEATURE_ID' => self::FEATURE_ID_DETAIL_PAGE_SHOW
			],
			$parameters
		);
	}

	protected static function getFilteredPropertyCodes($iblockId, array $filter, array $parameters = [])
	{
		if ((string)Main\Config\Option::get('iblock', 'property_features_enabled') !== 'Y')
			return null;

		$iblockId = (int)$iblockId;
		if ($iblockId <= 0)
			return null;
		if (!isset($filter['=MODULE_ID']) || !isset($filter['=FEATURE_ID']))
			return null;

		$getCode = (isset($parameters['CODE']) && $parameters['CODE'] == 'Y');

		$result = [];
		$filter['=PROPERTY.IBLOCK_ID'] = $iblockId;
		$filter['=PROPERTY.ACTIVE'] = 'Y';
		$filter['=IS_ENABLED'] = 'Y';
		$iterator = Iblock\PropertyFeatureTable::getList([
			'select' => [
				'IBLOCK_PROPERTY_ID' => 'PROPERTY.ID',
				'IBLOCK_PROPERTY_CODE' => 'PROPERTY.CODE',
				'IBLOCK_PROPERTY_SORT' => 'PROPERTY.SORT'
			],
			'filter' => $filter,
			'order' => ['IBLOCK_PROPERTY_SORT' => 'ASC', 'IBLOCK_PROPERTY_ID' => 'ASC']
		]);
		while ($row = $iterator->fetch())
			$result[(int)$row['IBLOCK_PROPERTY_ID']] = self::getPropertyCode(
				[
					'ID' => $row['IBLOCK_PROPERTY_ID'],
					'CODE' => $row['IBLOCK_PROPERTY_CODE']
				],
				$getCode
			);
		unset($row, $iterator);
		unset($filter, $getCode);

		return (!empty($result) ? array_values($result) : null);
	}

	protected static function getPropertyCode(array $property, $getCode = false)
	{
		if ($getCode)
		{
			$code = (string)$property['CODE'];
			return ($code !== '' ? $code : $property['ID']);
		}
		else
		{
			return $property['ID'];
		}
	}

	private static function prepareFeatureDescription(array $row)
	{
		if (empty($row))
			return [];
		if (
			!isset($row['MODULE_ID'])
			|| !isset($row['FEATURE_ID'])
			|| !isset($row['FEATURE_NAME'])
		)
			return [];

		return [
			'MODULE_ID' => $row['MODULE_ID'],
			'FEATURE_ID' => $row['FEATURE_ID'],
			'FEATURE_NAME' => $row['FEATURE_NAME']
		];
	}

	private static function getIblockFeatureList()
	{
		return [
			[
				'MODULE_ID' => 'iblock',
				'FEATURE_ID' => self::FEATURE_ID_LIST_PAGE_SHOW,
				'FEATURE_NAME' => Loc::getMessage('PROPERTY_FEATURE_NAME_LIST_PAGE_SHOW')
			],
			[
				'MODULE_ID' => 'iblock',
				'FEATURE_ID' => self::FEATURE_ID_DETAIL_PAGE_SHOW,
				'FEATURE_NAME' => Loc::getMessage('PROPERTY_FEATURE_NAME_DETAIL_PAGE_SHOW')
			]
		];
	}

	public static function isEnabledFeatures()
	{
		return ((string)Main\Config\Option::get('iblock', 'property_features_enabled') == 'Y');
	}

	/**
	 * Returns true, if property features exist.
	 *
	 * @return bool
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	public static function isPropertyFeaturesExist()
	{
		$featureCount = (int)Iblock\PropertyFeatureTable::getCount([], ['ttl' => 86400]);
		return ($featureCount > 0);
	}
}

Zerion Mini Shell 1.0