связаны свойством "Привязка к элементу инфоблока". Нужно отобразить в шаблоне компонента bitrix:main.site.selector ссылку на связанный элемент (компонент вызывается в header.php).
Устанавливаю свойство страницы в component_epilog.php со значением DETAIL_PAGE_URL связанного элемента:
if (!empty($arResult['PROPERTY_NEWS_ID_DETAIL_PAGE_URL'])) { // свойство "Привязка к элементу инфоблока"
$APPLICATION->SetPageProperty('link', $arResult['PROPERTY_NEWS_ID_DETAIL_PAGE_URL']);
}
Отображаю в template.php bitrix:main.site.selector свойство: $APPLICATION->ShowProperty('link');
Внимание вопросы:
1. Возможно ли проверить внутри bitrix:main.site.selector существует ли свойство страницы link? Если существует, то выводить его содержимое, иначе выводить ссылку на главную страницу иноязычного сайта (например, en/ для англоязычной языковой версии).
2. Допускается ли использование $APPLICATION->ShowProperty() в template.php кэшируемого компонента?
1 а в чем проблема в условии где вы setpageproperty устанавливаете добавить else и там установить ссылку на английскую версию главной? 2 нет
помню давно такая задача была, а денег у клиента не было. сделал обычный запрос через get_headers, если ответ 200 ОК, то ссылка на другом языке есть и можно выводить, иначе на главную
1. На самом деле мне нужна ссылка не на главную страницу, а на физически существующую аналогичную страницу другой языковой версии (либо на уровень выше, если такой страницы нет). Получаю в result_modifier.php bitrix:main.site.selector (см. ниже). То есть, внутри bitrix:main.site.selector невозможно проверить существование свойства страницы? Единственным возможным вариантом будет получать из DETAIL_PAGE_URL только последний фрагмент (/en/element/)? /** * @param $directory * @return mixed */ $getDirectory = function (string $directory) use (&$getDirectory) { $isExist = (new Directory(Application::getDocumentRoot() . $directory))->isExists(); if ($isExist) { return $directory; } return $getDirectory(dirname($directory) . DIRECTORY_SEPARATOR); };
в технических требованиях к задаче указано, что элементы должны быть связаны
2. Если нельзя вызвать $APPLICATION->ShowProperty() в template.php, то как тогда обойти? С кэшированием проверил - вообще работает
Напишите свою отложенную функцию и делайте в ней какие угодно проверки
с помощью AddBufferContent? Изучу вопрос, спасибо! Подскажите, пожалуйста, можно $APPLICATION->ShowProperty() в template.php кэшируемого компонента вызвать?
Я могу ошибаться, но кэширование компонента в этом случае отключается
Show - можно, но нужно проверять. Результат попадет в кеш. Set нельзя (только в component_epilog)
Ладно, проверю) В bitrix/ нашел использование ShowProperty() только в template.php некэшируемых компонентов
Мм рекурсия... Ну сути не меняет же - setpageproperty($getDirectory('/en/' . $arResult[DETAIL PAGE URL])
Последний элемент это как правило символьный код, то есть $arResult[CODE]
помню как то, Виталик решил перед выводом главного меню сайта (1.5-2к шт) проверять статус ответа каждой ссылки))) короче, с этим нужно аккуратно
Я правильно понял, что можно использовать $APPLICATION->ShowProperty() внутри template.php bitrix:main.site.selector, так как здесь шаблон компонента выносится из кешируемой области (CONTENT пуст) Файл кэша: $ser_content = 'a:2:{s:7:"CONTENT";s:0:"";s:4:"VARS";a:1:{s:8:"arResult";a:1:{s:5:"SITES";a:2:{i:0;a:6:{s:3:"LID";s:2:"s1";s:4:"NAME";s:2:"RU";s:4:"LANG";s:2:"ru";s:3:"DIR";s:1:"/";s:7:"DOMAINS";s:0:"";s:7:"CURRENT";s:1:"Y";}i:1;a:6:{s:3:"LID";s:2:"en";s:4:"NAME";s:2:"EN";s:4:"LANG";s:2:"en";s:3:"DIR";s:4:"/en/";s:7:"DOMAINS";s:0:"";s:7:"CURRENT";s:1:"N";}}}}}'; Кусок кода из bitrix:main.site.selector/component.php: if ($bCache && $cache->InitCache($arParams["CACHE_TIME"], $CACHE_ID, $CACHE_PATH)) { $vars = $cache->GetVars(); $arResult = $vars["arResult"]; } else { if ($bCache) { $cache->StartDataCache(); } // Запрос данных и формирование массива $arResult if ($bCache) { $cache->EndDataCache( array( "arResult" => $arResult, ) ); } } $this->IncludeComponentTemplate();
А почему через js не хотите сделать? Намного проще и чище
Обсуждают сегодня