• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/component/selector/element.php
  • Класс: BitrixIblockComponentSelectorElement
  • Вызов: Element::compileFilterProperties
protected function compileFilterProperties(array $list)
{
	$result = [];
	if (empty($list))
		return $result;

	$operators = [
		IblockPropertyTable::TYPE_STRING => [
			'default' => '?',
			'quickSearch' => '?'
		],
		IblockPropertyTable::TYPE_NUMBER => [
			'default' => '=',
			'exact' => '=',
			'range' => '><',
			'more' => '>',
			'less' => '<'
		],
		IblockPropertyTable::TYPE_LIST => [
			'default' => '=',
			'exact' => '='
		],
		IblockPropertyTable::TYPE_ELEMENT => [
			'default' => '=',
			'exact' => '='
		],
		IblockPropertyTable::TYPE_SECTION => [
			'default' => '=',
			'exact' => '='
		]
	];

	$list = array_filter($list, [__CLASS__, 'isFilterableProperty']);
	foreach ($list as $id => $row)
	{
		$field = null;
		$type = $row['PROPERTY_TYPE'];
		if (
			$row['USER_TYPE'] !== ''
			&& isset($row['PROPERTY_USER_TYPE']['GetUIFilterProperty'])
			&& is_callable($row['PROPERTY_USER_TYPE']['GetUIFilterProperty'])
		)
		{
			$type = 'USER_TYPE';
		}
		switch ($type)
		{
			case 'USER_TYPE':
				$field = [
					'id' => $id,
					'name' => $row['NAME'],
					'type' => 'custom',
					'value' => ''
				];
				if (isset($operators[$row['PROPERTY_TYPE']]))
					$field['operators'] = $operators[$row['PROPERTY_TYPE']];
				call_user_func_array(
					$row['PROPERTY_USER_TYPE']['GetUIFilterProperty'],
					[
						$row,
						['VALUE' => $id, 'FORM_NAME' => 'main-ui-filter'],
						&$field
					]
				);
				break;
			case IblockPropertyTable::TYPE_STRING:
				$field = [
					'id' => $id,
					'name' => $row['NAME'],
					'type' => 'string',
					'operators' => $operators[IblockPropertyTable::TYPE_STRING],
				];
				break;
			case IblockPropertyTable::TYPE_NUMBER:
				$field = [
					'id' => $id,
					'name' => $row['NAME'],
					'type' => 'number',
					'operators' => $operators[IblockPropertyTable::TYPE_NUMBER]
				];
				break;
			case IblockPropertyTable::TYPE_LIST:
				$list = [];
				$valueIterator = IblockPropertyEnumerationTable::getList([
					'select' => ['ID', 'VALUE', 'SORT'],
					'filter' => ['=PROPERTY_ID' => $row['ID']],
					'order' => ['SORT' => 'ASC', 'VALUE' => 'ASC']
				]);
				while ($value = $valueIterator->fetch())
					$list[$value['ID']] = $value['VALUE'];
				unset($value, $valueIterator);
				if (!empty($list))
				{
					$field = [
						'id' => $id,
						'name' => $row['NAME'],
						'type' => 'list',
						'items' => $list,
						'params' => ['multiple' => 'Y'],
						'operators' => $operators[IblockPropertyTable::TYPE_LIST]
					];
				}
				unset($list);
				break;
			case IblockPropertyTable::TYPE_ELEMENT:
				$row['LINK_IBLOCK_ID'] = (int)$row['LINK_IBLOCK_ID'];
				if ($row['LINK_IBLOCK_ID'] > 0)
				{
					$list = [];
					$valueIterator = CIBlockElement::GetList(
						['SORT' => 'ASC', 'NAME' => 'ASC'],
						['IBLOCK_ID' => $row['LINK_IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'Y', 'MIN_PERMISSION' => 'R'],
						false,
						false,
						['ID', 'IBLOCK_ID', 'NAME', 'SORT']
					);
					while ($value = $valueIterator->Fetch())
						$list[$value['ID']] = '['.$value['ID'].'] '.$value['NAME'];
					unset($value, $valueIterator);
					if (!empty($list))
					{
						$field = [
							'id' => $id,
							'name' => $row['NAME'],
							'type' => 'list',
							'items' => $list,
							'params' => ['multiple' => 'Y'],
							'operators' => $operators[IblockPropertyTable::TYPE_ELEMENT]
						];
					}
					unset($list);
				}
				break;
			case IblockPropertyTable::TYPE_SECTION:
				$row['LINK_IBLOCK_ID'] = (int)$row['LINK_IBLOCK_ID'];
				if ($row['LINK_IBLOCK_ID'] > 0)
				{
					$list = [];
					$valueIterator = CIBlockSection::GetList(
						['LEFT_MARGIN' => 'ASC'],
						['IBLOCK_ID' => $row['LINK_IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'Y', 'MIN_PERMISSION' => 'R'],
						false,
						['ID', 'IBLOCK_ID', 'DEPTH_LEVEL', 'NAME', 'LEFT_MARGIN']
					);
					while ($value = $valueIterator->Fetch())
						$list[$value['ID']] = str_repeat('. ', $value['DEPTH_LEVEL'] - 1).'['.$value['ID'].'] '.$value['NAME'];
					unset($value, $valueIterator);
					if (!empty($list))
					{
						$field = [
							'id' => $id,
							'name' => $row['NAME'],
							'type' => 'list',
							'items' => $list,
							'operators' => $operators[IblockPropertyTable::TYPE_SECTION]
						];
					}
					unset($list);
				}
				break;
		}
		if (!empty($field))
			$result[$id] = $field;
	}
	unset($id, $row, $iterator);
	unset($operators);

	return $result;
}