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

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


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

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

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


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"])){
	$_GET[$_GET['filter']] = '';
	unset($_GET['filter']);
	$arResult["VARIABLES"]["SMART_FILTER_PATH"] = implode('&' , array_keys($_GET));
}

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


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

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


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

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


public function fillItemValues(...){
		switch($PROPERTY_TYPE)
		{
		case "L":
			$enum = CIBlockPropertyEnum::GetByID($key);
			if ($enum)
			{
				$url_id = toLower($enum["VALUE"]);
	public function searchValue($item, $lookupValue)
	{
               ...
               
		$encodedValue = rawurlencode($searchValue);
		$encodedValue = str_replace('_', '%20', $encodedValue);

12 Comments

  1. А можно поподробнее указать какие папки и файлы лезть?

  2. Подскажите, а как сделать?
    Вот сейчас урл такой — /filter/kolichestvo_konturov-is-одноконтурный/apply/
    А надо — /filter/kolichestvo_konturov-is-odnokonturnyj/apply/
    Или вот такой — /rasshiritelnyy_bak-is-10%20литров/apply/
    А надо чтобы делался вот такой — /rasshiritelnyy_bak-is-10-litrov/apply/

    • замени XML_ID на свои в св-вах типа Список. Но смотри, не факт что все не слетит.

      • xml_id слетает при выгрузке из 1С.
        А как можно транслитерировать чтобы значения на литиницу переводились?

        Способ описанный Вами рабочий! Спасибо большое, внес изменения только в class.php и сейчас в url подставляется значение свойства вместо xml_id. Другое дело что значения подтягиваются из 1С и на русском языке. Как можно транслитерировать?

        • Заменил там же в class.php
          $url_id = toLower($enum[«XML_ID»]);
          на
          $url_id = CUtil::translit(toLower($enum[«VALUE»]), «ru»);
          заработало.
          Вам еще раз спасибо за решение.

  3. Благодарю за рабочий вариант, все получилось. Очень красивое решение с фильтром.

  4. Метод больше не работает
    $url_id = CUtil::translit(toLower($enum[«VALUE»]), «ru»);
    Есть решение?

  5. Александр М 08.11.2020 at 23:17

    так а что смотреть?
    весь мозг сломал
    VMBitrix v7.4.11 Centos 7 все значения по умолчанию стоят
    проверку проходит
    php_admin_value mbstring.func_overload 2
    php_value mbstring.internal_encoding UTF-8
    /etc/php.d/bitrixenv.ini
    не знаю что и менять уже

Leave a comment

Your email address will not be published.


*