Šablony v komponentách použítí makra define pro napsaní JavaScriptu

dvorka47
Člen | 12
+
0
-

Ahoj,
potřeboval bych malou radu. Potřebuji vytvořit komponentu ve která bych chtěl zapsat do define JavaScript kod který se mi propíše do patičky do blocku scripts. Ale pokud v šabloně komponenty použiju:

{define scripts}
    <script>
        console.log('AHOJ');
    </script>
{/define}

Dostanu chybu: Cannot include undefined block ‚content‘. Určitě to půjde vyřešit nějak jednoduše ale bohužel se mi to nedaří. Řešil někdo podobný problém?

Ondřej Kubíček
Člen | 494
+
0
-

co vím tak to tak jednoduše nešlo, nejde si nadefinovat block v komponentě a ten propsat do hlavní šablony
myslím, že se v tomhle nic nezměnilo, nebo se pletu?

dvorka47
Člen | 12
+
0
-

@OndřejKubíček Asi to teda stále nejde. Nevíš jak by se to dalo řešit? Mě už nic nenapadá.

Ondřej Kubíček
Člen | 494
+
+1
-

jo, necpat js do šablon a už vůbec ne inline :)

dvorka47
Člen | 12
+
0
-

@OndřejKubíček Teď mě napadlo, že bych na předání dat mezi šablonou a JS mohl použít data atribut.

Ještě bych potřeboval poradit s jednou věcí všude v návodech vidím, že se v komponentě používá:

$this->template->foo = 'bar';

ale mě se předání dat do šablony podařilo vyřešit pouze přes:

$this->getPresenter()->template->foo = 'bar';

A nevím jestli je to správný způsob. Děkuji za radu.

Polki
Člen | 553
+
0
-

@dvorka47

Proč to chceš řešit přes define a ne přes block makro?

BTW, když se na to podíváme trochu z blízka, tak si můžeme nadefinovat vlastní makra a to buď pomocí define, nebo pomocí block. Stačí, když tam, kde si jej chceme definovat (v nějakém .latte) nacpeme toto:

{define MyDefine}
    To jsem já, tvůj define.
{/define}

nebo

{block MyBlock}
	Toto jsem já, tvůj block.
{/block}

V @layout.latte poté stačí zavolat tam, kde chcete danou věc vykreslit toto:

{include MyDefine}
{include MyBlock}

Výše zmíněné vypíše do tam, kde jsou includy to, co je v daných makrech, které se daným způsobem nazývají.
V mém případě tedy kdyby byl jinak tag <body> prázdný a byly by v něm pouze tyto include, tak by se vypsalo uživateli:

To jsem já, tvůj define.
Toto jsem já, tvůj block.

Osobně si ale myslím, že ty chceš něco nacpat do bloku scripts, který máš nastavený v @layout.latte. No to uděláš jednodušeji tak, že všude, kde budeš chtít dát nějaký js, tak nacpeš toto:

{block scripts}
	{include parent}
    <script>
        console.log('AHOJ');
    </script>
{/block}

Toto udělá přesně co potřebuješ.
vytvoří to makrem blok s názvem scripts, ten vloží do @layout.latte přesně tam, kde je v layout nadefinovaný block scripts a jako bonus to, co je v layout v bloku scripts se vloží tam, kde máš makro {include parent}.

Snad pomohlo.

Editoval Polki (4. 12. 2018 23:18)

CZechBoY
Člen | 3608
+
+2
-

Lepší je mít javascript úplně mimo šablony a potom si ty javascriptový soubory slepit nějakým grunt taskem nebo webpackem. Ušetříš tím spooooooooustu práce v budoucnu.

Pavel Kravčík
Člen | 1180
+
0
-

My používáme vlastní render v každé komponentě a ta se pak volá na správném místě. *Důležité je volat jen to co je potřeba ne všechny JS. Např.

{define #js}
	{control myComponent:js}
{/define}

EDIT: *Pokud je důležité volat
OT: Jak škrtat?

Editoval Pavel Kravčík (5. 12. 2018 13:03)

CZechBoY
Člen | 3608
+
0
-

@PavelKravčík Otázka je co je právě to správné místo…
Já mám třeba aplikaci, která se vykresluje až s nějakým překreslením snippetu, a ta komponenta potřebuje nějakej svůj javascrcipt. Ty ale nevíš že nějaká komponenta v hloubi aplikace potřebuje nějakej svůj javascript, navíc se ta komponenta vykreslí až s nějakou invalidací nějakýho snippetu nějaký komponenty…

Pavel Kravčík
Člen | 1180
+
+1
-

@CZechBoY: Ano, chtěl jsem podobně reagovat na tvůj příspěvek, ale pak jsem to smazal jako off-topic. :) Jen nabízím další pohled, neříkám, že je to správné řešení pro všechny případy. V některých projektech bych to taky nevyužil.