Kontrola zda-li byl v šabloně definovám blok

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

Neexistuje nějaká funkce nebo makro, které by v latte zjistilo, zda-li je definovaný block

Pokoušel jsem se o takovouto konstrukci , ovšem asi to není dobře..

{ifset #mujBlock} {include #mujBlock} {/ifset}

voda
Člen | 561
+
0
-

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.

Petr Motejlek
Člen | 293
+
0
-

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>
?>
Michalek
Člen | 211
+
0
-

Řešil jsem něco podobného, nakonec jsem to vyřešil jak radil skocourek.

https://forum.nette.org/…ako-if-block

Mikulas Dite
Člen | 756
+
0
-

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

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

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

Jan Tvrdík
Nette guru | 2595
+
0
-

Také jsem něco takového opakovaně potřeboval.

Petr Motejlek
Člen | 293
+
0
-

Makro by bylo super. Kdyby se podařilo zneužít ifset, bylo by to bezvadné. Snad to půjde nějak rozumně parsovat…

Ani
Člen | 226
+
0
-

Můžeš si ten div obalit do dalšího bloku a ten pak zavolat bez obsahu a tím to překrýt.

kucejan
Člen | 4
+
0
-

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

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

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

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

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

tak sup sup pull na github… :-)

redhead
Člen | 1313
+
0
-

Ještě udělám ty testy..

Patrik Votoček
Člen | 2221
+
0
-

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

No.

Zatím se teda pokouším prohrabat testováním šablon, které (ačkoli nezměněné) hlásí chyby. Zajímavé.

Pokud se tím nějak úspěšně prokoušu, tak něco sepíšu, ovšem nechce se mi to studovat zas tak do hloubky, jen zvalidovat změny, co jsme provedli na makru, a pryč! :)

redhead
Člen | 1313
+
0
-

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.

https://github.com/…tte/pull/187

David Grudl
Nette Core | 8228
+
0
-

{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.