Всем привет. Есть метод, который ищет элементы инфоблока:
Вот код вызова этого метода:
Есть 3 элемента, которых свойство UL_FULL_NAME (Полное наименование юридического лица) равно "Государственная корпорация Ромашка". А есть ещё 50 элементов, у которых это свойство равно "Государственная корпорация Рога и копыта".
Так вот. Если я в метод в фильтр $filter передаю PROPERTY_UL_FULL_NAME значение "Государственная корпорация Ромашка" - то эти 3 элемента корректно находятся. А если передаю PROPERTY_UL_FULL_NAME со значением "Государственная корпорация" - то не находится ничего. Подскажите пожалуйста, как правильно переписать метод так, чтоб при передаче в фильтр подстроки "Государственная корпорация" метод находил бы все элементы, у которых в свойсте UL_FULL_NAME встречается эта подстрока, а не только по точному совпадению?
| Код |
|---|
function getList($iblockId, $properties, $filter, $nav, $navParams, $sort)
{
unset($filter['PRESET_ID']);
unset($filter['FILTER_ID']);
unset($filter['FILTER_APPLIED']);
unset($filter['FIND']);
$filter['IBLOCK_ID'] = $iblockId;
$filter['ACTIVE'] = 'Y';
if ($filter['NAME']) {
$filter['%NAME'] = $filter['NAME'];
unset($filter['NAME']);
}
$fields = [
'ID',
'NAME',
'CREATED_BY',
'DATE_CREATE',
'TIMESTAMP_X',
];
$order = [];
foreach ($sort as $key => $itemSort) {
if (in_array($key, $properties)) {
$order[$key] = $itemSort;
} else {
$order['PROPERTY_' . $key] = $itemSort;
}
}
foreach ($properties as $propertyCode) {
if (in_array($propertyCode, ["ID", "IBLOCK_ID", "NAME", "SORT", "IBLOCK_SECTION_ID", 'CREATED_BY', "TIMESTAMP_X"])) {
continue;
}
$propertyCodeTmp = str_replace('PROPERTY_', '', $propertyCode);
$props = CIBlockProperty::GetList(["sort" => "asc", "name" => "asc"], ["ACTIVE" => "Y", "IBLOCK_ID" => $iblockId, "CODE" => $propertyCodeTmp]);
$arrNumberTypeProperties = [];
if ($propFields = $props->GetNext()) {
if ($propFields['PROPERTY_TYPE'] == 'E') {
$fields[$propertyCode] = 'PROPERTY.PROPERTY_' . $propFields["ID"] . '_REF.NAME';
} else {
$fields[$propertyCode] = 'PROPERTY.PROPERTY_' . $propFields["ID"];
}
if ($propFields['PROPERTY_TYPE'] == 'S') {
$arrNumberTypeProperties[] = $propertyCode;
}
}
if ($filter[$propertyCode]) {
if (in_array($propertyCode, $arrNumberTypeProperties)) {
$filter['=' . $propertyCode] = $filter[$propertyCode];
} else {
if (!is_array($filter[$propertyCode])) {
//$filter[$propertyCode] = '%' . str_replace('%', '', $filter[$propertyCode]) . '%';
$filter[$propertyCode] = str_replace('%', '', $filter[$propertyCode]);
}
}
}
}
Bitrix\Iblock\IblockElementPropertyTable::setProperties($iblockId);
$params = [
'order' => $order,
'filter' => $filter,
'select' => $fields,
'limit' => $nav->getLimit(),
'offset' => $nav->getOffset(),
'count_total' => 1,
];
$params['runtime'] = [
'PROPERTY' => [
'data_type' => 'Bitrix\Iblock\IblockElementProperty',
'reference' => ['=this.ID' => 'ref.IBLOCK_ELEMENT_ID'],
],
];
$dbItems = ElementTable::getList($params);
$nav->allowAllRecords(false)
->setRecordCount($dbItems->getCount())
->setPageSize($navParams['nPageSize'])
->initFromUri();
return $dbItems;
} |
Вот код вызова этого метода:
| Код |
|---|
$gosServices = getList($iBlockData['ID'], $dirParams['FIELDS'], $filter, $nav, $navParams, $sort); |
Есть 3 элемента, которых свойство UL_FULL_NAME (Полное наименование юридического лица) равно "Государственная корпорация Ромашка". А есть ещё 50 элементов, у которых это свойство равно "Государственная корпорация Рога и копыта".
Так вот. Если я в метод в фильтр $filter передаю PROPERTY_UL_FULL_NAME значение "Государственная корпорация Ромашка" - то эти 3 элемента корректно находятся. А если передаю PROPERTY_UL_FULL_NAME со значением "Государственная корпорация" - то не находится ничего. Подскажите пожалуйста, как правильно переписать метод так, чтоб при передаче в фильтр подстроки "Государственная корпорация" метод находил бы все элементы, у которых в свойсте UL_FULL_NAME встречается эта подстрока, а не только по точному совпадению?