Možnosti Latte pro definice v šablonách

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

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

Mohlo by fungovat něco takového

{var $var = 'nejaky text', $num = 10}

:)

bojovyletoun
Člen | 667
+
0
-

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

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

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

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

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

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

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

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

Něco mi říká, že to nebude tak jednoduché ;). Ale schválně to u sebe zkusím.

Petr Motejlek
Člen | 293
+
0
-

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

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

Z příspěvků mám dojem, jako by snad víceřádková makra nebo vícenásobné var nefungovalo…

dEath
Člen | 39
+
0
-

nefungují, muselo by se to napsat se znaky PHP <? ?>, což asi pro Latte není zcela vyhovující.

Mělo by tedy něco podobného fungovat? Na to jsem se vlastně v úvodu ptal :)

David Grudl
Nette Core | 8228
+
0
-

Funguje

{var
$var = 'nejaky text',
$num = 10
}