- Модуль: 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
);
}
}
}