Получение единственного адреса к товару с ЧПУ

Получение единственного адреса к товару с ЧПУ

784
02.09.2015

Доброго времени суток, уважаемые:)

Столкнулся на одном старом проекте с проблемой: у товаров несколько разделов в привязке, а следовательно и несколько вариантов формирования ЧПУ-адреста страницы карточки товара. Для определения единственного адреса написал функцию, которая забирает в ЧПУ только символьный код первого из разделов.

Доброго времени суток, уважаемые:)

Столкнулся на одном старом проекте с проблемой: у товаров несколько разделов в привязке, а следовательно и несколько вариантов формирования ЧПУ-адреста страницы карточки товара. Для определения единственного адреса написал функцию, которая забирает в ЧПУ только символьный код первого из разделов.

В общем виде функция имеет вид:

function GetMasterUrlForProduct($productID,$productCode){
    $cache_params = array();
    $cache_params['func'] = 'GetMasterUrlForProduct';
    $cache_params['productID'] = $productID;
    $cache_id = md5(serialize($cache_params));
    $cache_dir = "/tagged_products";
    $obCache = new CPHPCache;

    $life_time = 0;
    $arResult = false;
    if ($obCache->InitCache($life_time, $cache_id, $cache_dir)){
        $arResult = $obCache->GetVars();
        $arResult['fromCache'] = 'Y';
    } elseif(CModule::IncludeModule('iblock') && $obCache->StartDataCache()) {
        $db_old_groups = CIBlockElement::GetElementGroups($productID, true);
        $ar_new_groups = Array();
        $arResult['CODE'] = '/catalog/';
        while($ar_group = $db_old_groups->Fetch())
            $ar_new_groups[intval($ar_group['DEPTH_LEVEL'])] = $ar_group;

        if(count($ar_new_groups)>1){
            reset($ar_new_groups);

            $fsect = array_pop($ar_new_groups);

            $nav = CIBlockSection::GetNavChain(false,$fsect['ID']);
            while($arSectionPath = $nav->GetNext()){
                $arResult['CODE'] .= $arSectionPath['CODE'].'/';
            }
            $arResult['CODE'] .=$productCode;
        } else {
            $arResult = false;
        }

        global $CACHE_MANAGER;
        $CACHE_MANAGER->StartTagCache($cache_dir);
        $CACHE_MANAGER->RegisterTag("iblockelement_".$productID);
        $CACHE_MANAGER->EndTagCache();
        $obCache->EndDataCache($arResult);
    }

    if(is_array($arResult) && isset($arResult['CODE'])){
        return $arResult['CODE'];
    } else {
        return false;
    }
}

Использование функции достаточно просто: функцию размещаем в файле, который подключается к странице с карточкой товаров (например, в init.php, как это сделал я). Дальше, в result_modifier.php карточки товара пишем:

$code = GetMasterUrlForProduct($arResult['ID'],$arResult['CODE']);
if($code){
	if(strcmp($code,$arResult['DETAIL_PAGE_URL'])!==0){
		MakeElementRedirect($code); // функция, которая осуществляет редирект
	}
}

Следующим шагом является исправление адреса в списке товаров. Для этого напишем модификационную функцию (разместил там же, рядом с функцией модификации одного отдельно взятого урла, т.к. у меня несколько компонентов catalog.section )

function RebildSectionProductsUrls($arItems){
    if(!empty($arItems)){
        foreach ($arItems as &$Item) {
            $code = GetMasterUrlForProduct($Item['ID'],$Item['CODE']);
            if($code)
                $Item['DETAIL_PAGE_URL'] = $code;
        }
    }
    return $arItems;
}

Использование функции аналогично: в result_modifier.php добавляем строку:

$arResult['ITEMS'] = RebildSectionProductsUrls($arResult['ITEMS']);

Вот такая вышла функия. Верю, что не оптимальная, но решение на скорую руку:)



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

Возврат к списку