Wiele Zapytań W Urlmanagerze, Jak Zmniejszyć Liczbę Rules?

Mam aplikację z wyszukiwarką, wyszukiwarka dopisuje parametry wyszukiwania do adresu url. Nie do końca wiem w jaki sposób mogę uprościć wpisy w UrlManagerze aby ich nie było tak wiele. Przykład:

‘/shop/<shop:\d+>/engine/<engine:\d+>/category/<category:\d+>/tags/<tags:\d+>’=>’/site/index’,

‘/shop/<shop:\d+>/engine/<engine:\d+>/category/<category:\d+>’=>’/site/index’,

‘/shop/<shop:\d+>/engine/<engine:\d+>’=>’/site/index’,

‘/shop/<shop:\d+>’=>’/site/index’,

‘/’=>’/site/index’,

To są tylko 4 parametry, jest ich więcej i nie wszystkie muszą występować przez co jeśli np. w wyszukiwarce sklep (1 parametr) nie został wybrany, a zostaną pozostałe, to powyższe zapisy nie będą działać stąd muszę robić kopię na wypadek wystąpienia tylko 3 parametrów czyli:

‘/engine/<engine:\d+>/category/<category:\d+>/tags/<tags:\d+>’=>’/site/index’,

‘/engine/<engine:\d+>/category/<category:\d+>’=>’/site/index’,

‘/engine/<engine:\d+>’=>’/site/index’,

‘/’=>’/site/index’,

jeśli zaś sklep zostanie wybrany, a kategoria nie, to oznacza dodatkowe linie itd itd

Mam świadomość że to bez sensu (od niedawna bawię się YII, a dokumentacja dla mnie jest niejasna, opisuje tylko najprostsze sytuacje) niestety nie wiem jak to uprościć, a w sumie wychodzi mi kilkadziesiąt wpisów :confused:

Możesz wykorzystać właściwość CUrlManager.appendParams.

Nie bardzo rozumiem, co mi to da? Z tego co wyczytałem, ta właściwość ustawiona na false (domyślnie true) da mi to, że parametry nie będą porozdzielane znakami ‘/’ tylko będą w w zapytaniu. Nie wiem jak to rozumieć ale jeśli to będzie zwykłe query to będzie gorzej niż z ręcznym ustawianiem każdego route. Zależy mi bowiem na “ładnych” linkach. Chyba że czegoś nie rozumiem? ;) Jakiś przykład zastosowania?

Właśnie jest ta opcja jest włączona, twoje parametry żądania powinny być oddzielone / tak jak w przykładach, które podałeś. Nie trzeba wtedy tworzyć do tego dodatkowych reguł poza kontrolerem i akcją, urlManager powinien automatycznie rozbić URL i uzupełnić tablicę GET.

Hmm wiedziałem, że robię coś nie tak, ale nie wiedziałem jak to poprawić. Usunąłem prawie wszystkie trasy, zostawiłem tylko te:

‘<action:\w+>’ => ‘<controller>/<action>’,

‘<controller:\w+>/<id:\d+>’=>’<controller>/view’,

‘<controller:\w+>/<action:\w+>/<id:\d+>’=>’<controller>/<action>’,

‘<controller:\w+>/<action:\w+>’=>’<controller>/<action>’,

i jest prawie ok, prawie bo jeśli mam np. wybrany w wyszukiwarce sklep i kategorie, to taki adres pokazuje 0 wyników: /shop/3/category/4, natomiast jak wpiszę /site/index/shop/3/category/4 to wyniki pokazuje ok. Rozumiem czemu tak jest (site to kontroler, index to akcja, jasne) ale jak dodaję takie route:

‘/’=>’/site/index’, jako pierwszy, to /shop/3/category/4 ten adres dalej wskazuje 0 wyników. Jak to powinienem zapisać, abym mógł olać nazwę kontrolera i akcji i zostawić same params w url aby dalej on działał?


Rozumiem czemu tak jest (site to kontroler, index to akcja, jasne) ale jak dodaję takie route:


'/'=>'/site/index', jako pierwszy, to /shop/3/category/4 ten adres dalej wskazuje 0 wyników.

Wydaje mi się że nie tak to działa. Szukany jest wzór który jako pierwszy pasuje, więc ‘/’=>’/site/index’ użyte jest tylko dla nazwastrony.pl, a w innych przypadkach nie jest spełniony wzór.

Żeby osiągnąć to co chcesz musisz zrobić tak że każdy adres jest kierowany do site/index, ale to jest całkowicie bezsensu. Według mnie najlepiej żeby ‘shop’ był akcją i wtedy wystarczy dodać regułę:


'shop' => 'Kontroler/<action>',