Router – jak udelat hezkou routu z „/auth/?backlink=“
- Endrju
- Člen | 147
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
- Endrju
- Člen | 147
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
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
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
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
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
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)