@a9105051396

Редирект Битрикс?

Подскажите можно ли сделать редирект после смены для карточек с #ELEMENT_ID# на #ELEMENT_CODE# ? Всю голову уже сломал.
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
@PetrPo
1. В параметр SEF_URL_TEMPLATES добавь свою строку
"redirect" => "#SECTION_CODE_PATH#/#ELEMENT_ID#/",
2. В своем шаблоне комплексного компонента catalog создай файл redirect.php (там где файлы типа section.php, element.php и т.д.)
3. В этом файле напиши
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);

$iblock = \Bitrix\Iblock\IblockTable::getList([
	'select' => ['DETAIL_PAGE_URL'],
	'filter' => ['ID' => $arParams['IBLOCK_ID']],
	'cache' => ['ttl' => 31536000]
])->fetch();

if(strpos($iblock['DETAIL_PAGE_URL'], '#ELEMENT_CODE#') !== false) {
	$elementId = $arResult['VARIABLES']['ELEMENT_ID'];
	$filter = ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ID' => $elementId];
	
	$obCache = new CPHPCache();
	if($obCache->InitCache(36000, serialize($filter), '/iblock/catalog/redirect')) {
		$element = $obCache->GetVars();
	}
	elseif($obCache->StartDataCache()) {
		$element = [];

		$iterator = CIBLockElement::GetList([], $filter, false, false, ['IBLOCK_ID', 'ID', 'DETAIL_PAGE_URL']);
		
		if(defined("BX_COMP_MANAGED_CACHE")) {
			global $CACHE_MANAGER;
			$CACHE_MANAGER->StartTagCache('/iblock/catalog/redirect');

			if($row = $iterator->GetNext()) {
				$element = $row;
				$CACHE_MANAGER->RegisterTag('iblock_id_'.$arParams['IBLOCK_ID']);
			}

			$CACHE_MANAGER->EndTagCache();
		}
		else {
			if($row = $iterator->GetNext()) {
				$element = $row;
			}
		}
			
			
		$obCache->EndDataCache($element);
	}

	if($element['DETAIL_PAGE_URL']) {
		LocalRedirect($element['DETAIL_PAGE_URL']);
	}
}

4. там же где файл redirect.php создал, есть файл .parameters.php, добавь в конце
$arTemplateParameters['SEF_URL_TEMPLATES_redirect'] = array(
    'PARENT' => 'SEF_MODE',
    'NAME' => "Редирект",
    "DEFAULT" => "",
    "VARIABLES" => array(),
);

это чтобы при сохранении компонента из публички не стерся твой параметр, ну и лучше 'NAME' => "Редирект", через GetMessage сделать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы