Routování – Server presmerovava pozadavky sam na sebe

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
cuga
Člen | 210
+
0
-

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
+
0
-

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)

cuga
Člen | 210
+
0
-

Diky moc, ale nefunguje to:

InvalidStateException

Missing presenter in route definition.

ViliamKopecky
Nette hipster | 230
+
0
-

Upravil jsem to, zkus to znova.


Btw: Jaký je rozdíl mezi

'presenter' => 'Module:Presenter'

a

'module' => 'Module',
'presenter' => 'Presenter'
cuga
Člen | 210
+
0
-

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
+
0
-

Měl bys ještě u !$user->isAuthenticated() přidat podmínku, když se nacházíš na ':Admin:Auth:login'. Jinak se to zacyklí.

cuga
Člen | 210
+
0
-

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…

David Grudl
Nette Core | 8218
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

A jmenuje se tvá třída skutečně AuthPresenter? Napsal jsem to jen jako příklad.

ViliamKopecky
Nette hipster | 230
+
0
-

Nevím jak moc je to košér, ale já to dělám takhle.

...
 if (!$user->isAuthenticated() && $this->view != "login")
...
cuga
Člen | 210
+
0
-

jj, jmenuje se AuthPresenter

a zkusil sem obe podminky a nicemu z toho se nechce sakra…

David Grudl
Nette Core | 8218
+
0
-

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
+
0
-

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
+
0
-

David Grudl napsal(a):

No jen že jsem tam zahlédl $this->redirect(':Admin:Auth:login'), tak jsem si říkal, že to možná bude jiná třída…

:Admin:Auth:login vezme z modulu Admin tridu Admin_AuthPresenter a v tom metodu actionLogin

David Grudl
Nette Core | 8218
+
0
-

No vždyť! Tak ji dej to té podmínky.

cuga
Člen | 210
+
0
-

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
+
0
-

Už nevím jak to říct ;)

$a = 'Admin_AuthPresenter';
$b = 'AuthPresenter';

echo $a === $b ? 'shodné' : 'rozdílné';
cuga
Člen | 210
+
0
-

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
+
0
-

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
+
0
-

dneska na to hazim bobek… budu pokracovat zajtra… diky za pomoc…

Jod
Člen | 701
+
0
-

Ja to robím tak, že prihlásenie testujem v Admin_BasePresenter, ktorý dedia všetky administračné presentery a auth presenter dedí Presenter z nette.

cuga
Člen | 210
+
0
-

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 :)