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

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

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

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

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

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

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']);

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

Количество показов: 2486
02.09.2015

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

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.