Здравствуйте. Помогите решить загадку. Какую логику можно придумать для ситуации ниже? Нужно сделать поиск по трём полям, одно из которых у SKU, а еще 2 у товара.
Сделал в админке страничку для продавцов-консультантов с прайс-листом и остатками и возможностью быстрого поиска. Торговый каталог состоит из двух инфоблоков: товары (IBLOCK_ID = 129) и их SKU (IBLOCK_ID = 130). В первом есть простые товары (TYPE == 1) и товары со SKU (TYPE == 1)
html-таблица через main.ui.filter и main.ui.grid. Колонки "Имя", "Поставщик", "Артикул" + 5 колонок с остатками по магазинам и цены.
В Таблицу вывожу инфу следующим образом: Сначала один CIBlockElement::GetList по товарам, а потом если это товар со sku, то CIBlockElement::GetList по каждому такому товару.
Примерно так:[CODE]$res = CIBlockElement::GetList($sort, $arFilterElement , false, $nav_params, $arSelectElement);
while ($ar_res = $res->GetNext()) {
if ($ar_res['TYPE'] == 3) {
$resSKU = CIBlockElement::GetList($sort,$arFilterSKU , false, false, $arSelectSKU);
while ($arSKU = $resSKU->GetNext()) {
$arOffers[] = $arSKU;
}
} else {
$arOffers[] = $ar_res;
}
}
// Далее вывод $arOffers в main.ui.grid
[/CODE]
Получается в таблице простые товары + SKU. И нужно искать сразу по полям/свойствам NAME PROPERTY_VENDOR PROPERTY_ARTICLE
Фильтр $arFilterElement и $arFilterSKU формирую вот так:[CODE]// Товар: NAME = Матрас1, PROPERTY_VENDOR = Фабрика1, PROPERTY_ARTICLE = Артикул1
// SKU: NAME = Матрас1 (Размер1), PROPERTY_VENDOR = false, PROPERTY_ARTICLE = false
// SKU: NAME = Матрас1 (Размер2), PROPERTY_VENDOR = false, PROPERTY_ARTICLE = false
// SKU: NAME = Матрас1 (Размер3), PROPERTY_VENDOR = false, PROPERTY_ARTICLE = false
$arSearch = 'Матрас1 Размер1 Фабрика1 Артикул1';
$arWords = explode(" ", $arSearch);
foreach ($arWords as $word) {
$arFilterNameAND[] = ['NAME' => '%'.$word.'%'];
$arFilterVendorOrNameOrArt[] = [
'LOGIC' => 'OR',
['NAME' => '%'.$word.'%'],
['PROPERTY_VENDOR' => '%'.$word.'%'],
["PROPERTY_ARTICLE" => "%".$word."%"]
];
}
$resSubQ2 = CIBlockElement::GetList($sort['sort'],["IBLOCK_ID"=> 130,"ACTIVE" => 'Y',$arQuantityFilter,$arFilterNameAND] , false, false, ['PROPERTY_CML2_LINK']);
while ($ar_resSubQ2 = $resSubQ2->GetNext()) {
$idsFromSubQueryesWithName[] = $ar_resSubQ2['PROPERTY_CML2_LINK_VALUE'];
}
$resSubQ1 = CIBlockElement::GetList($sort['sort'],["IBLOCK_ID"=> 130,"ACTIVE" => 'Y',$arQuantityFilter] , false, false, ['PROPERTY_CML2_LINK']);
while ($ar_resSubQ1 = $resSubQ1->GetNext()) {
$idsFromSubQueryesWithoutName[] = $ar_resSubQ1['PROPERTY_CML2_LINK_VALUE'];
}
$arFilterElement = ['IBLOCK_ID' => 129, 'ACTIVE' => "Y"];
$arFilterElement[0]['LOGIC'] = "OR";
$arFilterElement[0][] = ['TYPE' => 1, $arQuantityFilter,$arFilterVendorOrNameOrArt];
if ($idsFromSubQueryesWithName)
$arFilterElement[0][] = ['TYPE' => 3, 'ID' => $idsFromSubQueryesWithName];
if ($idsFromSubQueryesWithoutName)
$arFilterElement[0][] = ['TYPE' => 3, 'ID' => $idsFromSubQueryesWithoutName, $arFilterVendorOrNameOrArt];
// Фильтр для SKU
if ($arFilterNameAND) {
$arFilterSKU = array_merge($arFilterSKU,$arFilterNameAND);
}
[/CODE]
Поиск только по 3 полям "Наименование", "Поставщик Товара", "Артикул". Отдельный фильтр на каждое поле не подходит. Нужен именно поиск.
Если запросить без размера (в наименовании sku) "Матрас1 Фабрика1 Артикул1", то всё находит верно
Если запросить с размером (в наименовании sku) "Матрас1 Размер1 Фабрика1 Артикул1", то естественно не находит, так как в SKU нет совпадений по строкам "Фабрика1" "Артикул1".
Никак не могу придумать логику для второго случая. Кто-нибудь может направить в нужное русло?
Я понимаю, что в моём случае запрос через getlist это может быть садомазохизм, и готов рассмотреть другие варианты. Но мне нужны цены, остатки по складам и работа с main.ui.filter и main.ui.grid, а также постраничная навигация. Getlist всё это даёт и прайс на нём я уже сделал и люди активно им пользуются, но вот понадобилось добавить поиск по поставщику для торговых предложений и я попал в тупик. Через фильтр в отдельном поле "поставщик" не подходит. Нужно именно через поиск, так как на смартфонах настраивать фильтры не удобно.
Вопрос возможно решился бы легко, если бы можно было фильтровать по значениям свойств связанных элементов. Я бы просто при выборке sku указал бы артикул и поставщика через свойство привязки к товару. Но в документации указано что фильтровать можно только по значениям ПОЛЕЙ связанных элементов и далее перечисляются некоторые поля.
Самый крайний случай, писать скрипт на cron, чтобы он дублировал свойства поставщик и артикул в торговые предложения. Но это такой костылище))