• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/component/base.php
  • Класс: BitrixIblockComponentBase
  • Вызов: Base::parsePropertyCondition
protected function parsePropertyCondition(array &$result, array $condition, $params)
{
	if (!empty($result))
	{
		$subFilter = array();

		foreach ($result as $name => $value)
		{
			if (!empty($result[$name]) && is_array($result[$name]))
			{
				$this->parsePropertyCondition($result[$name], $condition, $params);
			}
			else
			{
				if (($ind = mb_strpos($name, 'CondIBProp')) !== false)
				{
					[$prefix, $iblock, $propertyId] = explode(':', $name);
					$operator = $ind > 0? mb_substr($prefix, 0, $ind) : '';

					$catalogInfo = CCatalogSku::GetInfoByIBlock($iblock);
					if (!empty($catalogInfo))
					{
						if (
							$catalogInfo['CATALOG_TYPE'] != CCatalogSku::TYPE_CATALOG
							&& $catalogInfo['IBLOCK_ID'] == $iblock
						)
						{
							$subFilter[$operator.'PROPERTY_'.$propertyId] = $value;
						}
						else
						{
							$result[$operator.'PROPERTY_'.$propertyId] = $value;
						}
					}

					unset($result[$name]);
				}
			}
		}

		if (!empty($subFilter) && !empty($catalogInfo))
		{
			$offerPropFilter = array(
				'IBLOCK_ID' => $catalogInfo['IBLOCK_ID'],
				'ACTIVE_DATE' => 'Y',
				'ACTIVE' => 'Y'
			);

			if ($params['HIDE_NOT_AVAILABLE_OFFERS'] === 'Y')
			{
				$offerPropFilter['HIDE_NOT_AVAILABLE'] = 'Y';
			}
			elseif ($params['HIDE_NOT_AVAILABLE_OFFERS'] === 'L')
			{
				$offerPropFilter[] = array(
					'LOGIC' => 'OR',
					'AVAILABLE' => 'Y',
					'SUBSCRIBE' => 'Y'
				);
			}

			if (count($subFilter) > 1)
			{
				$subFilter['LOGIC'] = $condition['DATA']['All'];
				$subFilter = array($subFilter);
			}

			$result['=ID'] = CIBlockElement::SubQuery(
				'PROPERTY_'.$catalogInfo['SKU_PROPERTY_ID'],
				$offerPropFilter + $subFilter
			);
		}
	}
}