Наткнулся на несправедливость, в пылу разработки облачной версии, забывают про коробку. Так например забыли про вывод в фильтре полей типа hlblock, выводится оно в таком виде, и никак нельзя установить в нём значение:
Или так (в этом случае кстати можно хотя бы ID записи ввести для отбора):
Решение и причина проблемы просты, для элементов инфоблока адаптацию поля под ui сделали, а для HL нет, поэтому надо её доделать, пока это не появится в обновлении.
Маскируемся под разработчика битрикс и лезем в код модуля crm:
/bitrix/modules/crm/lib/filter/userfielddataprovider.php
В строке 145 добавляем тип hlblock в условие, что бы он определялся как список (list):
Далее в этом же файле чуть ниже, в строке 261 (может отличаться смотрите ориентир), добавляем формирование списка значений:
Теперь поле выглядит как обычное поле списка с мультивыбором:
Однако это не всё, мне по этому полю нужно было отбирать участников рассылки в модуле CRM-Маркетинг. А там как оказалось поля формируются совсем другим методом. Поэтому открываем файл:
/bitrix/modules/crm/classes/general/crm_usertype.php
В строке 338 вставляем код формирования поля с элементами списка:
Теперь и при формировании сегмента рассылки поле фильтра выводится корректно:
Или так (в этом случае кстати можно хотя бы ID записи ввести для отбора):
Решение и причина проблемы просты, для элементов инфоблока адаптацию поля под ui сделали, а для HL нет, поэтому надо её доделать, пока это не появится в обновлении.
Маскируемся под разработчика битрикс и лезем в код модуля crm:
/bitrix/modules/crm/lib/filter/userfielddataprovider.php
В строке 145 добавляем тип hlblock в условие, что бы он определялся как список (list):
|| $typeID === 'hlblock' |
Далее в этом же файле чуть ниже, в строке 261 (может отличаться смотрите ориентир), добавляем формирование списка значений:
elseif($typeID === 'hlblock')
{
$entity = new \CUserTypeHlblock();
$dbResult = $entity->GetList($userField);
$items = array();
if(is_object($dbResult))
{
$count = 0;
while($ary = $dbResult->Fetch())
{
$items[$ary['ID']] = $ary["VALUE"];
if(++$count > 500)
{
break;
}
}
}
return array(
'params' => array('multiple' => 'Y'),
'items' => $items
);
} |
| Примечание. Обратите внимание, что в формировании списка стоит лимит на 500 записей, такой же лимит выставлен и для iblock_element, и для iblock_section. Это не есть хорошо, конечно же в идеале поле с большим количеством элементов, должно получать список элементов динамически с фильтрацией, но думаю и этого дождёмся. |
Теперь поле выглядит как обычное поле списка с мультивыбором:
Однако это не всё, мне по этому полю нужно было отбирать участников рассылки в модуле CRM-Маркетинг. А там как оказалось поля формируются совсем другим методом. Поэтому открываем файл:
/bitrix/modules/crm/classes/general/crm_usertype.php
В строке 338 вставляем код формирования поля с элементами списка:
elseif($typeID === 'hlblock')
{
$entity = new \CUserTypeHlblock();
$dbResult = $entity->GetList($arUserField);
$items = array();
if(is_object($dbResult))
{
$count = 0;
while($ary = $dbResult->Fetch())
{
$items[$ary['ID']] = $ary["VALUE"];
if(++$count > 500)
{
break;
}
}
}
$arFilterFields[] = array(
'id' => $FIELD_NAME,
'name' => $fieldLabel,
'type' => 'list',
'params' => array('multiple' => 'Y'),
'items' => $items
);
continue;
} |
| Примечание. В этом файле также ставится лимит на количество записей для iblock_element и iblock_section, только теперь 200, но я оставил 500. |
Теперь и при формировании сегмента рассылки поле фильтра выводится корректно: