21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
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
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
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
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
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
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
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
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
Alphard:
Díky za info, doufám, že se s tím sžiju a pochopím to.
Tori
Profil
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
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
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
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";

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0