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

Отбор списка элемента инфоблока по свойству

00 голосов
6
Суть проблемы:
Нужно вывести на странице список элементов инфболка с отбором по значению его свойства. Свойство с симв. кодом STATUS.
Создал страницу, разместил компонент "список новостей", в шаблоне компонента вставил условие: 

Код
<?if($arElement["DISPLAY_PROPERTIES"]["STATUS"]["DISPLAY_VALUE"] == "прекращен"):?>
Такой способ не совсем подходит, постраничная навигация не смотрит на отбор и дробит страницы с учетом полного списка,
а хотелось бы корректно выводить постраничную навигацию


Код
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<div class="catalog-section">
<?if($arParams["DISPLAY_TOP_PAGER"]):?>
   <?=$arResult["NAV_STRING"]?><br />
<?endif;?>

<table cellpadding="0" cellspacing="0" border="0" width="100%">
<? $color='trdd'; ?>   
<?foreach($arResult["ITEMS"] as $cell=>$arElement):?>
<?if($arElement["DISPLAY_PROPERTIES"]["STATUS"]["DISPLAY_VALUE"] == "прекращен"):?>   
      <?
      $this->AddEditAction($arElement['ID'], $arElement['EDIT_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_EDIT"));
      $this->AddDeleteAction($arElement['ID'], $arElement['DELETE_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BCS_ELEMENT_DELETE_CONFIRM')));
      ?>
         <? if ($color=='trdd') $color = 'trodd';
    else $color = 'trdd';?>

      <tr class="<?echo $color;?>">
<td width="250px"><a href="<?=$arElement["DETAIL_PAGE_URL"]?>"><?=$arElement["DISPLAY_PROPERTIES"]["SV_NUM"]["DISPLAY_VALUE"];?></a></td>
<td valign="top" id="<?=$this->GetEditAreaId($arElement['ID']);?>">

         <a href="<?=$arElement["DETAIL_PAGE_URL"]?>"><?=$arElement["DISPLAY_PROPERTIES"]["NAME_ORG"]["DISPLAY_VALUE"]?></a>
                  
      </td></tr>   
                <?endif?>
      <?endforeach; // foreach($arResult["ITEMS"] as $arElement):?>

      

</table>
<?if($arParams["DISPLAY_BOTTOM_PAGER"]):?>
   <br /><?=$arResult["NAV_STRING"]?>
<?endif;?>
</div>



Подскажите более правильный способ отбора.
спросил 25 Окт, 13 от KYKOLKA (140 баллов)

6 Ответы

00 голосов
Используйте компоненту catalog.section и фильтром ограничьте список элементов. В этом случае навигация будет работать. В вашем же примере как ни ковыряй шаблон - навигация отработана еще в компоненте, поэтому 2-й вариант  - это кастомизирование компоненты
ответил 22 Ноя, 13 от MUTANTISH (160 баллов)
00 голосов
Использовал фильтр, ничего не выводится. Подскажите где ошибка:


Код
<?
$arParams["FILTER_NAME"]="arFilter";
global $arFilter;
$arFilter = array("IBLOCK_ID"=>"9","PROPERTY_STATUS"=>"прекращен");

$APPLICATION->IncludeComponent("bitrix:catalog.section", ".default", array(
   "IBLOCK_TYPE" => "Zagruzh",
   "IBLOCK_ID" => "9",
   "SECTION_ID" => $_REQUEST["SECTION_ID"],
   "SECTION_CODE" => "",
   "SECTION_USER_FIELDS" => array(
      0 => "",
      1 => "",
   ),
   "ELEMENT_SORT_FIELD" => "sort",
   "ELEMENT_SORT_ORDER" => "asc",
   "FILTER_NAME" => $arParams["FILTER_NAME"],
   "INCLUDE_SUBSECTIONS" => "Y",
   "SHOW_ALL_WO_SECTION" => "Y",
   "PAGE_ELEMENT_COUNT" => "30",
   "LINE_ELEMENT_COUNT" => "1",
   "PROPERTY_CODE" => array(
      0 => "STATUS",
      1 => "",
   ),
   "SECTION_URL" => "",
   "DETAIL_URL" => "",
   "BASKET_URL" => "/personal/basket.php",
   "ACTION_VARIABLE" => "action",
   "PRODUCT_ID_VARIABLE" => "id",
   "PRODUCT_QUANTITY_VARIABLE" => "quantity",
   "PRODUCT_PROPS_VARIABLE" => "prop",
   "SECTION_ID_VARIABLE" => "SECTION_ID",
   "AJAX_MODE" => "N",
   "AJAX_OPTION_JUMP" => "N",
   "AJAX_OPTION_STYLE" => "Y",
   "AJAX_OPTION_HISTORY" => "N",
   "CACHE_TYPE" => "A",
   "CACHE_TIME" => "36000000",
   "CACHE_GROUPS" => "Y",
   "META_KEYWORDS" => "-",
   "META_DESCRIPTION" => "-",
   "BROWSER_TITLE" => "-",
   "ADD_SECTIONS_CHAIN" => "N",
   "DISPLAY_COMPARE" => "N",
   "SET_TITLE" => "Y",
   "SET_STATUS_404" => "N",
   "CACHE_FILTER" => "N",
   "PRICE_CODE" => array(
   ),
   "USE_PRICE_COUNT" => "N",
   "SHOW_PRICE_COUNT" => "1",
   "PRICE_VAT_INCLUDE" => "Y",
   "PRODUCT_PROPERTIES" => array(
   ),
   "USE_PRODUCT_QUANTITY" => "N",
   "DISPLAY_TOP_PAGER" => "N",
   "DISPLAY_BOTTOM_PAGER" => "Y",
   "PAGER_TITLE" => "Товары",
   "PAGER_SHOW_ALWAYS" => "Y",
   "PAGER_TEMPLATE" => "",
   "PAGER_DESC_NUMBERING" => "N",
   "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
   "PAGER_SHOW_ALL" => "Y",
   "AJAX_OPTION_ADDITIONAL" => ""
   ),
   false
);?> 
<div>
  <br />
</div>
 
 
Тип свойства STATUS - список. 

Если убрать из фильтра "PROPERTY_STATUS"=>"прекращен" , то выводятся все элементы 9го инфоблока, как и должно быть. Название и значение свойства верны, вставлял копированием.
ответил 02 Март, 14 от KYKOLKA (140 баллов)
00 голосов
Попробуйте так:

Код
$GLOBALS['arrFilter']["PROPERTY_STATUS"] => "прекращен";
А в компоненте передайте название фильтра: arrFilter
ответил 22 Июнь, 14 от MUTANTISH (160 баллов)
00 голосов
Только название фильтра передайте как

"FILTER_NAME" => "arrFilter",
ответил 21 Окт, 14 от MUTANTISH (160 баллов)
00 голосов
То есть, должно получится так?


Код
 <?
$GLOBALS['arrFilter']["PROPERTY_STATUS"] => "прекращен";

$APPLICATION->IncludeComponent(
   "bitrix:catalog.section",
   "",
   Array(
      "AJAX_MODE" => "N",
      "IBLOCK_TYPE" => "Zagruzh",
      "IBLOCK_ID" => "9",
      "SECTION_ID" => $_REQUEST["SECTION_ID"],
      "SECTION_CODE" => "",
      "SECTION_USER_FIELDS" => array(),
      "ELEMENT_SORT_FIELD" => "sort",
      "ELEMENT_SORT_ORDER" => "asc",
      "FILTER_NAME" => "arrFilter",
      "INCLUDE_SUBSECTIONS" => "Y",
      "SHOW_ALL_WO_SECTION" => "Y",
      "SECTION_URL" => "",
      "DETAIL_URL" => "",
      "BASKET_URL" => "/personal/basket.php",
      "ACTION_VARIABLE" => "action",
      "PRODUCT_ID_VARIABLE" => "id",
      "PRODUCT_QUANTITY_VARIABLE" => "quantity",
      "PRODUCT_PROPS_VARIABLE" => "prop",
      "SECTION_ID_VARIABLE" => "SECTION_ID",
      "META_KEYWORDS" => "-",
      "META_DESCRIPTION" => "-",
      "BROWSER_TITLE" => "-",
      "ADD_SECTIONS_CHAIN" => "N",
      "DISPLAY_COMPARE" => "N",
      "SET_TITLE" => "Y",
      "SET_STATUS_404" => "N",
      "PAGE_ELEMENT_COUNT" => "30",
      "LINE_ELEMENT_COUNT" => "1",
      "PROPERTY_CODE" => array("STATUS"),
      "PRICE_CODE" => array(),
      "USE_PRICE_COUNT" => "N",
      "SHOW_PRICE_COUNT" => "1",
      "PRICE_VAT_INCLUDE" => "Y",
      "PRODUCT_PROPERTIES" => array(),
      "USE_PRODUCT_QUANTITY" => "N",
      "CACHE_TYPE" => "A",
      "CACHE_TIME" => "36000000",
      "CACHE_FILTER" => "N",
      "CACHE_GROUPS" => "Y",
      "DISPLAY_TOP_PAGER" => "N",
      "DISPLAY_BOTTOM_PAGER" => "Y",
      "PAGER_TITLE" => "Товары",
      "PAGER_SHOW_ALWAYS" => "Y",
      "PAGER_TEMPLATE" => "",
      "PAGER_DESC_NUMBERING" => "N",
      "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
      "PAGER_SHOW_ALL" => "Y",
      "AJAX_OPTION_JUMP" => "N",
      "AJAX_OPTION_STYLE" => "Y",
      "AJAX_OPTION_HISTORY" => "N"
   ),
false
);?>
ответил 20 Фев, 15 от KYKOLKA (140 баллов)
00 голосов
Да, но это только предположение. Надо пробовать
ответил 31 Май, 15 от MUTANTISH (160 баллов)

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

0 голосов
8 ответов
0 голосов
4 ответов
спросил 25 Янв, 14 от Lata (220 баллов)
0 голосов
2 ответов
0 голосов
1 ответ
спросил 16 Фев, 14 от CeBep (300 баллов)
0 голосов
6 ответов