Is it possible to cut the property code and NC parameters - is-from-to-or - from it? And the addition / apply /? Searching the forum and the search engines did not give anything ... I'm conjuring over the class of the smart.filter component, but without success. At the moment, so - / catalog / sale_flats / filter / street-is-2-ya-sadovaya / apply / And I want it to be so - / catalog / sale_flats / filter / 2-ya-sadovaya /

In class 5 functions that are responsible for this, but I can not figure it out ...

public function searchProperty($items, $lookupValue) { foreach($items as $itemId => $arItem) { if (!$arItem["PRICE"]) { $code = toLower($arItem["CODE"]); if ($lookupValue === $code) return $itemId; if ($lookupValue == intval($arItem["ID"])) return $itemId; } } return false; } public function searchValue($item, $lookupValue) { foreach($item as $itemId => $arValue) { if ($lookupValue === $arValue["URL_ID"]) return $itemId; } return false; } public function convertUrlToCheck($url) { $result = array(); $smartParts = explode("/", $url); foreach ($smartParts as $smartPart) { $item = false; $smartPart = preg_split("/-(from|to|is|or)-/", $smartPart, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ($smartPart as $i => $smartElement) { if ($i == 0) { if (preg_match("/^price-(.+)$/", $smartElement, $match)) $itemId = $this->searchPrice($this->arResult["ITEMS"], $match[1]); else $itemId = $this->searchProperty($this->arResult["ITEMS"], $smartElement); if ($itemId) $item = &$this->arResult["ITEMS"][$itemId]; else break; } elseif ($smartElement === "from") { $result[$item["VALUES"]["MIN"]["CONTROL_NAME"]] = $smartPart[$i+1]; } elseif ($smartElement === "to") { $result[$item["VALUES"]["MAX"]["CONTROL_NAME"]] = $smartPart[$i+1]; } elseif ($smartElement === "is" || $smartElement === "or") { $valueId = $this->searchValue($item["VALUES"], $smartPart[$i+1]); if (strlen($valueId)) { $result[$item["VALUES"][$valueId]["CONTROL_NAME"]] = $item["VALUES"][$valueId]["HTML_VALUE"]; } } } unset($item); } return $result; } public function makeSmartUrl($url, $apply, $checkedControlId = false) { $smartParts = array(); if ($apply) { foreach($this->arResult["ITEMS"] as $PID => $arItem) { $smartPart = array(); //Prices if ($arItem["PRICE"]) { if ($arItem["VALUES"]["MIN"]["HTML_VALUE"] || $arItem["VALUES"]["MAX"]["HTML_VALUE"]) { if ($arItem["VALUES"]["MIN"]["HTML_VALUE"]) $smartPart["from"] = $arItem["VALUES"]["MIN"]["HTML_VALUE"]; if ($arItem["VALUES"]["MAX"]["HTML_VALUE"]) $smartPart["to"] = $arItem["VALUES"]["MAX"]["HTML_VALUE"]; } } if ($smartPart) { array_unshift($smartPart, toLower("price-".$arItem["CODE"])); $smartParts[] = $smartPart; } } foreach($this->arResult["ITEMS"] as $PID => $arItem) { $smartPart = array(); if ($arItem["PRICE"]) continue; //Numbers && calendar == ranges if ( $arItem["PROPERTY_TYPE"] == "N" || $arItem["DISPLAY_TYPE"] == "U" ) { if ($arItem["VALUES"]["MIN"]["HTML_VALUE"] || $arItem["VALUES"]["MAX"]["HTML_VALUE"]) { if ($arItem["VALUES"]["MIN"]["HTML_VALUE"]) $smartPart["from"] = $arItem["VALUES"]["MIN"]["HTML_VALUE"]; if ($arItem["VALUES"]["MAX"]["HTML_VALUE"]) $smartPart["to"] = $arItem["VALUES"]["MAX"]["HTML_VALUE"]; } } else { foreach($arItem["VALUES"] as $key => $ar) { if ( ( $ar["CHECKED"] || $ar["CONTROL_ID"] === $checkedControlId ) && strlen($ar["URL_ID"]) ) { $smartPart[] = $ar["URL_ID"]; } } } if ($smartPart) { if ($arItem["CODE"]) array_unshift($smartPart, toLower($arItem["CODE"])); else array_unshift($smartPart, $arItem["ID"]); $smartParts[] = $smartPart; } } } if (!$smartParts) $smartParts[] = array("clear"); return str_replace("#SMART_FILTER_PATH#", implode("/", $this->encodeSmartParts($smartParts)), $url); } public function encodeSmartParts($smartParts) { foreach ($smartParts as &$smartPart) { $urlPart = ""; foreach ($smartPart as $i => $smartElement) { if (!$urlPart){ $urlPart .= urlencode($smartElement); } elseif ($i == 'from' || $i == 'to'){ $urlPart .= urlencode('-'.$i.'-'.$smartElement); } elseif ($i == 1){ $urlPart .= urlencode('-is-'.$smartElement); } else{ $urlPart .= urlencode('-or-'.$smartElement); } } $smartPart = $urlPart; } unset($smartPart); return $smartParts; } 

Maybe someone more experienced will tell?

    1 answer 1

    First is

     /catalog/sale_flats/filter/2-ya-sadovaya/ 

    It will not work correctly, because to understand the filter by which property the filtering is going to be painful and the script will run longer.

    You need to rewrite all functions to this type.

     /catalog/sale_flats/filter/street/2-ya-sadovaya/#PROP_CODE#/#PROP_FILTER_VALUE#/ 

    and so on.

    • you also have to take into account that several properties can be selected, i.e. here #PROP_FILTER_VALUE# will have to be done like this #PROP_FILTER_VALUE#-and-#PROP_FILTER_VALUE#-and-#PROP_FILTER_VALUE# - m.sultan
    • preferably component catalog.smart.filter copy to local and work there. Where to dig indicated, further work is yours, i.e. implementation - m.sultan
    • Do not write comments, better improve the answer with the edit button. - 0xdb