Я это понимаю целиком и полностью. Но мне кажется, что моя задача реализуема. Мне просто не хватает знаний или я уже устал от неё.
Возьмём класс компонента.
Вот несколько функций которые отвечают за создание SEF URI, его кодирование и распознавание.
[FONT=Tahoma, Geneva][B]public function searchProperty($items, $lookupValue)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach($items as $itemId => $arItem)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if (!$arItem["PRICE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $code = toLower($arItem["CODE"]);[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($lookupValue === $code)[/B][/FONT]
[FONT=Tahoma, Geneva][B] return $itemId;[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($lookupValue == intval($arItem["ID"]))[/B][/FONT]
[FONT=Tahoma, Geneva][B] return $itemId;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] return false;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] public function searchValue($item, $lookupValue)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach($item as $itemId => $arValue)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($lookupValue === $arValue["URL_ID"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] return $itemId;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] return false;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] public function convertUrlToCheck($url)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $result = array();[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartParts = explode("/", $url);[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach ($smartParts as $smartPart)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $item = false;[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart = preg_split("/-(from|to|is|or)-/", $smartPart, -1, PREG_SPLIT_DELIM_CAPTURE);[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach ($smartPart as $i => $smartElement)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($i == 0)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if (preg_match("/^price-(.+)$/", $smartElement, $match))[/B][/FONT]
[FONT=Tahoma, Geneva][B] $itemId = $this->searchPrice($this->arResult["ITEMS"], $match[1]);[/B][/FONT]
[FONT=Tahoma, Geneva][B] else[/B][/FONT]
[FONT=Tahoma, Geneva][B] $itemId = $this->searchProperty($this->arResult["ITEMS"], $smartElement);[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($itemId)[/B][/FONT]
[FONT=Tahoma, Geneva][B] $item = &$this->arResult["ITEMS"][$itemId];[/B][/FONT]
[FONT=Tahoma, Geneva][B] else[/B][/FONT]
[FONT=Tahoma, Geneva][B] break;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] elseif ($smartElement === "from")[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $result[$item["VALUES"]["MIN"]["CONTROL_NAME"]] = $smartPart[$i+1];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] elseif ($smartElement === "to")[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $result[$item["VALUES"]["MAX"]["CONTROL_NAME"]] = $smartPart[$i+1];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] elseif ($smartElement === "is" || $smartElement === "or")[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $valueId = $this->searchValue($item["VALUES"], $smartPart[$i+1]);[/B][/FONT]
[FONT=Tahoma, Geneva][B] if (strlen($valueId))[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $result[$item["VALUES"][$valueId]["CONTROL_NAME"]] = $item["VALUES"][$valueId]["HTML_VALUE"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] unset($item);[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] return $result;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] public function makeSmartUrl($url, $apply, $checkedControlId = false)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartParts = array();[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($apply)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach($this->arResult["ITEMS"] as $PID => $arItem)[/B][/FONT]
[FONT=Tahoma, Geneva][B] { [/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart = array();[/B][/FONT]
[FONT=Tahoma, Geneva][B] //Prices[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["PRICE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MIN"]["HTML_VALUE"] || $arItem["VALUES"]["MAX"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MIN"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart["from"] = $arItem["VALUES"]["MIN"]["HTML_VALUE"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MAX"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart["to"] = $arItem["VALUES"]["MAX"]["HTML_VALUE"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($smartPart)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] array_unshift($smartPart, toLower("price-".$arItem["CODE"]));[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartParts[] = $smartPart;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] [/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach($this->arResult["ITEMS"] as $PID => $arItem)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart = array();[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["PRICE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] continue;[/B][/FONT]
[FONT=Tahoma, Geneva][B] //Numbers && calendar == ranges[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ([/B][/FONT]
[FONT=Tahoma, Geneva][B] $arItem["PROPERTY_TYPE"] == "N"[/B][/FONT]
[FONT=Tahoma, Geneva][B] || $arItem["DISPLAY_TYPE"] == "U"[/B][/FONT]
[FONT=Tahoma, Geneva][B] )[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MIN"]["HTML_VALUE"] || $arItem["VALUES"]["MAX"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MIN"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart["from"] = $arItem["VALUES"]["MIN"]["HTML_VALUE"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["VALUES"]["MAX"]["HTML_VALUE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart["to"] = $arItem["VALUES"]["MAX"]["HTML_VALUE"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] else[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach($arItem["VALUES"] as $key => $ar)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ([/B][/FONT]
[FONT=Tahoma, Geneva][B] ([/B][/FONT]
[FONT=Tahoma, Geneva][B] $ar["CHECKED"][/B][/FONT]
[FONT=Tahoma, Geneva][B] || $ar["CONTROL_ID"] === $checkedControlId[/B][/FONT]
[FONT=Tahoma, Geneva][B] )[/B][/FONT]
[FONT=Tahoma, Geneva][B] && strlen($ar["URL_ID"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] )[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart[] = $ar["URL_ID"];[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($smartPart)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] if ($arItem["CODE"])[/B][/FONT]
[FONT=Tahoma, Geneva][B] array_unshift($smartPart, toLower($arItem["CODE"]));[/B][/FONT]
[FONT=Tahoma, Geneva][B] else[/B][/FONT]
[FONT=Tahoma, Geneva][B] array_unshift($smartPart, $arItem["ID"]);[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartParts[] = $smartPart;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] if (!$smartParts)[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartParts[] = array("clear");[/B][/FONT]
[FONT=Tahoma, Geneva][B] return str_replace("#SMART_FILTER_PATH#", implode("/", $this->encodeSmartParts($smartParts)), $url);[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] public function encodeSmartParts($smartParts)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] [/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach ($smartParts as &$smartPart)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] $urlPart = "";[/B][/FONT]
[FONT=Tahoma, Geneva][B] foreach ($smartPart as $i => $smartElement)[/B][/FONT]
[FONT=Tahoma, Geneva][B] {[/B][/FONT]
[FONT=Tahoma, Geneva][B] [/B][/FONT]
[FONT=Tahoma, Geneva][B] if (!$urlPart){[/B][/FONT]
[FONT=Tahoma, Geneva][B] $urlPart .= urlencode($smartElement);[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] elseif ($i == 'from' || $i == 'to'){[/B][/FONT]
[FONT=Tahoma, Geneva][B] $urlPart .= urlencode('-'.$i.'-'.$smartElement);[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] elseif ($i == 1){[/B][/FONT]
[FONT=Tahoma, Geneva][B] $urlPart .= urlencode('-is-'.$smartElement);[/B][/FONT]
[FONT=Tahoma, Geneva][B] } [/B][/FONT]
[FONT=Tahoma, Geneva][B] else{[/B][/FONT]
[FONT=Tahoma, Geneva][B] $urlPart .= urlencode('-or-'.$smartElement);[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] $smartPart = $urlPart;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
[FONT=Tahoma, Geneva][B] unset($smartPart);[/B][/FONT]
[FONT=Tahoma, Geneva][B] return $smartParts;[/B][/FONT]
[FONT=Tahoma, Geneva][B] }[/B][/FONT]
Если вы посмотрите на последнюю функцию - то это именно то место, где всё собирается, а функции выше выполняют остальную работу.