Kontrola zda-li byl v šabloně definovám blok
- Petr Motejlek
- Člen | 293
voda napsal(a):
Nestačilo by následující?
{block mujBlok}{/block}
výchozí je tedy prázdný, pokud se někde v šabloně přepíše, tak se vloží to.
Ahoj. To stačí, ale jen pro ten případ, kdy ho chceš vypsat. Problém je, že obvykle potřebuju nadefinovat ještě nějaké okolí, které kolem toho bloku bude, ale pouze tehdy, když ten blok něco obsahuje. Např.
<?php
{ifset #myBlock}
<div id="myBlock">
{include #myBlock}
</div>
{/ifset}
?>
Nebo ještě trochu jinak. Představ si, že někde mimo ten blok potřebuješ podle toho, jestli v tom bloku něco je, nebo není, třeba přiřazovat nějaký CSS class. Např.
<?php
<div id="page" class="{ifset #contextMenu}withContextMenu {/ifset}">
<div id="contextMenu" n:ifset="#contextMenu">
{include #contextMenu}
</div>
<div id="content">
<p>BLEBLE</p>
</div>
</div>
?>
- Mikulas Dite
- Člen | 756
@Petr Motejlek: To je hrozně nepřehledné. Pokuď se občas blok má něčím obalit, stačí to psát do toho bloku a je to, ne?
Editoval Mikulas Dite (3. 2. 2011 21:50)
- Petr Motejlek
- Člen | 293
Mikulas Dite napsal(a):
@Petr Motejlek: To je hrozně nepřehledné. Pokuď se občas blok má něčím obalit, stačí to psát do toho bloku a je to, ne?
Nepřehledné? Co konkrétně je na tom nepřehledné. Vždyť tam místo
ifset #contextMenu
může být
ifset $displayContextMenu
…
Když budu to okolí psát přímo do toho bloku pokaždé, když ho budu plnit, tak zbytečně porušuju DRY princip, protože pokaždé to tam musím zopakovat. Ale máš pravdu, že se to tím dá alespoň trochu obejít. Problém je, že se tím nedá vyřešit ta situace, kdy potřebuju někde mimo ten blok něco kontrolovat ;).
Ten příklad s tím kontextovým menu jsem uváděl, protože to jsem skutečně potřeboval vyřešit. Zatím to řeším přidáním nové proměnné do šablony – něco jako $displayContextMenu, která je implicitně false, ale když si nadefinuju ten blok, tak ji nastavím na true. To funguje a funguje to dobře, ale je škoda, že musím používat tu proměnnou navíc… :(
- Bernard Williams
- Člen | 207
Nazdárek,
taky bych byl pro nějakou možnost detekce nadefinování bloku.. Třeba
výše zmíněný {ifset #myBlock}
by byl super.
Bernard
- Petr Motejlek
- Člen | 293
Makro by bylo super. Kdyby se podařilo zneužít ifset
, bylo by
to bezvadné. Snad to půjde nějak rozumně parsovat…
- kucejan
- Člen | 4
Ja jsem si definoval v bootstrap.php nove makro:
Nette\Templates\LatteMacros::$defaultMacros["ifblock"] = '<?php if (isset($_l->blocks[%%])): ?>';
Nette\Templates\LatteMacros::$defaultMacros["/ifblock"] = '<?php endif ?>';
V sablonach se da potom pouzivat napr.:
{ifblock content}
<div id="content">
{include #content}
</div>
{/ifblock}
Nebo jeste peknejsi:
<div n:ifblock="content" id="content">
{include #content}
</div>
- redhead
- Člen | 1313
Ha, tak já jsem se o něco taky pokusil:
https://github.com/…5f8f9a90ad23
Jak jste řekli, znásilnil jsem macro {ifset}
a výčet lze
řetězit:
{ifset $items, #itemBlock, #blabla}
...
{/ifset}
- Jan Tvrdík
- Nette guru | 2595
Využití stávající makro {ifset}
se mi také líbí víc,
než tvorba nového. Akorát vlastní implementaci bych provedl trochu jinak
(nezkoušel jsem to, ale snad to takhle půjde).
public function macroIfset($content)
{
if (strpos($content, '#') === FALSE) return $content;
$list = array();
while (($name = $this->fetchToken($content)) !== NULL) {
if ($name[0] === '#') $name = '$_l->blocks["' . substr($name, 1) . '"]'; // nebo použít $this->formatString(...)?
$list[] = $name;
}
return implode(', ', $list);
}
Dokonce by měla fungovat i konstrukce {ifset #$blockName}
,
praktické využití mě ale nenapadá.
- redhead
- Člen | 1313
@Honza: nevím proč furt dělám ty čachry s oddělením čárkou (nebo něčím jiným) :( Updatoval jsem to.
Teď ještě jestli to nechat jako underground vychytávku nebo poslat pull req Davidovi?
Edit: Vzpomněl jsem si, že ty čachry dělám kvůli velkým polím, kdy by se to pak projíždělo zbytečně 2×.
Editoval redhead (5. 2. 2011 15:35)
- Jan Tvrdík
- Nette guru | 2595
Pokud se v tomhle vlákně během následujících 24 hodin neobjevují něco zajímavého, tak pošli pull request (ideálně i s testem).
- Patrik Votoček
- Člen | 2221
btw když už budeš dělat testy a tím pádem studovat Nette Test Framework. Nechceš k tomu pak sepsat howto? Taky mám pár věcí ale sem línej studovat… :-D
- redhead
- Člen | 1313
Poslal jsem pull request, ale bez testů, ten systém prostě nechápu: nic neříkající chyby, assert neprojde přitom soubory actual (zpracovaný soubor) a expected (jak by to mělo být správně) jsou totožné. Nechtělo se mi tím zabývat.
- David Grudl
- Nette Core | 8228
{ifset $items, #itemBlock, #blabla}
už by mělo fungovat.
Implementace není úplné 100%, tj. nepůjde třeba
{ifset $items -> val, #itemBlock}
, ale to asi zatím
nebude vadit.