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;
}