Итак, добрый вечер, уважаемые форумчане. Начну с самого начала, а именно с описательной лирики. В данный момент веду завершающие работы по сайту банкетных залов. Естественно в определенном месте (да что уж там, прямо на главной странице) есть этот самый список банкетных залов, а над ним для удобства поиска располагается фильтр оных (дабы более подходящий проще было найти). Как известно и вполне очевидно банкетные залы находятся внутри определенных заведений, потому я создал 2 типа инфоблоков: заведения и непосредственно банкетные залы. Характеристиками зала выступают такие вещи, как вместимость, цена с человека и разностные ништяки (разрешается ли курить в зале и т.д.). Естественно, для каждого зала необходимо знать, у какого метро он находится, в каком административном округе или же районе и дублировать подобные вещи на каждый банкетный зал из группы тех, что находятся в одном заведении — маразм истинный. Для того и был как раз создан тип инфоблока, а затем и сам инфоблок "Заведения", для которого подобные характеристики указываются. Затем, при добавлении нового зала, мы просто указываем в свойстве типа "Привязка к элементам" к какому заведению он относится.
Теперь вернемся непосредственно к фильтру. Отбирать залы по таким критериям как цена и прочим (одним словом, характеристикам именно ЗАЛА) не составило труда (славься документация Битрикса, аминь). Но вот отфильтровать залы по значениям свойств связанных элементов (читаем несколько раз, дабы понять предложение) — проблема. Я накопал немного схожую штуку, в параметры фильтров можно передать вот такое вот значение: PROPERTY_. - фильтр по значениям полей связанных элементов, но это даст мне фильтрацию именно по значениям ПОЛЕЙ, а нужно мне по значениям СВОЙСТВ (ссылка на документацию: https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php).
Я пробовал накрутить эдакую "постфильтрацию", то есть, сначала в параметры вызова компонента передавать список тех характеристик, которые присущи только для залов, а потом уже в шаблоне вывода списка залов средствами API проводить фильтрацию по тем параметрам, которые характерны для ресторанов, в которых эти залы находятся. Работает, да, круто. Но сбивается пагинация, ведь в шаблон вывода передается выборка какого-то определенного размера, а я своими дерзкими и не хитрыми действиями часть выборки не вывожу. То есть, получаем, что залов должно быть на странице 10, а я показываю, например, 3. То есть тоже так себе вариант.
Список банкетных залов выводится компонентом bitix.news-list (если быть совсем точным, то компонентом, созданным на его основе, полной, так скажем, основе).
Повторю вопрос, дабы ни кому не пришлось перечитывать этот талмуд еще раз, чтобы его найти: каким образом можно реализовать фильтрацию по значениям свойств связанных элементов? Заранее большое спасибо.
Небольшая добавка, после недолгого ковыряния файла component.php компонента, опытным путем установлено, что в обработку этому файлу скармливается массив с уже имеющейся выборкой из определенного количества элементов (если настройками пагинации задано 3, значит и будет их 3), потому мои попытки просто дополнить этот массив пройдясь повторно по нескольким кускам кода не увенчались успехом.
Продолжая данный занимательный монолог, немного подправлю предыдущее сообщение, так как оно не есть верное. Коллекция, которую мы получаем для последующей выдачи, образуется как раз таки именно в файле component.php, а именно 238 строка (повторяю, можно с легкостью ориентироваться на компонент bitrix.news-list):
Дальше этот $rsElement разбирается while-ом и заполняет массив $arResult['ITEMS']. Немного поразмыслив над своими поступками, я вспомнил про такую вещь, как подзапросы (https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/SubQuery.php). Мне кажется я приближен к истине, а суть ее такова, что скорее всего нужно внедрить этот самый подзапрос в мой $GLOBALS["arPropFilter"] и как пишется по науке, внедрять его именно к полю ID, то есть итоговая конструкция будет такова:
Код
$GLOBALS["arPropFilter"]["ID"] = CIBlockElement::SubQuery("PROPERTY_restaurant", array(
"IBLOCK_ID" => "1", //id инфоблока "Заведения"
"PROPERTY_region" => "ЦАО" //Пробный регион, дабы увидеть результат работы
));
//Дальнейшее наращивание массива arPropFilter
if (isset($ppl_from))
$GLOBALS["arPropFilter"]["><PROPERTY_ppl_count"] = array($ppl_from, $ppl_to);
Результат данных манипуляций таков: как и раньше, выводятся залы, расположенные в ресторанах других округов. Но это уже становится похожим на правду.
В ядро какбэ не комильфо добавлять даже и пару строчек... Любое обновление - и прощайте ваши наработки, если вы правильно использовали термин ядро.
Я может как то неправильно понял, но вроде для вашей задачи вполне можно использовать arrFilter с необходимыми параметрами, задав в настройках компонента использовать фильтр и имя массиву соответствующее.
И, кстати, так ли уж было необходимо кастомизировать news.list ? Вроде бы 90% функционала реализуется спокойно, без кастомизаций.