Router – jak udelat hezkou routu z „/auth/?backlink=“

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

Zdravim, potreboval bych prosim poradit s nastavenim routy (nebo je problem jinde?)

Vytvarim aplikaci s autentifikaci. Jako priklad jsem si vzal examples\CD-collection z distribuce.

Routy mam standartne nastavene takto:

<?php
// Step 4: Setup application router
$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));
?>

a nelibi se mi, ze mi zobrazuji takovouto URL (pri pozadavku na login):

http://localhost/<applikace>/document_root/auth/login/?backlink=ff25

Konkretne se mi nelibi, ze tam vycuhuje ?backlink=ff25

Chapu, ze pokud se budu chtit v one URL zbavit retzece login, tak prejmenuju sablonu na default + patricne upravim kod (tim padem se v URL nezobrazi akce login, ale jen prezenter Auth).
Ale nevim jak se zbravit toho ?backlink=ff25.

PS: V tech routach nemam porad dost jasno, prochazel jsem forum a dokumentaci, ale porad se mi to zda nejake slozite.. Stale poradne netusim, jak se nastavuji :/

Predem dekuji za objasneni

toka
Člen | 253
+
0
-

Zkusil bych toto:

$router[] = new Route('<presenter>/<action>/<id|backlink>', array(
  'presenter' => 'Homepage',
  'action' => 'default',
  'id' => NULL,
  'backlink' => NULL,
));
Endrju
Člen | 147
+
0
-

Dekuji. Ladence se to ale vubec nelibi :/.

Cituji:

Source file ▼

File: D:\webserver\TodoList\libs\Nette\Application\Routers\Route.php Line: 488

InvalidArgumentException
Parameter name must be alphanumeric string due to limitations of PCRE, 'id|backlink' given.
<?php
Line 481:                    $re = '(?:' . preg_quote(substr($name, 1), '#') . '|' . $pattern . ')' . $re;
Line 482:                    $sequence[1] = substr($name, 1) . $sequence[1];
Line 483:                    continue;
Line 484:                }
Line 485:
Line 486:                // check name (limitation by regexp)
Line 487:                if (preg_match('#[^a-z0-9_-]#i', $name)) {
Line 488:                    throw new InvalidArgumentException("Parameter name must be alphanumeric string due to limitations of PCRE, '$name' given.");
Line 489:                }
Line 490:
Line 491:                // pattern, condition & metadata
Line 492:                if ($class !== '') {
Line 493:                    if (!isset(self::$styles[$class])) {
Line 494:                        throw new InvalidStateException("Parameter '$name' has '$class' flag, but Route::\$styles['$class'] is not set.");
Line 495:                    }
?>

Nejaky jiny navrh?

Editoval Endrju (23. 2. 2010 9:43)

toka
Člen | 253
+
0
-

A já si myslel, že i takto by to šlo sjednotit do jedné routy. V tom případě bych to řešil dvěma:

$router[] = new Route('<presenter>/<action>/<id>', array(
  'presenter' => 'Homepage',
  'action' => 'default',
  'id' => NULL,
));

$router[] = new Route('<presenter>/<action>/<backlink>', array(
  'presenter' => 'Homepage',
  'action' => 'default',
  'backlink' => NULL,
));

Neříkám, že to je správně – nemám to teď jak vyzkoušet.

Honza Marek
Člen | 1664
+
0
-

Já myslim, že pak nette nepozná id a backlink. Čili to vygeneruje to „hezkou“ cestu, ale pak se to chytne na tu první routu s id.

Jedině asi nějak takhle:

$router[] = new Route('<presenter>/<action>/backlink/<backlink>', array(
  'presenter' => 'Homepage',
  'action' => 'default',
  'backlink' => NULL,
));

$router[] = new Route('<presenter>/<action>/<id>', array(
  'presenter' => 'Homepage',
  'action' => 'default',
  'id' => NULL,
));

Ale popravdě… je opravdu posílání backlinku tak častá situace, aby se vyplatilo věnovat mu speciální „krásnou“ adresu?

Endrju
Člen | 147
+
0
-

Honzo, je pravda, ze tuto stranku nebude zpracovavat ani robot (vyhledavac), ale rikal jsem si, ze defaultni routy asi nejsou uplne na vsechno a ze treba nekdo z vas zkusenejsich na to mate nejake figle atp.

Jen se mi nezdalo, ze vsechny URL jsou krasne a tahle takto vycniva…

Zrovna me napadlo, jestli by se nedala ta hodnota a promenna schovat do session a pak to z ni vytahnout? Pak by me zajimalo, jaka by byla uprava kodu (dekuji)?
… tedy, ze by to nebyla uplna hloupost..?

No a trosku mimo misu (jen me to zrovna napadlo). Kdyz mam v sablonach odkazy typu:
<a href="{link :Front:Homepage:}"> nebo treba <li n:foreach="$menuItems as $id => $item" {ifCurrent $id}class="current"{/if}><a href="{plink $id}">{$item}</a></li>

Pak kdyz si prohlidnu vygenerovany zdrojovy kod, tak to nevygeneruje absolutni url, ale neco takoveho napriklad <a href="/web/document_root/">

Jak docilim toho, aby mi to generovalo vzdy absolutni URL?

PS: prioritni je ale ta zalezitost s routerem.. (jen jsem kvuli tomuto nechtel zakladat novy topic)

Honza Marek
Člen | 1664
+
0
-

Endrju napsal(a):

Honzo, je pravda, ze tuto stranku nebude zpracovavat ani robot (vyhledavac), ale rikal jsem si, ze defaultni routy asi nejsou uplne na vsechno a ze treba nekdo z vas zkusenejsich na to mate nejake figle atp.

Jen se mi nezdalo, ze vsechny URL jsou krasne a tahle takto vycniva…

Já myslim, že lidi nejsou takový estéti :)

Zrovna me napadlo, jestli by se nedala ta hodnota a promenna schovat do session a pak to z ni vytahnout? Pak by me zajimalo, jaka by byla uprava kodu (dekuji)?
… tedy, ze by to nebyla uplna hloupost..?

Tak ono ten uschovaný httpRequest je v session, tohle je jen jeho identifikátor, který je potřeba přenášet v url (aby to nedělalo bordel, pokud budeš mít otevřeno více tabů nebo tak).

No a trosku mimo misu (jen me to zrovna napadlo). Kdyz mam v sablonach odkazy typu:
<a href="{link :Front:Homepage:}"> nebo treba <li n:foreach="$menuItems as $id => $item" {ifCurrent $id}class="current"{/if}><a href="{plink $id}">{$item}</a></li>
Pak kdyz si prohlidnu vygenerovany zdrojovy kod, tak to nevygeneruje absolutni url, ale neco takoveho napriklad <a href="/web/document_root/">

Jak docilim toho, aby mi to generovalo vzdy absolutni URL?

Pokud dáš na začátek odkazu //, tak se vygeneruje absolutní adresa. {plink //:Front:Homepage:} třeba.

PS: prioritni je ale ta zalezitost s routerem.. (jen jsem kvuli tomuto nechtel zakladat novy topic)

Endrju
Člen | 147
+
0
-

Honza Marek napsal(a):

Dekuji

Jak docilim toho, aby mi to generovalo vzdy absolutni URL?

Pokud dáš na začátek odkazu //, tak se vygeneruje absolutní adresa. {plink //:Front:Homepage:} třeba.

PS: prioritni je ale ta zalezitost s routerem.. (jen jsem kvuli tomuto nechtel zakladat novy topic)

Urcite je to presne takto? Ladenka je nejaka nenabazena…

BadRequestException #404
Cannot load presenter 'Admin:Default', class 'Admin_DefaultPresenter' was not found in
'D:\webserver\SK_Celadna\document_root/../app/AdminModule/presenters/DefaultPresenter.php'.
Source file ▼
File: D:\webserver\TodoList\libs\Nette\Application\Routers\Route.php   Line: 488
<?php
Line 126:
Line 127:                    // Instantiate presenter
Line 128:                    $presenter = $request->getPresenterName();
Line 129:                    try {
Line 130:                        $class = $this->getPresenterLoader()->getPresenterClass($presenter);
Line 131:                        $request->setPresenterName($presenter);
Line 132:                    } catch (InvalidPresenterException $e) {
Line 133:                        throw new BadRequestException($e->getMessage(), 404, $e);
Line 134:                    }
Line 135:                    $request->freeze();
Line 136:
Line 137:                    // Execute presenter
Line 138:                    $this->presenter = new $class;
Line 139:                    $response = $this->presenter->run($request);
Line 140:
?>

Zmenu jsem zkousel provadet zde:

<?php
	<ul>
		<li n:foreach="$menuItems as $id => $item" {ifCurrent $id}class="current"{/if}><a href="{plink $id}">{$item}</a></li>
	</ul>
?>

a zde:

<?php
	<a href="{link :Front:Homepage:}">Homepage</a>
?>

Default presenter vubec nemam a ani ho nikde nevolam…

Zda se, ze pridanim // to nenajde zadny s tech presenteru, tak se snazi hledat apson DefaultPresenter a kdyz nenajde ani ten, tak to padne.

Tak tedy jeste jednou:
kdyz bych pridal // zde href="{plink //$id}" a zde href="{link //:Front:Homepage:}", tak by to melo fungovat? U me to ale nejde, tak nebude chyba jeste nekde jinde? (nebo se to pise jinak)?

Jen pro pripomenuti: Chci docilit toho abych me absolutni URL adresy v odkazech.

Dekuji :)

Editoval Endrju (23. 2. 2010 17:22)