bitrix умный фильтр красивый урл

Умный фильтр выдает урл вида
site.ru/tovars/filter/color-is-8e4e6038-474d-11e6-80e5-94de807e86a2/apply/
А нужен вида
site.ru/tovars/?filter[]=color-is-red
чтобы не индексировался.
Замена в catalog/index.php


		"SEF_URL_TEMPLATES" => Array(
			"smart_filter" => "#SECTION_CODE_PATH#/?filter[]=#SMART_FILTER_PATH#"

не полное решение.

Дело в том что умный фильтр вызывается перед компонентом каталога и передает свои параметры в глобальный массив фильтра. Компонент парсит урл, разбивает на части св-ва и значения. Происходит это в самом компоненте, на строке


elseif($arParams["SMART_FILTER_PATH"]){
	$_CHECK = $this->convertUrlToCheck($arParams["~SMART_FILTER_PATH"]);
// выдает 
Array
(
    [arrFilter_433_1180816820] => Y
)
// к-й затем парситься и передается в глоб. массив arrFilter в привычный нам вид
    [=PROPERTY_433] => Array
        (
            [0] => 2730
        )

как видите, должен передаваться параметр SMART_FILTER_PATH. После смены SEF_URL_TEMPLATES он в компнент не передается. Добавим его напрямую, через $_GET в catalog/temp1/section.php


if(empty($arResult["VARIABLES"]["SMART_FILTER_PATH"])){
	$arResult["VARIABLES"]["SMART_FILTER_PATH"] = implode('&' , $_GET['filter']);
}

Дело за малым. Смотрим ту самую ф-ю convertUrlToCheck, к-я возвращает массив в class.php. В начале просто меняем слеш на амперсанд.


	public function convertUrlToCheck($url)
	{
		$smartParts = explode("&", $url);

Там же подгоняем урл под наш вид


public function makeSmartUrl(){
......
return str_replace("#SMART_FILTER_PATH#", implode("&filter[]=", $this->encodeSmartParts($smartParts)), $url);

И послед. штрих — подменяем XML_ID на VALUE в class.php


public function fillItemValues(...){
		switch($PROPERTY_TYPE)
		{
		case "L":
			$enum = CIBlockPropertyEnum::GetByID($key);
			if ($enum)
			{
				$url_id = toLower($enum["VALUE"]);

Вот и все.

Leave a comment

Your email address will not be published.


*