У меня есть компонент news.list, в котором уже присутствует фильтрация новостей. Как сделать еще одну фильтрацию для этого же компонента?

Рейтинг: 0Ответов: 1Опубликовано: 06.07.2023

У меня есть компонент news.list, в котором уже присутствует фильтрация новостей по свойству заданных тем. Как сделать еще одну фильтрацию для этого же компонента? Вот мой компонент news.list. В начале уже пытался вывести свойство.

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Новости");

global $USER;
$filter = Array(
   "IBLOCK_ID"=>$arParams["IBLOCK_ID"],
   "ACTIVE"=>"Y",
   "PROPERTY_SHOWLIST"=> $USER->GetID(),
);
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $filter, false, false, Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM", "DETAIL_PAGE_URL"));

?>

<?
$themeId = intval($_GET['sel_theme']);
$themeFilter = array();
$themeCode = '';
$selectedThemeName = '';


if ($themeId > 0) {
    $themeFilter["PROPERTY_THEME"] = $themeId;
} else if (isset($_GET['sel_theme'])) {
    $themeCode = $_GET['sel_theme'];
    $themeFilter = array('PROPERTY_THEME.CODE' => $themeCode);
    $selectedThemeName = getThemeNameByCode($themeCode);
}

function getThemeNameByCode($themeCode) {
    $theme = CIBlockElement::GetList(
        array(),
        array('CODE' => $themeCode),
        false,
        false,
        array('ID', 'NAME')
    )->Fetch();

    if ($theme) {
        return $theme['NAME'];
    }

    return false;
}


?>

<?$APPLICATION->IncludeComponent(
    "bitrix:news.list", 
    "news.list", 
    array(
        "ACTIVE_DATE_FORMAT" => "d.m.Y",
        "ADD_SECTIONS_CHAIN" => "Y",
        "AJAX_MODE" => "N",
        "AJAX_OPTION_ADDITIONAL" => "",
        "AJAX_OPTION_HISTORY" => "N",
        "AJAX_OPTION_JUMP" => "N",
        "AJAX_OPTION_STYLE" => "Y",
        "CACHE_FILTER" => "N",
        "CACHE_GROUPS" => "Y",
        "CACHE_TIME" => "36000000",
        "CACHE_TYPE" => "A",
        "CHECK_DATES" => "Y",
        "DETAIL_URL" => "/news/detail/#ID#/",
        "DISPLAY_BOTTOM_PAGER" => "Y",
        "DISPLAY_DATE" => "Y",
        "DISPLAY_NAME" => "Y",
        "DISPLAY_PICTURE" => "Y",
        "DISPLAY_PREVIEW_TEXT" => "Y",
        "DISPLAY_TOP_PAGER" => "N",
        "FIELD_CODE" => array(
            0 => "",
            1 => "",
        ),
        "SELECTED_THEME_NAME" => $selectedThemeName,
        "FILTER_NAME" => "themeFilter",
        "HIDE_LINK_WHEN_NO_DETAIL" => "N",
        "IBLOCK_ID" => "2",
        "IBLOCK_TYPE" => "news",
        "INCLUDE_IBLOCK_INTO_CHAIN" => "Y",
        "INCLUDE_SUBSECTIONS" => "Y",
        "MESSAGE_404" => "",
        "NEWS_COUNT" => "4",
        "PAGER_BASE_LINK_ENABLE" => "N",
        "PAGER_DESC_NUMBERING" => "N",
        "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
        "PAGER_SHOW_ALL" => "N",
        "PAGER_SHOW_ALWAYS" => "Y",
        "PAGER_TEMPLATE" => "pagination",
        "PAGER_TITLE" => "Новости",
        "PARENT_SECTION" => "",
        "PARENT_SECTION_CODE" => "",
        "PREVIEW_TRUNCATE_LEN" => "",
        "PROPERTY_CODE" => array(
            0 => "",
            1 => "THEME",
            2 => "SHOWLIST",
        ),
        "SET_BROWSER_TITLE" => "Y",
        "SET_LAST_MODIFIED" => "N",
        "SET_META_DESCRIPTION" => "Y",
        "SET_META_KEYWORDS" => "Y",
        "SET_STATUS_404" => "N",
        "SET_TITLE" => "Y",
        "SHOW_404" => "N",
        "SORT_BY1" => "ACTIVE_FROM",
        "SORT_BY2" => "SORT",
        "SORT_ORDER1" => "DESC",
        "SORT_ORDER2" => "ASC",
        "STRICT_SECTION_CHECK" => "N",
        "COMPONENT_TEMPLATE" => "news.list"
    ),
    false
);?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
При этом у меня создано свойство инфоблока Новости - "Показ новости" в котором два значения "Да" и "Нет". И если я в параметрах элемента поставлю Показ новости: Да, то тогда новость должна показываться только авторизованным пользователям и наооборот.

Ответы

▲ 0

Если я правильно понял, то примерно так:

$filter = Array(
   "IBLOCK_ID"=>$arParams["IBLOCK_ID"],
   "ACTIVE"=>"Y",
);
if (!$USER->IsAuthorized()) {
   $filter["PROPERTY_SHOWLIST"] = "N";
}

Тогда неавторизованным будут показываться те новости, у которых PROPERTY_SHOWLIST = N, а авторизванным - без этой проверки.

Правда, я не совсем понял, как $filter соотносится с $themeFilter, и почему $themeFilter не объявлен глобальным, если указан в FILTER_NAME.