#1 23. 2. 2010 8:14

Endrju
Člen
Místo: Ostrava
Registrovaný: 31. 10. 2009
Příspěvky: 131

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

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

Offline

 

#2 23. 2. 2010 9:02

toka
Člen
Místo: Kostelec nad Orlicí
Registrovaný: 5. 8. 2009
Příspěvky: 173

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

Zkusil bych toto:

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

$this->terminate();

http://twitter.com/TomasKavalek

Offline

 

#3 23. 2. 2010 9:43

Endrju
Člen
Místo: Ostrava
Registrovaný: 31. 10. 2009
Příspěvky: 131

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

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)

Offline

 

#4 23. 2. 2010 10:30

toka
Člen
Místo: Kostelec nad Orlicí
Registrovaný: 5. 8. 2009
Příspěvky: 173

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

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.


$this->terminate();

http://twitter.com/TomasKavalek

Offline

 

#5 23. 2. 2010 10:57

Honza Marek
Moderator
Místo: Kladno
Registrovaný: 31. 3. 2007
Příspěvky: 1281
Web

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

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?

Offline

 

#6 23. 2. 2010 11:18

Endrju
Člen
Místo: Ostrava
Registrovaný: 31. 10. 2009
Příspěvky: 131

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

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)

Offline

 

#7 23. 2. 2010 12:03

Honza Marek
Moderator
Místo: Kladno
Registrovaný: 31. 3. 2007
Příspěvky: 1281
Web

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

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)

Offline

 

#8 23. 2. 2010 14:11

Endrju
Člen
Místo: Ostrava
Registrovaný: 31. 10. 2009
Příspěvky: 131

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

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)

Offline

 

Zápatí