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 | 8228
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 link
u. 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 | 8228
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 | 8228
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 | 8228
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)