Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
Ahoj, někdo tu nakousl vkládání komponentů do MVC a tím oživil moje 2 ne zcela dořešené věci v mém MVC.
1) Když budeme brát v potaz velmi jednoduchý příklad, tak máme URL domena/produkty/category/30 => přeloží se jako třída Produkty, metoda category, parametr 30 , zatím v pořádku a nyní URL /produkty/category/30/produkt/55 => toto je detail produktu z konkrétní kategorie, jak by se tohle mělo přeložit? Která metoda by se měla zavolat? metoda produkt uvnitř metody category? To mi přijde jako blbost. Url by mohla být [b][/b]/category/produkt/55 (ale já bych musel v detailu produktu volat kontroly, které jsem volal v předchozí URL, abych zjistil v jaké kategorii jsem atd, to mi přijde taky jako blbost, URL chci nabalovat, ne zkracovat a vše si ověřovat uvnitř skriptu znovu ...) 2) URL tohoto typu viz konec první otázky se mi nelíbí /produkty/category/30/produkt/55, měla by vypadat takto /produkty/30/produkt/55 (nebo ještě lépe bez čísel a pomocí SEO názvu, ale to je jiná věc a to řešit nechci). Ve zkratce, jak se zbavit některých redundantních položek v URL, které ukazují na třídy, metody, (tady asi v pořádku), ale dále na parametry a různé hodnoty, které určují logiku skriptu. Vím, určitě, že by to šlo přepisem v htaccessu, jenže to bych musel přepisovat X adres a navíc klientovi by to nefungovalo, pokud by si např. Produkty změnil na Naše produkty (url produkty => nase-produkty). Díky |
||
Alphard Profil |
#2 · Zasláno: 15. 12. 2012, 10:16:29
Uvedené příklady se mi zdají jako kočkopes z pohledu míchání češtiny a angličtiny :-)
Jak řešíš router? Už nepoužíváš žádný config, který by upravoval pravidla pro adresy a šlo by tam právě zadat (bohužel explicitně pro každý typ) tvar url? |
||
Kcko Profil |
#3 · Zasláno: 15. 12. 2012, 10:21:31
Alphard:
Je to trošku kočkopes ;), píší rychle, jdu běhat a těším se, až prijdu, že tu budu mít nějakou ideu. který by upravoval pravidla pro adresy a šlo by tam právě zadat (bohužel explicitně pro každý typ) tvar url Právě že ne. V routeru si zjistím celou URL, co je controller, co je metoda, co je parametr a vše ostatní je posíláno jako další parametry routeru a dle toho se rozhoduji individuálně v daném controlleru pokud je to potřeba => /produkty/category/30/produkt/55 a bohužel mi vzniklo toto public function categoryAction($params) { if (isset($params['paramsDiff'][2], $params['paramsDiff'][3]) && $params['paramsDiff'][2] == 'produkt') { $flag = 'PRODUKT'; $view = new View(LAYOUTS_DIR . '/produkt-detail.php'); } else { // kategorie $flag = 'KATEGORIE'; $view = new View(LAYOUTS_DIR . '/produkty-list-kategorie.php'); } $model = $this->loadModel('produkty'); $navItem = Navigation::getNavItem($params['navigationItemID']); $navID = Navigation::$lastNavID; $view->cats = $model->getProductList(Navigation::$activeLang); $view->catInfo = $model->getProductCategoryDetail(Navigation::$activeLang, $params['paramsDiff'][1]); $model->paging = new Strankovani(9, "l"); $view->products = $model->getProducts(Navigation::$activeLang, $params['paramsDiff'][1]); $model->paging->pocet_radku = $model->paging->PocetRadku(); $view->paging = Strankovani::toHtml($model->paging); //$view->data = $model->getDetail(Navigation::$activeLang, $params['paramsDiff'][1]); // neexistuje if (!$view->catInfo) { Redirect::url('/' . $params['verifyUrl']); } $view->headline = $view->catInfo->name; $view->baseURL = '/' . $params['verifyUrl']; $this->title = $view->headline . ' | ' . ($navItem->page_title ? : $navItem->name); // crumbs Crumbs::getInstance()->addNavItems(Navigation::getParentItems($navID)); Crumbs::getInstance()->add($view->headline, Storage::getUrl(3)); if ($flag == 'PRODUKT') { $view->productInfo = $model->getProductsByID(Navigation::$activeLang, $params['paramsDiff'][3]); //debug($this->view->productInfo); // zpatky na recepty if (!$view->productInfo) { Redirect::url('/' . $params['verifyUrl']); } $view->productsRand = $model->getProductsRand(Navigation::$activeLang, $params['paramsDiff'][1], $view->productInfo->id, 3); $view->headline = $view->productInfo->name; $this->title = $view->productInfo->name; Crumbs::getInstance()->add($view->productInfo->name, NULL); } echo $view; } a hledám jak z toho ven (asi to NETTE ;))) ). |
||
Alphard Profil |
#4 · Zasláno: 15. 12. 2012, 10:46:27
„asi to NETTE“
Tak odpovídáš si sám... :-) Mně se docela líbí styl, kdy je router nastavitelný odděleně od zbytku kódu. Pak jde sestavit/upravit téměř cokoliv bez přepisování kódu aplikace nebo složitého .htaccess. Tori tady v létě uváděla svůj router projekty.vize.name/router/obsah, který by to měl myslím zvládnout taky. |
||
Kcko Profil |
#5 · Zasláno: 15. 12. 2012, 11:25:00
Alphard:
Díky za odkaz, mrknu na to co Tori vytvořila. Když jsme ještě u toho Nette, tak kolega z kanclu na tom posledním byl a ptal se DG speciálně na to routování a on vytváří URL ručně (resp. to routování, takže stejný problém jako u mě, klient si změní adresu a přestane to fungovat). |
||
Alphard Profil |
#6 · Zasláno: 15. 12. 2012, 11:36:01
Kcko:
„a on vytváří URL ručně“ Nevím, co, jak a proč vytváří, ale já mám část routeru nastavení třeba takhle: $container->router[] = $frontRouter = new RouteList('Front'); $frontRouter[] = new Route('clanek/<id>[|<filename>]', 'Text:page'); $frontRouter[] = new Route('akce/', 'Text:actions'); $frontRouter[] = new Route('akce/<id>[|<filename>]', 'Text:action'); Kdybych se rozhodl mít nase-clanky a nase-akce, jediné místo, které musím změnit, je tato konfigurace. |
||
Kcko Profil |
#7 · Zasláno: 15. 12. 2012, 12:19:47
Alphard:
Ano, ale mělo by se to měnit z DB, ale to je asi tím, že to routování nemáte dynamicky ... Mrknu na to Nette a Router od Tori a nebude snad dalších otázek. Díky. |
||
Alphard Profil |
#8 · Zasláno: 15. 12. 2012, 12:35:33
Kcko:
„že to routování nemáte dynamicky“ Měl jsem na pár převzatých projektech, ale sám se tomu snažím maximálně zabránit. Třeba pro články zatřízené do kategorií raději používám url ve tvaru $frontRouter[] = new Route('clanek/<category>/<filename>', 'Text:page'); S tím, že kategorii předám při tvorbě tvorbě odkazu n:href="Text:page $article->filename, $article->category" než bych ji hledal v routeru.
|
||
Kcko Profil |
#9 · Zasláno: 15. 12. 2012, 13:01:49
Alphard:
Díky za info, doufám, že se s tím sžiju a pochopím to. |
||
Tori Profil |
#10 · Zasláno: 15. 12. 2012, 20:00:13
Kcko:
„/produkty/category/30/produkt/55 => toto je detail produktu z konkrétní kategorie, jak by se tohle mělo přeložit?“ Takže interně ten router funguje tak, že první tři části URL jsou napevno třída, metoda a 1.parametr, a ostatní se exploduje a předá jako pole? A jak skládáte výstupní URL - nešlo by nějak vycházet z toho? Nevím, jak by vypadala URL pokud potřebujete předat více hodnot (stránkování apod.), třeba by to šlo i takhle: - první část URL nechat napevno jako kontroler - pro ostatní části rozdělit na páry text/číslo , a pak postupovat od konce URL a zkoušet, jestli existuje taková metoda kontroleru. Když ji najdete, tak ten pár text(metoda)+číslo vyhodit z URL a zbytek jí předat jako 2.parametr.
Tím bude v URL zachovaná logická posloupnost od kategorií přes články ke komentářům, a to, na jaké úrovni to chcete zpracovávat, byste určil jen definicí příslušné metody. |
||
Kcko Profil |
#11 · Zasláno: 16. 12. 2012, 22:46:17
Tori:
Takže interně ten router funguje tak, že první tři části URL jsou napevno třída, metoda a 1.parametr, a ostatní se exploduje a předá jako pole? Ano, zbytek se ověří a rozhodí do pole jako další parametry URL. add zbytek) Zajímavá myšlenka, díky, promyslím to. (Jestli to tedy vůbec má smysl, abych z toho potom časem nebyl zmatený i já, stejně bude lepší asi to ručně přepsat v htaccessu, případně se juknout na ten Váš router a finálně se začít učit Nette ;] |
||
joe Profil |
#12 · Zasláno: 17. 12. 2012, 01:39:09
Kcko:
„Když jsme ještě u toho Nette, tak kolega z kanclu na tom posledním byl a ptal se DG speciálně na to routování a on vytváří URL ručně (resp. to routování, takže stejný problém jako u mě, klient si změní adresu a přestane to fungovat).“ Na dynamické routování v Nette jsou přece filtry, ne? Dotazuje se přimo databáze, takže nic není napevno a reaguje to hned na změnu (například v adminu) nebo jsem něco nepochopil? :) |
||
Medvídek Profil |
#13 · Zasláno: 17. 12. 2012, 02:25:42
Kcko:
„Takže interně ten router funguje tak, že první tři části URL jsou napevno třída, metoda a 1.parametr, a ostatní se exploduje a předá jako pole?“ Používám podobný princip, example.com/class/function/id/ a pokud potřebuju nějaký rozsáhlejší změny, tak routování: $route['product/(:num)'] = "catalog/product_lookup_by_id/$1"; |
||
Časová prodleva: 11 let
|
0