EN | CS | Přihlásit | Registrovat

Generování odkazů

Parametry metody link() nesouvisí přímo s URL. Prvním argumentem je cíl (destination) určující cílový presenter & action, druhým (resp. dalšími) jsou parametry předávané tomuto presenteru:

$this->link(destination [,arg [,arg ...]]);

kde destination je:

  • 'anotherAction' (odkaz na aktuální presenter a anotherAction)
  • 'AnotherPresenter:anotherAction' (odkaz na AnotherPresenter a anotherAction)
  • 'AnotherPresenter:' (odkaz na AnotherPresenter a výchozí actionDefault)
  • 'AnotherModule:Presenter:action' (odkaz do submodulu, je třeba psát jako relativní fully qualified action)
  • ':TotalyAnotherModule:Presenter:action' (odkaz do jiného modulu, je třeba psát jako absolutní fully qualified action)
  • '//AnotherPresenter:anotherAction' (absolutní odkaz s http://domena.tld/... na začátku na AnotherPresenter a anotherAction)
  • 'this' (odkaz na aktuální presenter a aktuální action)

Parametry presenteru je možné předat jako asociativní pole:

$this->link('show', array('id' => 10, 'lang' => 'en'));

Asociativní pole není příliš sexy, proto Nette nabízí vychytávku: pokud existuje v cílovém presenteru metoda renderShow($id, $lang, ...) nebo metoda prepareShow($id, $lang, ...), kde ono ‚show‘ v názvu odpovídá názvu linkovaného view, je možné klíče ‚id‘ a ‚lang‘ vynechat – automaticky se vezmou z parametrů těchto metod:

$this->link('show', array(10, 'en'));

A naopak, když je dotyčná metoda po odkliknutí zavolána, tak se jí předají tyto argumenty v parametrech $id a $lang. V poli je možné uvést další parametry, které metody renderShow a prepareShow nedefinují, například lze nastavit nějaký persistentní parametr (v tom případě ovšem už s asociativním klíčem). Pokud žádný takový další parametr není, je možné pole úplně vynechat:

$this->link('show', 10, 'en');

Tedy v Nette se odkazuje na presenter & action, nebo ještě jednodušeji: odkazuje se na konkrétní metodu. $this->link('Catalog:show', 10, 'en') odkazuje a po odkliknutí zavolá metodu CatalogPresenter::renderShow(10, 'en'). Jaké se vytvoří URL v tu chvíli nehraje roli. To je úkol oddělené vrstvy – routování.

Odkazování v šablonách

Rozlišujeme více možností vytvoření odkazu, proto není jedno na jakém objektu metodu link() voláme. Jelikož action/view může měnit pouze presenter, komponenty pracují vždy pod tímto prahem. Navíc se prohledávají odkazy v hierarchii směrem dolů k potomkům. Tudíž $control->link() vede na signál, $presenter->link() obvykle na view (nebo signál, je-li označen vykřičníkem). V šablonách se za asistence filtru curlyBrackets může odkaz nad komponentou zkrátit pomocí značky {link} a odkaz nad presenterem pomocí {plink}.

V šabloně presenteru jsou zápisy $presenter->link() a $control->link() ekvivalentní (platí i pro zkrácený zápis plink a link), protože i presenter je komponentou a jako navázaný presenter uvažuje sám sebe.

Rozdíl se projeví v šablonách komponent, kde zápis {link Home:default} nevygeneruje odkaz, ale signál na komponentu, zatímco {plink Home:default} vygeneruje platný odkaz na presenter, se kterým je spárována.

V šabloně se odkazy velmi často vytvářejí za pomoci filtru curlyBrackets:

{* odkaz nad presenterem *}
<a href="{$presenter->link('edit', 10)}">self::edit(10)</a>
<a href="{$presenter->link('Product:list')}">Product::list()</a>
<a href="{$presenter->link('Article:view')}">Zobrazit články</a>

{* odkaz nad vykreslitelnou komponentou *}
<a href="{$control->link('Article:view')}">Zobrazit články</a>

{* zkrácený zápis *}
<a href="{plink Article:view}">Zobrazit články</a>
<a href="{link Article:view}">Zobrazit články</a>
<a href="{link Article:view}" onclick="{ajaxlink Article:view}">Zobrazit články</a>

Poznámka: proměnné $presenter a $control jsou frameworkem předávány šabloně automaticky. Pro více informací shlédněte dokumentaci třídy Control či její API.

Zkrácený zápis plink a link je vhodnější použít, pokud dopředu známe počet parametrů. Pokud počet parametrů neznáme, předáme parametry polem. Při předávání parametrů polem ale musíme využít nezkráceného zápisu, jinak by došlo k obalení pole $args ještě prázdným polem.

{* pokud znám počet parametrů, můžu použít zkrácený zápis *}
{link default, 'id' => 5, 'name' => 'název produktu'}

{* pro předání parametrů polem se musí zatím použít nezkrácený zápis *}
{? $args = array('id' => 5, 'name' => 'název produktu'); ?}
{$presenter->link('default', $args)}

{* v budoucnu možná bude tento nedostatek eliminován označením proměnné (pole) hvězdičkou *}
{link default, *$args}

Shrňme si to:

  • $control->link() neboli link generuje odkaz nad komponentou
  • $presenter->link() neboli plink generuje odkaz nad presenterem
  • v obyčejné šabloně presenteru je za komponentou považován presenter, tudíž je možno v presenteru použít i link
  • zkrácený zápis link a plink se hodí především známe-li počet parametrů (jsou-li nějaké)

Odkazování uvnitř presenteru a komponent

URL generuje v presenteru a komponentě funkce $this->link('edit', 10) – tedy stejně jako v šabloně. Lze vygenerovat URL sám na sebe $this->backlink().

přesměrování slouží $this->redirect(...), k přechodu na jiný presenter/action $this->forward(...). Rozdíl je v tom, že redirect provede přesměrování na jinou stránku pomocí HTTP a forward jen přepošle zpracování jinam.

Viz také:


Komentáře Comments feed

PJK | 2. 7. 2010, 11:58 | comment

Z popisu to není úplně jednoznačně jasné, pokud chceme absolutní odkaz, patří // před celou cestu odkazu, ne před presenter, tzn. nikoliv :Module//Presen­ter:action, ani :Module://Pre­senter:action, ale //:Module:Pre­senter:aciton.

Login to submit a comment