Custom action in controller

С локализацията се справих. Но имам още едно въпросче :). Значи на вестника главния контролер е “News”, обаче имам доста категории в дървовидна структура, които искам да се отварят така: news/europe, news/world и т.н. Според вас как е най добре да се подходи ?

Втората стъпка ще е и след това да направя и подкатегориите news/world/politics , news/europe/finance … Според мен трябва на ниво контролер ако не съществува даден action да мога да го насоча към action по мой избор с даден параметър.

Може би един mod_rewrite, но мисля че и с yii има начин.

Това което искам и си го представям аз е :

Като извикам www.site.com/News/Europe/Politics в контролера News в някой функция(след като вече е видяло че нямам action "Europe",да ми даде променлива action="europe/politics" и аз там да си правя квото поискам.

Мисля че намерих каквото ми трябваше :http://www.yiiframew…r#missingAction

Да но нещо не мога да го подкарам :( Изкарва ми няква грешка:

Argument 1 passed to NewsController::missingAction() must be an instance of string, string given, called in D:\WebSites\framework\web\CController.php on line 227 and defined

чрез missingAction ще задоволиш нуждата си, но не е правилно… Нямаш нужда от различен метод за всяка категория, при положение че всичките ще правят едно и също!

Това което ти трябва е фиксиран екшън и параметър към него. Т.е. ако имаш news контролер, той да има view метод, а метода да получава гет параметър…

URL-а ти ще стане нещо подобно на това:

http://your.site/news/view/category/europe

Така в метода view ще получиш променлива category (в $_GET масива), която ще има стойност europe.

До колкото разбрах ти искаше да можеш да подааш няколко категории - това не е проблем с горната схема, просто смени разделителя между категориите - от '/' на '.' или '-':

http://your.site/news/view/category/europe.politics

или

http://your.site/news/view/category/europe-politics

(второто е по-хубаво за гугъл)

Можеш да си поиграеш още и да скриеш ‘view’ и ‘category’ чрез url rules. Тогава url-а ти ще прилича на това:

http://your.site/news/europe.politics

Е не е ли това, което искаш?

Е това искам колега :)

Най - точно искам урл-та от вида на :

site.com/news - начална страница

site.com/news/europe - листва новините от Европа

site.com/news/europe/politics - листва новините за политика от европа

site.com/news/read/Boiko_Borisov_blah_blah.php - да отваря новина с title Бойко Борисов блах блах

Проблема идва от там че europe,asia… са ми категории в базата т.е. могат да се добавят и да се махат, като искам това да става без да се налага да променям кода. Искам когато имам site.com/news/europe след като нямам такъв action да селектна от базата и да вида че това е категория и да листна новините от нея с actionView с параметър europe. Просто се надявах да стане без да ползвам rewrite.

Твърдя че имам малко опит в разработване на web сайтове затова питам за да разбера как е best practise, а не да се мъча да откривам топлата вода :)

http://www.yiiframew…r-friendly-urls

В крайна сметка го направих с missingAction(), само че искам да знам защо според теб не е правилно така да се реализира ?

Quote

В крайна сметка го направих с missingAction(), само че искам да знам защо според теб не е правилно така да се реализира ?

Платформата ти осигурява механизъм да си подадеш параметър и да го маскираш по желания начин. missingAction-а е предвиден за обработка на изключения… Това е все едно вместо if-then-else конструкция да изпозлваш try-catch. Не че не става, просто не е подравнено с добрата практикра.

Представи си, че утре missingAction изчезне и контролера започне да хвърля ексепшън под някаква друга форма - губиш възможоста за миграция към по-нова платформа и ще трябва да пренапишеш стратегическа функционалност - ако например ставаше дума за показване на съобщение, когато лиспва страница (примерно де) - това не е стратегическа за приложението ти функционалност и няма проблем при миграция да го промениш. Но в твоя случай едно от най-важните фунцкии е базирано на механизъм за изключения и при евентуална промяна ще има търкания и мъркания… :)

Незнам колко е важен проекта - до колкото схванах е собствен такъв, но и не е важно - просто исках да кажа, че не е добра практика да го направиш така… :) Приеми го за съвет, пък дано ти е полезен… :)