Šablony v komponentách použítí makra define pro napsaní JavaScriptu
- dvorka47
- Člen | 12
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 block
u 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
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
@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
@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)
- Pavel Kravčík
- Člen | 1196
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
@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 | 1196
@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.