Routování – Server presmerovava pozadavky sam na sebe
- cuga
- Člen | 210
Vysel jsem z prikladu modules-usage v kombinaci s prihlasovanim z akrabat a po par upravach rout uz me prohlizec nechce pustit do modulu admin.
At uz jsem zkousel jakekoliv kombinace, nedari se mi to zmenit. Docela v tom routovani plavu, jak to vypada s tutorialem pro routovani?
Jaky vliv ma poradi rout? V jakem poradi je zapisovat, od obecnejsich po specifictejsich, nebo naopak?
Ukazka rout, ktere jsem tak nejak prubezne doplnoval:
<?php
$router[] = new Route('index.php', array(
'module' => 'Front',
'presenter' => 'Default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Front:Default',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('admin/<action>/<id>', array(
'module' => 'Admin',
'action' => 'Default:default',
'id' => NULL
));
$router[] = new Route('admin/<presenter>/<action>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
));
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<action>/<id>', array(
'action' => 'Front:Default:default',
'id' => NULL
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Front:Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<module>/<presenter>/<action>/<id>', array(
'module' => 'Front',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
?>
Jinak ve vyznamu rout nemam az tak jasno, takze jich tam muze byt par nesmyslnych :)
- ViliamKopecky
- Nette hipster | 230
Zkus tohle? Netestoval jsem to…
<?php
$router[] = new Route('admin/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('admin/<presenter>/<action>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
));
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<action>/<id>', array(
'presenter' => 'Front:Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('index.php', array(
'module' => 'Front',
'presenter' => 'Default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Front:Default',
'action' => 'default',
'id' => NULL,
));
?>
Postupovat od konkrétních k obecným.
Editoval enoice (25. 10. 2008 22:34)
- ViliamKopecky
- Nette hipster | 230
Upravil jsem to, zkus to znova.
Btw: Jaký je rozdíl mezi
'presenter' => 'Module:Presenter'
a
'module' => 'Module',
'presenter' => 'Presenter'
- cuga
- Člen | 210
Tak mozna bude problem nekde jinde.
Pokud obejdu prihlasovani, tak to beha dobre. Pak se nejak prihlasim a opet pohoda. Jakmile se odhlasim, jde to do kytek.
Napada nekoho, co muze zlobit???
Zrejme problem v startup metode v BasePresenteru
<?php
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated()) {
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Auth:login', $backlink);
}
$this->template->jmeno = $user->getIdentity()->getName();
parent::startup();
}
?>
Editoval cuga (25. 10. 2008 23:02)
- ViliamKopecky
- Nette hipster | 230
Měl bys ještě u !$user->isAuthenticated()
přidat
podmínku, když se nacházíš na ':Admin:Auth:login'
. Jinak se to
zacyklí.
- David Grudl
- Nette Core | 8218
cuga napsal(a):
$router[] = new Route('admin/<action>/<id>', array( 'module' => 'Admin', 'action' => 'Default:default', 'id' => NULL ));
View nemůže obsahovat dvojtečku, v podstatě odpovídá názvu metody. Dvojtečku může odbsahovat presenter nebo admin a odpovídá oddělovači jmenných prostorů neboli modulů.
enoice napsal(a):
Btw: Jaký je rozdíl mezi
'presenter' => 'Module:Presenter' a 'module' => 'Module', 'presenter' => 'Presenter'
Rozdíl je, když jeden parametr (např. module) není uveden v masce URL (tedy je fixní) a naopak druhý (např. presenter) tam uveden je. Potom je v URL pouze název presenteru a při routování se k jeho názvu dolepí fixní prefix modulu.
- David Grudl
- Nette Core | 8218
cuga napsal(a):
No jasne… teda to me mohlo napadnout taky :)
Cyklit se to ocividne cykli… akorat jak se toho zbavit… zkusil sem zrusil require_once s BasePresenterem, kde zjistuju isAuthenticated() a stejne se to porad cykli…
Dej tam něco jako
if (!($this instanceof AuthPresenter)) {
...
}
- cuga
- Člen | 210
dal jsem to:
<?php
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!($this instanceof AuthPresenter)) {
if (!$user->isAuthenticated())
{
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Auth:login', $backlink);
}
}
$this->template->jmeno = $user->getIdentity()->getName();
parent::startup();
}
?>
ale prd z toho…
- David Grudl
- Nette Core | 8218
A jmenuje se tvá třída skutečně AuthPresenter? Napsal jsem to jen jako příklad.
- ViliamKopecky
- Nette hipster | 230
Nevím jak moc je to košér, ale já to dělám takhle.
...
if (!$user->isAuthenticated() && $this->view != "login")
...
- David Grudl
- Nette Core | 8218
Pokud máš ten kód ve finálním presenteru, tak samozřejmě stačí ověřit view. A pokud je v presenteru, ze kterého se dědí další presentery, tak to chce ověřit i (nebo jen) instanci.
- David Grudl
- Nette Core | 8218
cuga napsal(a):
jj, jmenuje se AuthPresenter
a zkusil sem obe podminky a nicemu z toho se nechce sakra…
No jen že jsem tam zahlédl
$this->redirect(':Admin:Auth:login')
, tak jsem si říkal, že
to možná bude jiná třída…
- cuga
- Člen | 210
Zkusil sem to dvema zpusoby:
<?php
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated() && !($this instanceof AuthPresenter))
{
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Auth:login', $backlink);
}
}
$this->template->jmeno = $user->isAuthenticated() ? $user->getIdentity()->getName() : "nepřihlášen";
parent::startup();
}
?>
nebo
<?php
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated())
{
$backlink = $this->getApplication()->storeRequest();
if (!($this instanceof AuthPresenter)) {
$this->redirect(':Admin:Auth:login', $backlink);
}
}
$this->template->jmeno = $user->isAuthenticated() ? $user->getIdentity()->getName() : "nepřihlášen";
parent::startup();
}
?>
a nemuzu rict, ze bych slavil uspech… a rozhodne nevim, kde by se to mohlo cyklit…
- David Grudl
- Nette Core | 8218
Už nevím jak to říct ;)
$a = 'Admin_AuthPresenter';
$b = 'AuthPresenter';
echo $a === $b ? 'shodné' : 'rozdílné';
- cuga
- Člen | 210
David Grudl napsal(a):
Už nevím jak to říct ;)
$a = 'Admin_AuthPresenter'; $b = 'AuthPresenter'; echo $a === $b ? 'shodné' : 'rozdílné';
Mas to se mnou tezke :) pro jistotu pochopeni, misto instanceof AuthPresenter mam dat instanceof Admin_AuthPresenter
Cili:
<?php
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated() && !($this instanceof Admin_AuthPresenter))
{
$backlink = $this->getApplication()->storeRequest();
$this->redirect(':Admin:Auth:login', $backlink);
}
$this->template->jmeno = $user->isAuthenticated() ? $user->getIdentity()->getName() : "nepřihlášen";
parent::startup();
}
?>
a vysledek… nefakci… a jestli i ted sem mimo, tak to svedeme na pozdni nocni hodinu :)
- David Grudl
- Nette Core | 8218
Jo, to je správně :-)
Proč to nefunguje těžko říct, nejlépe kód krokovat a zjistit, co se děje. Jestli nemáš žádné IDE, stáhni si Zend Studio nebo PHPEd, měsíc by to mělo fungovat.
- cuga
- Člen | 210
Tak problem byl nekde jinde :)
Nejdriv jsem mel tridu Article… nejakym kopirovanim se mi tam dostala metoda startup() s tim presmerovavanim na prihlaseni. Tridu jsem pak prepsal na Articles, akorat ze mi tam zustaly oba soubory. A zatimco jsem prohlizel Articlec, vesele se to cyklilo v Article. Nemam zdani proc tam lezl, ale kdyz sem na to prisel, vytrhal si par vlasu, zrusil tu metodu, tak to beha jak ma…
Eureka :)