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 shttp://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()nebolilinkgeneruje odkaz nad komponentou$presenter->link()neboliplinkgeneruje 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
linkaplinkse 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().
K 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é:




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//Presenter:action, ani :Module://Presenter:action, ale //:Module:Presenter:aciton.