Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Как управлять навигацией?

00 голосов
5
Вывожу элементы инфоблока примерно так:
Код
$arFilter = Array("IBLOCK_ID"=>1, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$arSelect = Array("ID", "NAME", "DETAIL_PAGE_URL", "PREVIEW_PICTURE", "PRICE_base");
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>12), $arSelect);
$res->NavStart(12);
while($ob = $res->GetNextElement())
{
  $arFields = $ob->GetFields();
  $arProperty = $ob->GetProperties();

  //здесь еще условия типа
  if ($arProperty["S_1"]["VALUE"] > 0 || $arProperty["S_2"]["VALUE"] > 0) {
     echo $arFields["NAME"];
  }

}
$res->NavPrint();

Думаю суть понятна, нужно выводить элементы и фильтровать по свойствам используя "ИЛИ".
Но при такой конструкции "ломается" полностью навигация. То есть например CIBlockElement::GetList возвращает 20 элементов, а при выводе по условию 10 отсеиваются, а навигация выводится как для 20 элементов.
Как решить эту проблему?
спросил 15 Дек, 13 от cartmen (460 баллов)

5 Ответы

00 голосов
По моему очевидно.
Введите проверку в $arFilter
ответил 23 Фев, 14 от spamer (500 баллов)
00 голосов
Цитата
По моему очевидно.
Введите проверку в $arFilter

Ну это вы сказали не подумав. Либо я не до конца знаю всех возможностей массива $arFilter

В данном примере два свойства, если любое одно из этих свойств удовлетворяет моему условию, то элемент отображается.
Если сделать:
Код
$arFilter = Array("IBLOCK_ID"=>1, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", ">S_1"=>0, ">S_2"=>0);

то будут выводится элементы в которых S_1 И S_2 больше 0, а надо выводить элементы в которых S_1 ИЛИ S_2 больше 0.
ответил 14 Июнь, 14 от cartmen (460 баллов)
00 голосов
Нет, Вы все знаете верно. Вот кусочек кода, который собирает WHERE (\bitrix\modules\iblock\classes\general\iblockelement.php строка 1371)
Код
$sWhere .= " AND (".$arSqlSearch[$i].") ";


Все свойства между собой соединяются через AND, а внутри свойств через OR.

Цитата
Wincert пишет:
Ну это вы сказали не подумав
...
Но при такой конструкции "ломается" полностью навигация. То есть например CIBlockElement::GetList возвращает 20 элементов, а при выводе по условию 10 отсеиваются, а навигация выводится как для 20 элементов.
Как решить эту проблему?


Так вот в данном случае, что бы не ломалась навигация, Вы должны изменить фильтр. А как изменить, это уже 2й вопрос.

Или сделать свою навигацию, сформируйте массив страниц и на вывод его пошлите.
Код
$arResult["NAV_STRING"] = $rsElement->GetPageNavStringEx($navComponentObject, $arParams["PAGER_TITLE"], $arParams["PAGER_TEMPLATE"], $arParams["PAGER_SHOW_ALWAYS"]);

Код
<?=$arResult["NAV_STRING"]?>

Код построения навигации должен вызываться в шаблоне. На вход шаблона -> Ваш массив с навигацией. То есть
Вы напишите свой компонент )).
ответил 12 Окт, 14 от spamer (500 баллов)
00 голосов
shevchik.newsite
Свои компоненты не разу не писал, поэтому не знаю что откуда "растет". Нормального материала по их написанию тоже не могу найти. Может как-то по другому можно выводить элементы и фильтровать по свойствам через "ИЛИ"?
Компонент system.pagenavigation мне не поможет случайно? Его описание я тоже не нашел.
Ну или ткните меня в материал по написанию компонентов.
ответил 12 Фев, 15 от cartmen (460 баллов)
00 голосов
Лучше как и говорил изменить фильтр. Если сложно - посмотрите структуру данных, может вы сможете объеденить S_1 и >S_2 на уровне хранения данных (тогда и проблема решиться сама собой - тем более что будет и логично по моему)

А так попробуйте следующим образом.
Копируете любой компонент в папку /bitrix/components/<ваше название>
И подключаете его на страницу
Потом через
Код
<pre><?print_r($arResult["NAV_STRING"]);?></pre>
смотрите что нужно и создаете такой же массив.

Но лучше постарайтесь объеденить два поля.
ответил 24 Май, 15 от spamer (500 баллов)

Похожие вопросы

0 голосов
2 ответов
спросил 16 Фев, 14 от Kania (5,180 баллов)
0 голосов
6 ответов
0 голосов
9 ответов
спросил 10 Май, 13 от 300 (220 баллов)