Задача: добавить по определенным правилам CITYNAME в title и descr товара
Сложность: у некоторых товаров эти значения наследуются от раздела
Решение(неоптимизированный говнокод):
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
CModule::IncludeModule("iblock");
use Bitrix\Iblock\InheritedProperty;
$IBLOCK_ID = 15;
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID);
$arSelect = array("ID", "ACTIVE", "NAME");
$rsElements = CIBlockElement::GetList(array("SORT" => "ASC"), $arFilter, false, [/*'nTopCount'=>105*/], $arSelect);
$count = 0;
$count_all = 0;
while ($arElement = $rsElements->GetNext()) {
echo '<br>';
echo 'Товар №' . $arElement['ID'];
$count_all++;
// получаем шаблоны
$ipropElementTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $arElement['ID']);
$templates = $ipropElementTemplates->findTemplates();
//pre($templates);
// Если тайтл наследуется и берется из раздела и еще нет #CITYNAME#
if ($templates['ELEMENT_META_TITLE']['INHERITED'] == 'Y' && $templates['ELEMENT_META_TITLE']['ENTITY_TYPE'] == 'S' && (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false)) {
$ipropSectionTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, $templates['ELEMENT_META_TITLE']['ENTITY_ID']);
$templatesSect = $ipropSectionTemplates->findTemplates();
$title = str_replace(', цена', ' #CITYNAME#, цена', $templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) {
echo "ERROR";
$error++;
pre($title);
} elseif (strpos($templatesSect['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) {
$newTemplatesSect = array('ELEMENT_META_TITLE' => $title);
$ipropSectionTemplates->set($newTemplatesSect);
echo '<br> Тайтл Сект Было:';
pre($templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
echo '<br>Должно стать:';
pre($title);
echo '<br>Стало:';
pre($ipropSectionTemplates->findTemplates()['ELEMENT_META_TITLE']['TEMPLATE']);
}
}
// Если тайтл не наследуется -> берется из элемента
if ($templates['ELEMENT_META_TITLE']['INHERITED'] == 'N' && (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) ) {
$title = str_replace(', цена', ' #CITYNAME#, цена', $templates['ELEMENT_META_TITLE']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templates['ELEMENT_META_TITLE']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) {
echo "ERROR";
$error++;
pre($title);
}
if (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) {
$ipropElementTemplates3 = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $templates['ELEMENT_META_TITLE']['ENTITY_ID']);
$templates = $ipropElementTemplates3->findTemplates();
$newTemplates = array('ELEMENT_META_TITLE' => $title);
$ipropElementTemplates3->set($newTemplates);
echo '<br>Тайтл Элем Было:';
pre($templates['ELEMENT_META_TITLE']['TEMPLATE']);
echo '<br>Должно стать:';
pre($title);
echo '<br>Стало:';
pre($ipropElementTemplates3->findTemplates()['ELEMENT_META_TITLE']['TEMPLATE']);
}
}
// Если декср наследуется и берется из раздела и еще нет #CITYNAME#
if ($templates['ELEMENT_META_DESCRIPTION']['INHERITED'] == 'Y' && $templates['ELEMENT_META_DESCRIPTION']['ENTITY_TYPE'] == 'S' ) {
$ipropSectionTemplates1 = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, $templates['ELEMENT_META_DESCRIPTION']['ENTITY_ID']);
$templatesSect = $ipropSectionTemplates1->findTemplates();
$title = str_replace('по цене', ' #CITYNAME#, по цене', $templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) {
echo "ERROR";
$error++;
pre($title);
} elseif (strpos($templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE'], '#CITYNAME#') == false) {
$newTemplatesSect = array('ELEMENT_META_DESCRIPTION' => $title);
$ipropSectionTemplates1->set($newTemplatesSect);
echo '<br>Descr Sect Было:';
pre($templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
echo '<br>Должно стать:';
pre($title);
echo '<br>Стало:';
pre($ipropSectionTemplates1->findTemplates()['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
}
}
// Если декср не наследуется -> берется из элемента
if ($templates['ELEMENT_META_DESCRIPTION']['INHERITED'] == 'N') {
$title = str_replace('по цене', ' #CITYNAME#, по цене', $templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
if (strpos($title, '#CITYNAME#') == false) {
echo "ERROR";
$error++;
pre($title);
}
if (strpos($templates['ELEMENT_META_DESCRIPTION']['TEMPLATE'], '#CITYNAME#') == false) {
$ipropElementTemplates2 = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $templates['ELEMENT_META_DESCRIPTION']['ENTITY_ID']);
$templates = $ipropElementTemplates2->findTemplates();
$newTemplates = array('ELEMENT_META_DESCRIPTION' => $title);
$ipropElementTemplates2->set($newTemplates);
echo '<br>Descr Element Было:';
pre($templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
echo '<br>Должно стать:';
pre($title);
echo '<br>Стало:';
pre($ipropElementTemplates2->findTemplates()['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
}
}
}
echo '</br>Тайтлы свои:' . $inh_t;
echo '</br>Дескр свои:' . $inh_d;
echo '</br>С ошибкой:' . $count;
echo '</br>Из:' . $count_all;
echo '</br>UPD:' . $UPDD;