Možnosti Latte pro definice v šablonách
- dEath
- Člen | 39
Ahoj,
napadla mě taková věc, podle možností, které jsem zkoušel, to Latte neumí nebo možná dělám něco špatně. Zkoušel jsem použít víceřádkové definování přímo v šabloně, např.
{
var $var = 'nejaky text'
var $num = 10
}
ale ono to nefunguje a muselo se to napsat jako:
{var $var = 'nejaky text'}
{var $num = 10}
Viděl bych v tom výhodu např. při složitějších iteracích při nepoužití n:týho zápisu, např. při generování nějakého bloku na úrovni šablony pro výpis patřičných proměnných nebo pro vícenásobné definování proměnných (ano, dá se to udělat v presenteru a poslat např. jako pole, ale pokud je to proměnná pouze pro šablonu, např. podržení textového řetězce při podmíněném vkládání, aby se text nemusel opakovat a nemusel jsem ho posílat z presenteru, přijde mi to logičtější. Např.
{var $text = 'cokoliv'}
{var $dalsi = 'dalsi'}
{if podmineny_vyraz}<a href="#">{$text}</a>{else}{$text}{/if}
{if podmineny_vyraz}<strong>{$dalsi}</strong>{else}{$text}{/if}
Při rozšířených možnostech by se to dalo napsat hezším způsobem
{
var $text = 'cokoliv'
var $dalsi = 'dalsi'
}
{if podmineny_vyraz}<a href="#">{$text}</a>{else}{$text}{/if}
{if podmineny_vyraz}<strong>{$dalsi}</strong>{else}{$text}{/if}
nebo (to už bude asi vypadat hůř)
{
var $text = ''
switch($presenter->action)
case 'nejaka_akce'
$text = 'cokoliv'
break;
case 'nejaka_dalsi_akce'
$text = 'cokoliv'
break;
/switch
}
{$text}
ano, na prvním příkladu ten význam trošku uniká a vypadá zbytečný, ale při nějaké složitějších akcích (jako druhá ukázka), jak jsem psal, by se to poměrně hodilo a vypadá to přehlednějc (i když by to vypadlo, že se do šablon tahá mnohem víc PHPka, ale s foreach a for problem není). Ano, jak někoho mohlo napadnout, Latte by se pak ještě víc podobalo TFS.
Nebo už něco takového v šablonách jde? Mně se to nepodařilo …
Editoval dEath (26. 5. 2011 23:20)
- Filip Procházka
- Moderator | 4668
Mohlo by fungovat něco takového
{var $var = 'nejaky text', $num = 10}
:)
- bojovyletoun
- Člen | 667
asi jsi první, kdo má tuto poptávku, proto to v šablonách není. Na
první pohled to vypadá jako moc velký guláš. Funguje ale toto
{? any_code();}
Ještě tip (uložení výsledku podmínky + n
atributy ):
{if $res=podmineny_vyraz}<a href="#">{$text}</a>{else}{$text}{/if}
<a href="#" n:tag-if="$res">{$text} rychlejší zápis</a>
{if $res}<strong>{$dalsi}</strong>{else}{$text}{/if}
- dEath
- Člen | 39
rozdělení var
čárkou by fungovat mohlo, to by problém
řešilo při definování dvou a více proměnných,
pokud by to bylo řešeno jak uvádí bojovyletou, už by to docela ztrácelo na
přehlednosti a to právě není ten účel, který jsem měl na mysli (i když
to tak jde dělat samozřejmě).
smyslem toho je, aby se některé iterace či operace dali provést na
úrovni šablony bez použití <?PHP ?> tagů, ale s použitím Latte.
Když šablonuji, vidím v podobných zápisech poměrně velké výhody,
protože se tak dá „programový“ šablonovací kód vyřešit
v samostatném uzavřeném bloku { ... }
a HTML z toho vyplyne
dál a je to na úpravy přehlednější.
otázkou je, kolik lidí řeší práce s nějakými texty na úrovni šablon, já jsem si na to docela zvykl, abych nemusel definovat nějaké stejné části několikrát, ale např. s pomocí bloků atp.
vlastně by to mohlo vypadat i takto, mě tam právě někdy přijde zbytečné za každým řádkem, když tam není vloženo HTML, uvádět složené závorky.
{
if $prom_z_presenteru
include #nejaky_blok
else
include #dalsi_blok
/if
}
podle mě to takhle vypadá lépe než (ale asi je to o zvyku, a šetří to psaní :))
{if $prom_z_presenteru}
{include #nejaky_blok}
{else}
{include #dalsi_blok}
{/if}
jde především o zpřehlednění (a z části zjednodušení) Latte než o nějaké featury
Editoval dEath (27. 5. 2011 0:45)
- Patrik Votoček
- Člen | 2221
dEath napsal(a):
{ if $prom_z_presenteru include #nejaky_blok else include #dalsi_blok /if }
to už můžeš psát rovnou
<?php
if ($prom_z_presenteru) {
Nette\Latte\DefaultMacros::includeTemplate('#nejaky_blok');
} else {
Nette\Latte\DefaultMacros::includeTemplate('#dalsi_blok');
}
- dEath
- Člen | 39
Patrik Votoček napsal(a):
to už můžeš psát rovnou
<?php if ($prom_z_presenteru) { Nette\Latte\DefaultMacros::includeTemplate('#nejaky_blok'); } else { Nette\Latte\DefaultMacros::includeTemplate('#dalsi_blok'); }
To ano, ale právě tomu bych se chtěl vyhnout, pokud to teda nebude nezbytné
Editoval dEath (27. 5. 2011 5:37)
- Filip Procházka
- Moderator | 4668
Mně se to nelíbí, ohýbáš zavedený jazyka a nikdo to do teď takhle nepotřeboval (což samozřejmě neni argument, jenom lenost měnit návyky, ale stejně…). Nevidím v tom přínos. Možná kdyby to tam bylo tak tak pár šablon napíšu a třeba bych změnil názor… Každopdáně si myslím, že David má teď důležitější věci na práci :)
- dEath
- Člen | 39
určitě to nebyl nějaký podnět, který by se musel nějak urgentně řešit, zajímalo mě, jestli není způsob, jak to takhle používat bez nutnosti psát PHPko do šablon.
ono se bez toho dá obejít, to určitě. znám kodéry, kteří používají raději na každý řádek uzavřená do závorek, ale zase znám kodéry, kteří si to raději udělají celé do bloku, atp. je to tak 50 na 50 řekl bych.
díky za diskuzi a některé návrhy řešení
- Petr Motejlek
- Člen | 293
Čus. Já jsem už párkrát narazil na nutkání napsat {plink} na víc řádků, když mi pak ten řádek lezl kvůli parametrům mimo obrazovku. Místo
<?php
{plink NejakyStrasneDlouhyModul:NejakyStrasneDlouhyPresenter:NejakaStrasneDlouhaAkce, $nejakyStrasneDlouhyParametr, $dalsiStrasneDlouhyParametr}
?>
jsem chtěl napsat
<?php
{plink NejakyStrasneDLouhyModul:NejakyStrasneDlouhyPresenter:NejakaStrasneDlouhaAkce,
$nejakyStrasneDlouhyParametr, $dalsiStrasneDlouhyParametr}
?>
U tohohle příkladu mi přijde docela dobré mít možnost napsat makro na víc řádků. Dovedu si ale představit, že parsování už pak ale musí být docela oříšek. Nevím totiž, jak dobře se v PHP dají regulární výrazy řešit přes víc řádků. Vždycky, když jsem něco takovýho potřeboval v sedu, tak to bylo docela peklo ;)
- norbe
- Backer | 405
Jo u odkazů už bych to taky párkrát využil a už jsem na to minimálně jednou viděl feature request… Co se týče úpravy regulárních výrazů, mělo by stačit jen přidat modifikátor m.
- Petr Motejlek
- Člen | 293
Něco mi říká, že to nebude tak jednoduché ;). Ale schválně to u sebe zkusím.
- Petr Motejlek
- Člen | 293
Ještě jeden příklad, kdy se víceřádková makra hodí:
<?php
{if (count($nejakyStrasneDlouhyParametr) == 1) && (count($dalsiStrasneDlouhyParametr == 1) && (count($dalsiNejakyStrasneDlouhyParametr) == 1)}
Máme všechny parametry!
{/if}
{if (count($nejakyStrasneDlouhyParametr) == 1) &&
(count($dalsiStrasneDlouhyParametr == 1) &&
(count($dalsiNejakyStrasneDlouhyParametr) == 1)}
Máme všechny parametry!
{/if}
?>
- Ondřej Mirtes
- Člen | 1536
Pro dEath: To je programování. To do šablon nepatří. Ukaž konkrétní příklad, kde bys něco takového potřeboval a třeba ti poradíme, jak to zapsat elegantněji nebo jak tu logiku přesunout do presenteru.
- David Grudl
- Nette Core | 8228
Z příspěvků mám dojem, jako by snad víceřádková makra nebo vícenásobné var nefungovalo…