Как связать детальную «новость» с элементами каталога по их свойствам?
Есть комплексный каталог с элементами. В элементах есть свойство AKTIV_VESH3 , которое подбирается из инфоблока "справочники" "активные вещества"
Есть страница, которая выводит список активных веществ через компонент "новости" и детальная "новость".
Элемент каталога содержит в себе в т.ч. ряд активных веществ и ссылку для перехода к детальному описанию соответственно на детальную страницу новости.
Теперь у меня встал вопрос разместить на детальной странице новости элементы каталога, которые включают AKTIV_VESH3
Каким образом выполнить в рамках компонентов битрикс? Или писать велосипед в result_modifier.php и component_epilog.php
Чтобы не вовлекать в кешируемую область шаблона - лучший вариант(конечно на мой взгляд) сделать в result_modifier дополнительный элемент массива $arResult,который будет проксироваться в component_epilog(как это делается - гуглится "result_modifier и component_epilog одновременно"). И уже по значению этой переменной делать фильтр для компонента список новостей, который и размещаем в component_epilog
upd решение из ветки комментариев
// глобальный массив для фильтра
global $arNewsFilter;
// массив в котором мы устанавливаем фильтр по свойству AKTIV_VESH3 который будет соответствовать текущему айдишнику новости
$arNewsFilter = Array ("PROPERTY_AKTIV_VESH3" => $arResult["ID"]);
?>
Я создал эпилог, в нем код. На странице новости разместил bitrix.elemet.section
там указал arNewsFilter
но сволочь все равно не подхватывает... что-то не то делаю :)
так понимаю это ID детальной новости = ID элемента инфоблока "Справочник" "Активные вещества" (в каталоге товаров свойство выбра AKTIV_VESH3 с ID=50 и множественным выбором из этого справочника)
исходя из инструкции я создал эпилог файл /bitrix/templates/.default/components/bitrix/news/template1_news_aktivvesh/bitrix/news.detail/.default:
эпилог:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$arIDs = $arResult["PROPERTIES"]["50"]["VALUE"];
global $arNewsFilter;
if (count ($arIDs) > 0)
{
$arNewsFilter = Array ("ID" => $arIDs);
};
?>
добавил на детальной странице
Получил вывод всего подряд :)
Добавил вывод дебага в подвале, чтоб посмотреть в детальной новости ничего неизменилось, добавил дебаг для темплейта товаров выведенных (взял шаблон list чтоб в строчку пока вывести их):
ORIGINAL_PARAMETERS
ACTION_VARIABLE = action
ADD_PICT_PROP = -
ADD_PROPERTIES_TO_BASKET = Y
ADD_SECTIONS_CHAIN = N
ADD_TO_BASKET_ACTION = ADD
AJAX_MODE = N
AJAX_OPTION_ADDITIONAL =
AJAX_OPTION_HISTORY = N
AJAX_OPTION_JUMP = N
AJAX_OPTION_STYLE = Y
BACKGROUND_IMAGE = -
BASKET_URL = /personal/basket.php
BROWSER_TITLE = -
CACHE_FILTER = N
CACHE_GROUPS = Y
CACHE_TIME = 36000000
CACHE_TYPE = A
COMPATIBLE_MODE = Y
CONVERT_CURRENCY = N
CUSTOM_FILTER =
DETAIL_URL =
DISABLE_INIT_JS_IN_COMPONENT = N
DISPLAY_BOTTOM_PAGER = Y
DISPLAY_COMPARE = N
DISPLAY_TOP_PAGER = N
ELEMENT_SORT_FIELD = sort
ELEMENT_SORT_FIELD2 = id
ELEMENT_SORT_ORDER = asc
ELEMENT_SORT_ORDER2 = desc
ENLARGE_PRODUCT = STRICT
FILTER_NAME = arNewsFilter
HIDE_NOT_AVAILABLE = N
HIDE_NOT_AVAILABLE_OFFERS = N
IBLOCK_ID = 2
IBLOCK_TYPE = catalog
INCLUDE_SUBSECTIONS = Y
LABEL_PROP =
LAZY_LOAD = N
LINE_ELEMENT_COUNT = 3
LOAD_ON_SCROLL = N
MESSAGE_404 =
MESS_BTN_ADD_TO_BASKET = В корзину
MESS_BTN_BUY = Купить
MESS_BTN_DETAIL = Подробнее
MESS_BTN_SUBSCRIBE = Подписаться
MESS_NOT_AVAILABLE = Нет в наличии
META_DESCRIPTION = -
META_KEYWORDS = -
OFFERS_FIELD_CODE
0 =
1 =
OFFERS_LIMIT = 5
OFFERS_SORT_FIELD = sort
OFFERS_SORT_FIELD2 = id
OFFERS_SORT_ORDER = asc
OFFERS_SORT_ORDER2 = desc
PAGER_BASE_LINK_ENABLE = N
PAGER_DESC_NUMBERING = N
PAGER_DESC_NUMBERING_CACHE_TIME = 36000
PAGER_SHOW_ALL = N
PAGER_SHOW_ALWAYS = N
PAGER_TEMPLATE = .default
PAGER_TITLE = Товары
PAGE_ELEMENT_COUNT = 18
PARTIAL_PRODUCT_PROPERTIES = N
PRICE_CODE =
PRICE_VAT_INCLUDE = Y
PRODUCT_BLOCKS_ORDER = price,props,sku,quantityLimit,quantity,b…
PRODUCT_DISPLAY_MODE = N
PRODUCT_ID_VARIABLE = id
PRODUCT_PROPS_VARIABLE = prop
PRODUCT_QUANTITY_VARIABLE = quantity
PRODUCT_ROW_VARIANTS = [{'VARIANT':'2','BIG_DATA':false},{'VARI…
PRODUCT_SUBSCRIPTION = Y
PROPERTY_CODE_MOBILE =
RCM_PROD_ID =
RCM_TYPE = personal
SECTION_CODE =
SECTION_ID =
SECTION_ID_VARIABLE = SECTION_ID
SECTION_URL =
SECTION_USER_FIELDS
0 =
1 =
SEF_MODE = N
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
SHOW_ALL_WO_SECTION = Y
SHOW_CLOSE_POPUP = N
SHOW_DISCOUNT_PERCENT = N
SHOW_FROM_SECTION = N
SHOW_MAX_QUANTITY = N
SHOW_OLD_PRICE = N
SHOW_PRICE_COUNT = 1
SHOW_SLIDER = Y
SLIDER_INTERVAL = 3000
SLIDER_PROGRESS = N
TEMPLATE_THEME = blue
USE_ENHANCED_ECOMMERCE = N
USE_MAIN_ELEMENT_SECTION = N
USE_PRICE_COUNT = N
USE_PRODUCT_QUANTITY = N
COMPONENT_TEMPLATE = list
CURRENT_BASE_PAGE = /aktivnye-veshchestva/342/?back_url_admi…
GLOBAL_FILTER
ID = 0
IBLOCK_ID = 2
IPROPERTY_VALUES
BACKGROUND_IMAGE =
NAV_STRING =
NAV_CACHED_DATA =
При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек .settings.php
Суть моего подхода в вашем случае будет такова:
1. В result_modifier устанавливается
<?
// создаем ключ, который будет кешироваться и проксироваться в component_epilog
$this->__component->SetResultCacheKeys(array("CACHED_AKTIV_VESH3"));
// устанавливаем значение для него
$this->__component->arResult["CACHED_AKTIV_VESH3"] = $arResult['PROPERTIES']['AKTIV_VESH3']['VALUE'];
?>
2. в component_epilog получаем переменную и работаем с этим
$activeVesh3 = $arResult['CACHED_AKTIV_VESH3'];
if(!empty($activeVesh3){
// фильтр называется vesh3Filter чтобы не мог случайно пересечься с другим существующим, ведь мы лезем в глобальную область видимости
$GLOBALS['vesh3Filter'] = ['PROPERTY_AKTIV_VESH3'=>$activeVesh3];
//Подключение компонента с этим фильтром
}
Подключаете компонент, в настройках которого указываете название фильтр, убираете задание ИД раздела, ставите галочку "показывать все элементы, если не задан раздел"
В файле эпилога содержимое $arResult совсем другое, по сравнению с template. И для того чтобы нам получать те же данные - приходится проксировать через ключи кеширования.
В данном случае
<?
// $arResut['PROPERTIES'] будет пустым
$arIDs = $arResult["PROPERTIES"]["50"]["VALUE"];
global $arNewsFilter;
// а раз пустой будет и $arIDs, то и фильтр окажется пустым и не будет применен
if (count ($arIDs) > 0)
{
$arNewsFilter = Array ("ID" => $arIDs);
};
?>
Ivan Eremin, ок, я немного запутался и запутал тебя)
правильно ли я понимаю что в итоге нужно получить ссылки на страницы, тех товаров, у которых активное вещество - текущая страница новости?
я предлагал варианты где нужно вывести элементы с таким же свойством.
в этом случае: изменения result_modifier не нужны, а в component_epilog:
// глобальный массив для фильтра
global $arNewsFilter;
// массив в котором мы устанавливаем фильтр по свойству AKTIV_VESH3 который будет соответствовать текущему айдишнику новости
$arNewsFilter = Array ("PROPERTY_AKTIV_VESH3" => $arResult["ID"]);
?>
Артем, да я сам трое суток над задачей пыхтел, разные варианты пробовал. Начал со стандартных возможностей - но фильтры компонента упорно либо ничего не выводят либо криво работать начинали. В общем огроменное спасибо - последняя строчка прям решила проблему так, как нужно.