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

Как не выводить в фильтре поля по свойствам, у которых нет значений

00 голосов
9
На странице расположен фильтр по свойствам.
Внизу список связанных элементов, которые и фильтруются.
Для разных страниц, элементы различны и свойства у них также различны, хотелось бы выводить поля фильтра только по тем свойствам, у которых есть значения.
Никак не получается реализовать.
Надеюсь на Вашу помощь.

Часть кода компонента
Код
foreach($arResult["arrProp"] as $prop_id=>$arProp)
{
   $res = "";
   $arResult["arrInputNames"][$FILTER_NAME."_pf"]=true;
   switch ($arProp["PROPERTY_TYPE"])
   {
      case "L":

         $name = $FILTER_NAME."_pf[".$arProp["CODE"]."]";
         $value = $arrPFV[$arProp["CODE"]];
         $res =    '<select';
         if ($arProp["MULTIPLE"]=="Y")
            $res .= ' multiple name="'.$name.'[]"';
         else
            $res .= ' name="'.$name.'"';
         $res .= ' size="'.$arParams["LIST_HEIGHT"].'">';
         $res .= '<option value="">'.GetMessage("IBLOCK_ALL").'</option>';
         foreach($arProp["VALUE_LIST"] as $key=>$val)
         {
            $res .= '<option';
            if($key==$arrPFV[$arProp["CODE"]])
               $res .= ' selected';
            $res .= ' value="'.htmlspecialchars($key).'">'.htmlspecialchars($val).'</option>';
         }
         $res .= '</select>';

         if ($arProp["MULTIPLE"]=="Y")
         {
            if (is_array($value) && count($value)>0)
               ${$FILTER_NAME}["PROPERTY"][$arProp["CODE"]] = $value;
         }
         else
         {
            if (strlen($value)>0) 
               ${$FILTER_NAME}["PROPERTY"][$arProp["CODE"]] = $value;
         }
         break;


}
   if(res)
      $arResult["ITEMS"][] = array("NAME" => htmlspecialchars($arProp["NAME"]), "INPUT" => $res);



Часть шаблона вывода фильтра

Код
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<form name="<?=$arResult["FILTER_NAME"]."_form"?>" action="" method="get">
   <?foreach($arResult["ITEMS"] as $arItem):
      if(array_key_exists("HIDDEN", $arItem)):
         echo $arItem["INPUT"];
      endif;
   endforeach;?>
   <table class="data-table" cellspacing="0" cellpadding="2">
   <thead>
      <tr>
         <td colspan="2" align="center"><?=GetMessage("IBLOCK_FILTER_TITLE")?></td>
      </tr>
   </thead>
   <tbody>
      <?foreach($arResult["ITEMS"] as $arItem):?>
         <?if(!array_key_exists("HIDDEN", $arItem)):?>
            <tr>
               <td valign="top"><?=$arItem["NAME"]?>:</td>
               <td valign="top"><?=$arItem["INPUT"]?></td>
            </tr>
         <?endif?>
      <?endforeach;?>
   </tbody>


Нужно делать дополнительный запрос перед выводом полей фильтра, но как это сделать не могу сообразить.

Заранее спасибо за варианты!
спросил 03 Май, 13 от Emir (420 баллов)

9 Ответы

00 голосов
По пробуйте проверить переменную на наличие значения перед выводом

вот функция empty
ответил 03 Май, 13 от Lekar (2,220 баллов)
00 голосов
Добавила перед
Код
tr>
   <td valign="top"><?=$arItem["NAME"]?>:</td>
   <td valign="top"><?=$arItem["INPUT"]?></td>
      </tr>


Код
<?if (empty($arItem)):?>


Перестали вообще выводиться поля фильтра.
ответил 03 Май, 13 от Emir (420 баллов)
00 голосов
Цитата
Надежда Ховрина пишет:
Перестали вообще выводиться поля фильтра.



Код

int empty(mixed var);
Возвращает false, если var существует и имеет не пустое или не нулевое значение; true в обратном случае. 




Вам нужно проверить, если значение есть, выводить фильтр ? Так?

Просто сделайте проверку, если есть значение в свойстве значит показать фильтр...
ответил 05 Июль, 13 от Lekar (2,220 баллов)
00 голосов
Мне кажется, что я как-то непонятно написала.

Например есть Товар1, у которого есть свойства:
Свойство1, Свойство2
Товар2, у которого есть свойства:
Свойство1, Свойство2
Товар3, у которого есть свойства:
Свойство3, Свойство4
Товар4, у которого есть свойства:
Свойство3, Свойство4

На странице, где представлены товары: Товар1, Товар2, должен выводиться фильтр по свойствам Свойство1, Свойство2.
На странице, где представлены товары: Товар3, Товар4, должен выводиться фильтр по свойствам Свойство3, Свойство4.

Страница вывода одна и та же.

Какой запрос нужно сделать, чтобы фильтр выглядел данным образом и фильтровал только по имеющимся свойствам?

Заранее спасибо за варианты.
ответил 08 Окт, 13 от Emir (420 баллов)
00 голосов
Все правильно! Вам нужно до вывода фильтра, проверить свойство на наличие значение. И если значение есть
то вывести фильтр по этому свойству, если нет то нет.
ответил 08 Янв, 14 от Lekar (2,220 баллов)
00 голосов
Зачем проверять значение переменной, если там всегда находится html-код? smile:(
Мне же нужно узнать находятся ли среди данных свойств в списке фильтра те, которые можно использовать для данного продукта? А там же находятся общие свойства для всех продуктов инфоблока?
ответил 25 Апр, 14 от Emir (420 баллов)
00 голосов
Цитата
Надежда Ховрина пишет:
Зачем проверять значение переменной, если там всегда находится html-код?

Мне же нужно узнать находятся ли среди данных свойств в списке фильтра те, которые можно использовать для данного продукта? А там же находятся общие свойства для всех продуктов инфоблока?




Все правильно, к определенному продукту присвоены определенные свойства, причем тут html код ?
Значение или есть или нет.
ответил 21 Авг, 14 от Lekar (2,220 баллов)
00 голосов
Спасибо. Буду пробовать.
ответил 26 Дек, 14 от Emir (420 баллов)
00 голосов
Интересно, данная проблема была решена? Интересует, в часности, можно ли её решить правкой шаблона или нужно, всё таки, кастомизировать сам компонент? Может кто-нибудь реализовывал?
ответил 15 Апр, 15 от voro6 (140 баллов)