Pokud odkaz smeruje na stranku, kde zrovna jsem, vypise se jinak

- onge
 - Člen | 53
 
Treba misto <a> se uzavre do <strong>. Takova ta uzitecna vec, ze clovek vidi, kde zrovna je a neklikne na odkaz, co ho hodi zpatku na stranku, kde zrovna je.
Jedine, co me napadlo, jak to udelat je porovnat si aktualni URL s tim, co vypadne z funkce link, treba pri generovani menu. Jenze mam tak nejak porad pocit, ze by to melo jit i lip.
Uz jste tohle s Nette resili? Prisel nekdo na nejake elegantni reseni?

- ViliamKopecky
 - Nette hipster | 230
 
Myslím, že pokud se nechceme držet nějakých hodně pevných konvencí, tak na to nejde udělat obecné řešení.
Možná by bylo dobré vytvořit nějaké
Link::isEqual($link[, $scope=array('Presenter', 'action']) což by
porovnávalo Linky s nastavitelným $scope (asi to neni uplně
odpovídající název), které se musí rovnat, aby když dojde k situaci
podkategorií, tak aby byla aktivní zároveň položka nadkategorie
i podkategorie (s tím, že každá má nastavené jiné
$scope).
Je to srozumitelné?
Editoval enoice (23. 11. 2008 21:47)

- David Grudl
 - Nette Core | 8285
 
Porovnávat URL určitě není správná cesta, ve spojení s komponentami to může dávat zcela špatné výsledky.
Nicméně jsem si vědom, že jde o velmi žádanou funkčnost, tak jsem se pokusil najít obecné a také výkonné řešení. A snad se podařilo ;)
Trik je v tom, že při generování odkazu se detekuje, jestli odkaz
míří na aktuální stránku. A přímo argumenty metody link()
specifikují základní scope, o kterém psal enoice. Výsledek pak
vrátí
$presenter->getCreatedRequest()->hasFlag('current').
Ověřovat „vyšší scope“ skutečně nelze řešit obecně, nicméně nějakou metodu porovnávající modul, presenter, view podle masky/výčtu zkusím vymyslet.
Otázkou je, jak to nějak šikovně implementovat do filtru curlyBrackets.
Zkusmo jsem přidal markup {ifCurrent}:
<a href="{link edit, 10}" {ifCurrent}style="color:gray"{/if}>edituj</a>
Ale předpokládám, že přijdeme na něco lepšího.

- ViliamKopecky
 - Nette hipster | 230
 
Ještě bych podotknul že {ifCurrent} se řídí posledním
vygenerovaným PresenterRequestem ({link},
{plink}).
Zvláštní příklad nastane ve chvíli, kdy mám například menu v
<ul> seznamu a class="current" budu chtít
přiřazovat elementu <li>, ale {link} se vytváří až
později.
<ul>
{? $link=$presenter->link("...")}<li {ifCurrent}class="current"{/if}><a href="{$link}">...</a></li>{/if}
...
</ul>
A tak mě napadá udělat něco jako silentLink
({slink $link, ?}), který by nic nevypsal, ale jen vytvořil
proměnnou a zároveň i PresenterRequest.
<ul>
{slink $mylink, Default:default)}<li {ifCurrent}class="current"{/if}><a href="{$mylink}">...</a></li>{/if}
...
</ul>
					Editoval enoice (24. 11. 2008 9:18)

- PetrP
 - Člen | 587
 
enoice napsal(a):
A tak mě napadá udělat něco jakosilentLink({slink $link, ?}), který by nic nevypsal, ale jen vytvořil proměnnou a zároveň iPresenterRequest.
A nebylo by jednoduší přidat do ifCurrent volitelne
parametry jako u linku. Tedy když je nevyplním použije se
poslední link, jinak ten který vyplní. tedy:
<ul>
<li {ifCurrent Default:default}class="current"{/if}><a href="{link Default:default}">...</a></li>
</ul>
Abych ale nemusel psát v linku znova to samé, tak u něj by se dalo zase
rozšířit, že když se nevyplní použije se to poslední z
ifCurrent:
<ul>
<li {ifCurrent Default:default}class="current"{/if}><a href="{link}">...</a></li>
</ul>
Možná na to ale David vymyslí něco mnohem chytřejšího ;]
Editoval PetrP (24. 11. 2008 10:38)

- ViliamKopecky
 - Nette hipster | 230
 
PetrP napsal(a):
Možná na to ale David vymyslí něco mnohem chytřejšího ;]
Ano, jako vždy ;) snad mu aspoň posloužíme k inspiraci, hehe

- ViliamKopecky
 - Nette hipster | 230
 
simon napsal(a):
Nevim co delam spatne:( hazi mi to tuhle chybu
Call to a member function getCreatedRequest() on a non-object in /home/simon/Workspace/php/nette/project/portal/app/temp/cache-Nette.Template%005e230418dc79c44ce6757de085fe5f5c.menu.phtml on line 5
Nepoužíváš to v nějakém Controlu? Vypadá to že uvnitř
šablony nemáš definovaný $template->presenter.

- David Grudl
 - Nette Core | 8285
 
Ale tohle by mělo fungovat:
<li {ifCurrent Default:default}class="current"{/if}><a href="{link Default:default}">...</a></li>
co zatím není commitnuté, tak rozšíření scope:
<li {ifCurrent Default:*}class="current"{/if}><a href="{link Default:default}">...</a></li>
a výše uvedené
<li {ifCurrent Default:default}class="current"{/if}><a href="{link}">...</a></li>
protože obojí jde logikou proti sobě, takže to musím ještě domyslet.

- phx
 - Člen | 651
 
Bylo by fajn se vyhnout opakovani cile odkazu. Jednou je to v podmince ifCurrent a podruhe je to pri generovani samotneho odkazu:(
Nadruhou stranu mi u to posledni s {link} prijde dost velke
WTF. Alespon pro nezasvecene na prvni pohled. (Kde se sakra vzalo to link:)
Dale me napada, ze nekdy by se hodilo porovnavat i s parametry (urcitymy) a nekdy bez nich.

- David Grudl
 - Nette Core | 8285
 
V podstatě jo…
<?php
   {ifCurrent Admin:login}{else}<a href="{link Admin:login}">Přihlašte se!</a>{/if}
?>
Edit: opravený preklep – výkričník navyše

- Tomik
 - Nette Evangelist | 485
 
To mě taky napadlo.. :)
Ale bohužel to potom vyhazuje `
Parse error: syntax error, unexpected T_ELSE in
C:\WWW\wiki\app\temp\cache-Nette.Template%00ed7e15e92d05ae9b46e846a60e010ede.%40layout.phtml
on line 24, protože `{ifCurrent Admin:login} se nepřevede a
zůstane v přeložené PHP šabloně pořád jako
{ifCurrent Admin:login}. A nebo dělám něco špatně… ;)

- David Grudl
 - Nette Core | 8285
 
Ola napsal(a):
Zdravím, někde v posledních revizích přestalo fungovat :Admin:NazevPresenteru:* .. Proč? Docela se mi to hodilo :)
Nezaznamenal jsem takový problém

- Ola
 - Člen | 385
 
Konkrétně mi to vyhodí
InvalidLinkException - No route for Admin:Banners:*()
Ta chyba tam být musí .. Viz kód z šablony:
<li><a<?php $presenter->link(':Admin:Banners:*'); if ($presenter->getLastCreatedRequestFlag("current")): ?> class="active"<?php endif ?> href="<?php echo $template->{$_cb->escape}($presenter->link(':Admin:Banners:')) ?>">Bannery</a></li>
EDIT: Po zakomentování tohoto:
Presenter::$invalidLinkMode = Environment::isProduction() ? Presenter::INVALID_LINK_SILENT : Presenter::INVALID_LINK_EXCEPTION;
to funguje ..
Editoval Ola (31. 1. 2009 14:33)