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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
onge
Člen | 53
+
0
-

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?

Tomik
Nette Evangelist | 485
+
0
-

Asi bych si napsal vlastní filtr do šablon, který vykresluje menu, v něm bych pak porovnával aktuální název presenteru a view s tím,
který vypisuju, pokud by byl stejný, vypsal bych jen <strong>, pokud ne, pak celý odkaz.

ViliamKopecky
Nette hipster | 230
+
0
-

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 | 8218
+
0
-

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
+
0
-

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
+
0
-

enoice napsal(a):
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.

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
+
0
-

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

simon
Člen | 98
+
0
-

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

ViliamKopecky
Nette hipster | 230
+
0
-

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.

Tomik
Nette Evangelist | 485
+
0
-

Možná na to ale David vymyslí něco mnohem chytřejšího ;]

Mě se náhodou toto tvé řešení líbí! :)

David Grudl
Nette Core | 8218
+
0
-

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
+
0
-

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.

Tomik
Nette Evangelist | 485
+
0
-

Napadlo mě, že by nebylo špatné mít možnost i negovat, tedy něco ve smyslu

<?php
  {ifCurrent !Admin:login}<a href="{link Admin:login}">Přihlašte se!</a>{/if}
?>

Nebo to lze již nějak provést i nyní?

David Grudl
Nette Core | 8218
+
0
-

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
+
0
-

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ě… ;)

simon
Člen | 98
+
0
-

Ahoj Davide, jak je na tom ifCurrent? Docela by se to hodilo. Muzu to uz pouzivat v ostre aplikaci?Diky

Ola
Člen | 385
+
0
-

Zdravím, někde v posledních revizích přestalo fungovat :Admin:NazevPresenteru:* .. Proč? Docela se mi to hodilo :)

David Grudl
Nette Core | 8218
+
0
-

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
+
0
-

Mě to vypíše, že to takovej presenter nenalezlo :(

Ola
Člen | 385
+
0
-

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)

PetrP
Člen | 587
+
0
-

A skutečně to funguje nebo se jenom nevypisuji Exception protože defaultně je nastaveno Presenter::INVALID_LINK_SILENT nebo Presenter::INVALID_LINK_WARNING (když není production).

Editoval PetrP (1. 2. 2009 22:43)