Problem s nechtenym automatickym redirectem routeru
- Ascaria
- Člen | 187
Zdravim,
seznamuju se s nette a asi jsem spravne nepochopil, jak pracuje router. A ten se asi rozhodl, ze me bude zneprijemnovat zivot.. :)
mam takto router v bootstrapu
<?php
// Setup router
{
$router = $application->getRouter();
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>[/<id [0-9]+>][/<sid [0-9]+>]', 'Sekce:default');
$router[] = new Route('<presenter>/<action>', 'Homepage:default');
};
?>
a takto vypada render metody
<?php
public function renderDefault()
{
// model s daty
$model = new NavModel($this->context->getService('dibi'), $this->context->params->db);
// vybrany menu item
$this->template->nav = $model->GetById($this->getParam('id'));
}
?>
mam administrovatelne sekce a vygenerovane odkazy v html maji takovyto tvar
napriklad (kdyby jsem se mohl zbavit toho „default“, nevadilo by mi to):
www.domena.cz/sekce/default/6
www.domena.cz/sekce/default/5
kazda sekce muze mit jeden nebo vice zaznamu, pokud se neuvede sid, zobrazeji se vsechny, pokud uvede tak jen ten jeden
nejdrive jsem zobrazoval sekce pomoci /sekce/show/id, to slo korektne (asi), ale pak jsem zjistil, ze v defaultu stejne nic nemam, tak jsem to na nej prehodil
od te doby me z neznameho duvodu sekce s id5, ac ma v html zdrojaku spravny tvar, sama redirectuje (nevim co jineho nez redirect by to bylo) na www.domena.cz/sekce/5 a skonci to chybou 404, nicmene vsechny ostatni sekce, jako napriklad ta s id6 ale takto neredirectuje a ma adresu www.domena.cz/sekce/default/6
pokud router zmenim na:
<?php
$router[] = new Route('<presenter>/<action>/<id [0-9]+>[/<sid [0-9]+>]', 'Sekce:default');
?>
tak najednou se vsechny sekce zacnou zobrazovat jako
www.domena.cz/5
www.domena.cz/6
a chyba 404 kterou tu popisuju nenastane.
Chtel bych aby fungoval tvar www.domena.cz/sekce/6, a nekdy pozdeji ve tvaru www.domena.cz/seo-nazev-sekce a pri sid www.domena.cz/…azev-zaznamu
Nevim co s tim a uvital bych pomoc :)
EDIT: nejdriv jsem odkazy stavel jako
<?php
$this->link('Sekce:show', Array('id' => 5));
?>
a ted
<?php
$this->link('Sekce:', Array('id' => 5));
?>
Editoval Ascaria (1. 7. 2011 11:02)
- castamir
- Člen | 629
toho default se můžeš zbavit smazáním /<action>
<?php
...
$router[] = new Route('<presenter>[/<id [0-9]+>][/<sid [0-9]+>]', 'Sekce:default');
...
?>
že v defaultu nic nemáš je možná způsobeno tím
<?php
$this->template->nav = $model->GetById($this->getParam('id'));
?>
kde id bude nejspíš 0 nebo undefined – prostě to nenajde žádný odpovídající záznam
Další 2 odstavce (ohledně nějakého prohození a error 404) jsem moc nepobral, nicméně předpokládám, že to zkoušíš přímo na serveru a ne na lokálu. Zkus se mrknout do složky log, kde bys měl mít výpis laděnky k dané chybě (v názvu souboru je i datum)
Editoval castamir (1. 7. 2011 14:19)
- Ascaria
- Člen | 187
ze v defaultu nic nemam jsem myslel to ze renderDefault byla zbytecna a pouzivalo se jen renderShow, tak jsem to prehodil do defaultu :)
spis me so o to proc jednou to nette udelalo odkaz domena.cz/sekce/default/6 a nacetlo spravne obsah, a podruhy uplne ten samej link, akorad jiny id a najednou z toho bylo domena.cz/sekce/5 a hodilo to 404..
no skoda ze jsi smazal ten predchozi hezky vysvetlenej prispevek, podle nej by se dalo hezky navrhnout routu :)
- castamir
- Člen | 629
smazal jsem ho, protože byl chybný a nechtěl jsem tu šířit kravinu.
Každopádně změnou pravidel routování se ti změní i routy (logicky).
Změnil jsi nepovinný údaj „id“ na povinný, což mohlo vést k tomu, že daná routa nefungovala a použila se další v pořadí (Homepage:default)
Dál taky předpokládám, že máš renderDefault v BasePresenter a ne v SekcePresenter.
Doporučuju ten výpis jediného záznamu vrátíš do renderShow (v SekcePresenter) a do renderDefault (v témže presenteru) dáš výpis všech záznamů, případně to můžeš dát do templatu přímo viz ukázka CD-collection (DashboardPresenter a template default)
Editoval castamir (1. 7. 2011 14:32)