Доброго времени суток, уважаемые:)
Столкнулся на одном старом проекте с проблемой: у товаров несколько разделов в привязке, а следовательно и несколько вариантов формирования ЧПУ-адреста страницы карточки товара. Для определения единственного адреса написал функцию, которая забирает в ЧПУ только символьный код первого из разделов.
Доброго времени суток, уважаемые:)
Столкнулся на одном старом проекте с проблемой: у товаров несколько разделов в привязке, а следовательно и несколько вариантов формирования ЧПУ-адреста страницы карточки товара. Для определения единственного адреса написал функцию, которая забирает в ЧПУ только символьный код первого из разделов.
В общем виде функция имеет вид:
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']);
Вот такая вышла функия. Верю, что не оптимальная, но решение на скорую руку:)
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.