В общем, в header.php шаблона по традиции не работает вывод[CODE] $APPLICATION->ShowMeta("keywords");[/CODE]
Умирая, из последних сил нашел такое решение через тему [URL=https://dev.1c-bitrix.ru/support/forum/forum6/topic65247/]https://dev.1c-bitrix.ru/support/forum/forum6/topic65247/[/URL]
Из любого файла шаблона \local\templates\mytemplate\components\bitrix\catalog.section.list\main\
задаем
[CODE]$GLOBALS['APPLICATION']->SetPageProperty("mykeys", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_KEYWORDS"]);
[/CODE]Я сначала прописал это в component_epilog.php потом хотел перенести в template.php Быстрее так будет или хуже т к не кэшируется или это не имеет значения?
А в header.php локального шаблона темы по пути public_html/local/templates/mytemplate вызываю[CODE]<met a name="keywords" content="<?echo $APPLICATION->ShowProperty("mykeys");?>"/>
[/CODE]Вопросы:1) свойство mykeys задается на лету, есть ли в этом какой-то подвох?2) header вызывается до содержимого страницы,как ShowProperty получает нужное значение? Если она "дожидается" загрузки всех компонентов и только потом передает значение, увидят ли это значение боты Яндекса и Гугла?3) Правильно ли вызывать в этом случае ShowProperty из component_epilog.php или лучше из шаблона компонента или из result_modifier.php ?4) Как правильно сделать проверку на непустое значение этой переменной и в случае пустого выводить [CODE]$meta_keywords = $APPLICATION->GetMeta("keywords");if (strlen($meta_keywords)>0) echo $meta_keywords;[/CODE]?
Еще несколько вопросов возникли в ходе моих изысканий, вот примерно их ход, может кто что найдет для себя или подскажет мне ответы
При этом отлично выводятся title и description.Вот такая конструкция выводит ключи какого-то из родителей, но это не интересно[CODE]$meta_keywords = $APPLICATION->GetMeta("keywords");if (strlen($meta_keywords)>0) echo $meta_keywords;
[/CODE]Следуя традициям oldschool seo, решил добиться, чтобы значения выводились именно из поля META KEYWORDS вкладки SEO.Нашел в \local\templates\mytemplate\components\bitrix\catalog.section.list\main\component_epilog.php Там:[CODE]<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
if (is_array($arResult["SECTION"]["PATH"]))
{
$s = array_pop($arResult["SECTION"]["PATH"]);
$GLOBALS['APPLICATION']->SetTitle($s["NAME"]);
$GLOBALS['APPLICATION']->SetPageProperty("title", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_TITLE"]);
$GLOBALS['APPLICATION']->SetPageProperty("description", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_DESCRIPTION"]);
[/CODE]Добавил строку[CODE] $GLOBALS['APPLICATION']->SetPageProperty("keywords", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_KEYWORDS"]);
[/CODE]Через вывод убедился, что она получает правильное значение, но на странице услуги по-прежнему keywords не выводятся. Стал копаться в вызовах компонентов каталога, подставлять
SET_META_KEYWORDS
[CODE]<?$APPLICATION->IncludeComponent(
"bitrix:catalog",
"main",
array(
"SET_META_KEYWORDS" => "Y",
[/CODE]
Пробовал также зайти через доп. параметр "SET_META_KEYWORDS" => "Y",
"LIST_META_KEYWORDS" => "UF_KEYWORDS", но похоже, что ключи теряются где-то в вызовах компонентов, где-то на пути от его обработки из папок битрикса к копиям в local.Компонент листает подразделы в блоке Каталога и нужно всего лишь передавать при этом переменную, содержащую значение поля. Была мысль подцеплять в header.php шаблона эту переменную как глобальную или через сессии.Нашел, где в базе лежат эти ключи и создал простейший запрос, позволяющий вытащить значение по id блока и секции, но опять же эти переменные видны только при работе компонента. Была мысль инклюдить его в header.
Потом попробовал конструкцию вида[CODE]$arSelect = Array("ID", "NAME");
$arFilter = array("IBLOCK_ID" =>"25", "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$resList = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
[/CODE]Вопрос №10. Тут возник второй вопрос: эта штука отлично дергает блоки из раздела Информация, но не видит блоки из раздела Каталог - это так и задумано?Я был готов к тому, чтобы из пути к странице вычленять составляющие и по ним вычислять BLOCK_ID и SECTION[CODE]$folder = $request->getRequestedPageDirectory();
$iblockCode = '';// берем часть $folder до косой черты
$iblockId = IblockIdByCode($iblockCode);
[/CODE]Вопрос №20. Правильно ли я понимаю, что при этом потребовалось бы несколько дополнительных запросов в базу при каждой загрузке страницы и это плохое решение?
Не лучше ли брать block_id и section через правильно настроенный urlrewrite - не будет ли это решение лучше всего вышеописанного?Не лучше ли писать ключи из параметров разделов каталога в переменные сессии?
В modx к id страницы привязаны все поля метатегов, хранящиеся в базе, и не надо ломать голову как их найти и отобразить. В чем недостаток такого решения по сравнению с framework bitrix?
Умирая, из последних сил нашел такое решение через тему [URL=https://dev.1c-bitrix.ru/support/forum/forum6/topic65247/]https://dev.1c-bitrix.ru/support/forum/forum6/topic65247/[/URL]
Из любого файла шаблона \local\templates\mytemplate\components\bitrix\catalog.section.list\main\
задаем
[CODE]$GLOBALS['APPLICATION']->SetPageProperty("mykeys", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_KEYWORDS"]);
[/CODE]Я сначала прописал это в component_epilog.php потом хотел перенести в template.php Быстрее так будет или хуже т к не кэшируется или это не имеет значения?
А в header.php локального шаблона темы по пути public_html/local/templates/mytemplate вызываю[CODE]<met a name="keywords" content="<?echo $APPLICATION->ShowProperty("mykeys");?>"/>
[/CODE]Вопросы:1) свойство mykeys задается на лету, есть ли в этом какой-то подвох?2) header вызывается до содержимого страницы,как ShowProperty получает нужное значение? Если она "дожидается" загрузки всех компонентов и только потом передает значение, увидят ли это значение боты Яндекса и Гугла?3) Правильно ли вызывать в этом случае ShowProperty из component_epilog.php или лучше из шаблона компонента или из result_modifier.php ?4) Как правильно сделать проверку на непустое значение этой переменной и в случае пустого выводить [CODE]$meta_keywords = $APPLICATION->GetMeta("keywords");if (strlen($meta_keywords)>0) echo $meta_keywords;[/CODE]?
Еще несколько вопросов возникли в ходе моих изысканий, вот примерно их ход, может кто что найдет для себя или подскажет мне ответы
При этом отлично выводятся title и description.Вот такая конструкция выводит ключи какого-то из родителей, но это не интересно[CODE]$meta_keywords = $APPLICATION->GetMeta("keywords");if (strlen($meta_keywords)>0) echo $meta_keywords;
[/CODE]Следуя традициям oldschool seo, решил добиться, чтобы значения выводились именно из поля META KEYWORDS вкладки SEO.Нашел в \local\templates\mytemplate\components\bitrix\catalog.section.list\main\component_epilog.php Там:[CODE]<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
if (is_array($arResult["SECTION"]["PATH"]))
{
$s = array_pop($arResult["SECTION"]["PATH"]);
$GLOBALS['APPLICATION']->SetTitle($s["NAME"]);
$GLOBALS['APPLICATION']->SetPageProperty("title", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_TITLE"]);
$GLOBALS['APPLICATION']->SetPageProperty("description", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_DESCRIPTION"]);
[/CODE]Добавил строку[CODE] $GLOBALS['APPLICATION']->SetPageProperty("keywords", $arResult["SECTION"]["IPROPERTY_VALUES"]["SECTION_META_KEYWORDS"]);
[/CODE]Через вывод убедился, что она получает правильное значение, но на странице услуги по-прежнему keywords не выводятся. Стал копаться в вызовах компонентов каталога, подставлять
SET_META_KEYWORDS
[CODE]<?$APPLICATION->IncludeComponent(
"bitrix:catalog",
"main",
array(
"SET_META_KEYWORDS" => "Y",
[/CODE]
Пробовал также зайти через доп. параметр "SET_META_KEYWORDS" => "Y",
"LIST_META_KEYWORDS" => "UF_KEYWORDS", но похоже, что ключи теряются где-то в вызовах компонентов, где-то на пути от его обработки из папок битрикса к копиям в local.Компонент листает подразделы в блоке Каталога и нужно всего лишь передавать при этом переменную, содержащую значение поля. Была мысль подцеплять в header.php шаблона эту переменную как глобальную или через сессии.Нашел, где в базе лежат эти ключи и создал простейший запрос, позволяющий вытащить значение по id блока и секции, но опять же эти переменные видны только при работе компонента. Была мысль инклюдить его в header.
Потом попробовал конструкцию вида[CODE]$arSelect = Array("ID", "NAME");
$arFilter = array("IBLOCK_ID" =>"25", "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$resList = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
[/CODE]Вопрос №10. Тут возник второй вопрос: эта штука отлично дергает блоки из раздела Информация, но не видит блоки из раздела Каталог - это так и задумано?Я был готов к тому, чтобы из пути к странице вычленять составляющие и по ним вычислять BLOCK_ID и SECTION[CODE]$folder = $request->getRequestedPageDirectory();
$iblockCode = '';// берем часть $folder до косой черты
$iblockId = IblockIdByCode($iblockCode);
[/CODE]Вопрос №20. Правильно ли я понимаю, что при этом потребовалось бы несколько дополнительных запросов в базу при каждой загрузке страницы и это плохое решение?
Не лучше ли брать block_id и section через правильно настроенный urlrewrite - не будет ли это решение лучше всего вышеописанного?Не лучше ли писать ключи из параметров разделов каталога в переменные сессии?
В modx к id страницы привязаны все поля метатегов, хранящиеся в базе, и не надо ломать голову как их найти и отобразить. В чем недостаток такого решения по сравнению с framework bitrix?