Как добавить новые СЕО-возможности 14-й версии 1С-Битрикс в кастомизированные компоненты

Сразу скажу: восстановить работоспособность этих новых фишек - можно. Это не слишком сложно, но потребует знаний которые есть только у программистов (рядовому пользователю это не по силам).

Для примера возьмем 2 компонента которые были кастомизированы почти 2 года назад: список секций (catalog.section) и детальная страница элемента каталога (catalog.element). В обоих случаях нужно внести изменения в component.php

catalog.section

1. Нужно добавить следующий код перед строчкой  $arResult["PICTURE"] = CFile::GetFileArray($arResult["PICTURE"]);
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arResult["IBLOCK_ID"], $arResult["ID"]);
$arResult["IPROPERTY_VALUES"] = $ipropValues->getValues();

2. Добавить новый ключ в кеш
$this->SetResultCacheKeys(array(
//...
"IPROPERTY_VALUES",
));

3. Заменить все что между заменить все что между  (включая указанные строки)  $this->SetTemplateCachedData($arResult["NAV_CACHED_DATA"]); и if($arParams["ADD_SECTIONS_CHAIN"] && isset($arResult["PATH"]) && is_array($arResult["PATH"]))  на новый код:
if($arParams["SET_TITLE"])
{
if ($arResult["IPROPERTY_VALUES"]["SECTION_PAGE_TITLE"] != "")
$APPLICATION->SetTitle($arResult["IPROPERTY_VALUES"]["SECTION_PAGE_TITLE"], $arTitleOptions);
elseif(isset($arResult["NAME"]))
$APPLICATION->SetTitle($arResult["NAME"], $arTitleOptions);
}

$browserTitle = \Bitrix\Main\Type\Collection::firstNotEmpty(
$arResult["PROPERTIES"], array($arParams["BROWSER_TITLE"], "VALUE")
,$arResult["IPROPERTY_VALUES"], "SECTION_META_TITLE"
);
if (is_array($browserTitle))
$APPLICATION->SetPageProperty("title", implode(" ", $browserTitle), $arTitleOptions);
elseif ($browserTitle != "")
$APPLICATION->SetPageProperty("title", $browserTitle, $arTitleOptions);

$metaKeywords = \Bitrix\Main\Type\Collection::firstNotEmpty(
$arResult["PROPERTIES"], array($arParams["META_KEYWORDS"], "VALUE")
,$arResult["IPROPERTY_VALUES"], "SECTION_META_KEYWORDS"
);
if (is_array($metaKeywords))
$APPLICATION->SetPageProperty("keywords", implode(" ", $metaKeywords), $arTitleOptions);
elseif ($metaKeywords != "")
$APPLICATION->SetPageProperty("keywords", $metaKeywords, $arTitleOptions);

$metaDescription = \Bitrix\Main\Type\Collection::firstNotEmpty(
$arResult["PROPERTIES"], array($arParams["META_DESCRIPTION"], "VALUE")
,$arResult["IPROPERTY_VALUES"], "SECTION_META_DESCRIPTION"
);
if (is_array($metaDescription))
$APPLICATION->SetPageProperty("description", implode(" ", $metaDescription), $arTitleOptions);
elseif ($metaDescription != "")
$APPLICATION->SetPageProperty("description", $metaDescription, $arTitleOptions);

catalog.element

1. Сразу после $arResult["CAT_PRICES"] = $arResultPrices; вставить
$ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues($arResult["IBLOCK_ID"], $arResult["ID"]);
$arResult["IPROPERTY_VALUES"] = $ipropValues->getValues();

2. Добавить новый ключ в кеш
$this->SetResultCacheKeys(array(
//...
"IPROPERTY_VALUES",
));

3. Заменить все что между заменить все что между (включая указанные строки)  if($arParams["SET_TITLE"])  и  if($arParams["ADD_SECTIONS_CHAIN"] && is_array($arResult["SECTION"]))  на новый код:
if($arParams["SET_TITLE"])
{
    if ($arResult["IPROPERTY_VALUES"]["ELEMENT_PAGE_TITLE"] != "")
        $APPLICATION->SetTitle($arResult["IPROPERTY_VALUES"]["ELEMENT_PAGE_TITLE"], $arTitleOptions);
    else
        $APPLICATION->SetTitle($arResult["NAME"], $arTitleOptions);
}

$browserTitle = \Bitrix\Main\Type\Collection::firstNotEmpty(
    $arResult["PROPERTIES"], array($arParams["BROWSER_TITLE"], "VALUE")
    ,$arResult, $arParams["BROWSER_TITLE"]
    ,$arResult["IPROPERTY_VALUES"], "ELEMENT_META_TITLE"
);
if (is_array($browserTitle))
    $APPLICATION->SetPageProperty("title", implode(" ", $browserTitle), $arTitleOptions);
elseif ($browserTitle != "")
    $APPLICATION->SetPageProperty("title", $browserTitle, $arTitleOptions);

$metaKeywords = \Bitrix\Main\Type\Collection::firstNotEmpty(
    $arResult["PROPERTIES"], array($arParams["META_KEYWORDS"], "VALUE")
    ,$arResult["IPROPERTY_VALUES"], "ELEMENT_META_KEYWORDS"
);
if (is_array($metaKeywords))
    $APPLICATION->SetPageProperty("keywords", implode(" ", $metaKeywords), $arTitleOptions);
elseif ($metaKeywords != "")
    $APPLICATION->SetPageProperty("keywords", $metaKeywords, $arTitleOptions);

$metaDescription = \Bitrix\Main\Type\Collection::firstNotEmpty(
    $arResult["PROPERTIES"], array($arParams["META_DESCRIPTION"], "VALUE")
    ,$arResult["IPROPERTY_VALUES"], "ELEMENT_META_DESCRIPTION"
);
if (is_array($metaDescription))
    $APPLICATION->SetPageProperty("description", implode(" ", $metaDescription), $arTitleOptions);
elseif ($metaDescription != "")
    $APPLICATION->SetPageProperty("description", $metaDescription, $arTitleOptions);



Финализация

После того как все изменения внесены, нужно сделать еще 2 шага:
  1. Сбросить кеш всего сайта (Настройки - Настройки продукта - Автокеширование - ...)
  2. Очистить кеш вычисленных значений для инфоблока, который вы настраиваете (Контент - Типы информ. блоков - <нужный инфоблок> - Закладка "SEO" - флажок "Очистить кеш вычисленных значений" в самом низу).

И напоследок

Для других компонентов рекомендую использовать что-то вроде WinMerge для выявления того кода, который нужно добавить.
Как можно заметить - все вышеописанное завязано но новый тип наследуемых свойств и все в вышеприведенных изменениях завязано на ключ IPROPERTY_VALUES в массиве $arResult. Ориентируйтесь на этот ключ как на маяк, говорящий "Перенеси этот код в старый компонент".

Комментарии (3)

...
  • Данила
  • 28.12.2013 10:13:36
Ребята, спасибо за ваш интересный блог. Есть маленькая оффтоп-просьба. В RSSке в тег link пишите URL статьи, а?
...
Спасибо, исправимся ))

Вот мы и узнали кто читает RSS -- за 2 года первое обращение
...
  • Александр
  • 22.02.2014 16:17:47
Спасибо, Алексей. Очень помогли своей статьёй. Всё работает.