vložení části kódu z component šablony do presenter šablony
- dehtak
- Člen | 113
Snažím se přijít na to jak část kódu nějak obalenou vložit do
šablony presenteru.
Teď si hraju s latte 3 extension. Úplně přesně nevím jak na to, ale mám
takovou teorii.
onrender projede controlery od těch si nechá vypsat šablonu a od ni požádá část kódu a vloží ji do šablony presenteru.
Problém ale je že pokud ty kontrolery nejsou definovany v konstruktoru tak tam zadny nejsou. Ty si vyzada az pri vykreslovani sablony.
Nebo jinak, jak by jste resily componentu napriklad googleMaps kde cast javascriptu jde do headeru a cast do footeru.
Tohle vyresit tak je vyhrano.
- dehtak
- Člen | 113
No ono to nepujde, problem je poradi vykreslovani bloku.
Dalo by se to udelat jinak. Sablona presenteru by nededila sablonu late, Ale
normalne se vykreslila pokud mozno blocky a ty dat do promenych a ty vlozit pak
do layoutu.
Takhle se nacita prvne layout pak presenter sablona a pak controlery.
Po uprave by se nacetla presenter sablona s controleramaa to by se pak
vlozilo do layoutu. Takhle mi to prijde jako nejlepsi reseni.
Samo pak nejak osetrit ajaxy a tyhle kravovinky.
Me tohle neda spat proste proc nacitat dejme tomu neteforms v home kdyz tam
zadnej formular nemam.
Komponenta Formular automaticky to tam prdne javascript neteforms.
Komponenta googlemaps automaticky to prida potrebny javascripty atd atd.
Nette je dobry ale tohle je jedina vec kterou proste nema vyresenou, uz si nad
tim lamu hlavu vic jak 3 roky.
Momentalne to mam tak ze mam vsechny scripty pro vsechno v jednom souboru. To
mi ale google pak rve ze nacitam spoustu skriptu ktery nepotrebuju.
Editoval dehtak (18. 5. 2023 14:11)
- Pavel Kravčík
- Člen | 1196
Já nevím, jestli to správně chápu, ale pokud chci vykreslit v presenteru jen část komponenty, tak používám custom render.
Tj. {control userProfile}
a pak má třeba jen část
{control userProfile:image}
.
Viz dokumentace
- dehtak
- Člen | 113
Pavel Kravčík to sem zkousel ja ty komponenty nacitam dynamicky, takze ta
urcita componenta nemusi mit treba javascript.
Abys me chapal me jde o to aby to pracovalo dynamicky. Ne takhle staticky to
tam zadavat.
No moznost by byla ale fungovalo by to jen ve footeru, protoze ten se vykresluje az nakonci. Kod pisu z hlavy tak ne koukejte na chyby jen pro priklad
foreach ($presenter->getComponents(true) as $component){
{var $compName = $component->getName()}
{if method_exist($component,'js')}
{control $compName:js} nebo {$component->js}
{/if}
}
ale asi je to kravina.
To je lepsi ze by ty kontrolery ty scripty davali naky tride tam by se
osetrilo jestli danej script uz nezadala jina komponenta aby se to tam
nepridavalo 20x
a pak ve footeru vypsat ty scripty z tridy.
//componenta.latte
{scriptAdd('mysript','<script></script>')}
// extension latte pro rychlej priklad jen funkce mohlo by se udelat makro
function scriptAdd($name, $script){
assets::addScript($name, $script);
}
// layout.latte
{foreach assets::getScript() as $script}
{$script}
{/foreach}
a do late extensions jen pridat nakou metodu co by to hazela do ty tridy assets. Ale jak rikam fungovalo by to jen ve footeru, protoze ten se rendruje az po content se vsema tema komponentama.
Editoval dehtak (18. 5. 2023 14:45)
- Pavel Kravčík
- Člen | 1196
Pro JS to funguje, tak to používáme. Ale používáme staticky.
// Latte v presenteru (default.latte)
{define #js}
{control pes:js}
{control les:js}
{control ves:js}
{/define}
// @layout.latte
{ifset #js}
{include #js}
{/ifset}
Možná Ti pomůže tohle: https://github.com/…ek/WebLoader –
v těch tvých extension si jen správně složíš files
.
- dehtak
- Člen | 113
webpack jde uplne mimo me do toho nedelam. A navic nechci na server nahravat
celou node_modules slozku to je silenost.
Chci proste klasiku, v public slozce mam uz hotovy scripty a podle potreby si
je vkladam do html.
A ne naky matlani z webpackem. Navic ja pouzivam na patlani assets scriptu
laravel mix. Webpack sem nikdy nepochopil.
Ale diky za snahu.
Editoval dehtak (19. 5. 2023 15:17)
- Pavel Kravčík
- Člen | 1196
Jen pár poznámek: Webpack
!== Webloader
,
node_modules se na server nenahrává nikdy (jen vybuildovaná část).)
Webloader dělá něco podobného, co hledáš. Zjednodušeně hledá všechny definované CSS a cesty a pak z nich vybuilduje nějaký balík, kde jsou vybrané CSS. Určitě by se tím dalo inspirovat a přiohnout to na tvůj způsob.
- m.brecher
- Generous Backer | 872
@PavelKravčík
@PavelKravčík: {define #js}
Ahoj, překvapil mě znak # před jménem bloku js ve Tvém příkladu kódu. To má nějaký význam ?
Nejprve jsem zkusil otestovat v Latte 3.0.6 jméno bloku takto:
{block '#name'}
Vyhodí to výjimku
Latte\CompileException
Block name must start with letter a-z, '#name' given
Když odstraním apostrofy, tak se výjimka nevyhazuje:
{block #name}
A blok lze vložit jménem včetně # i bez něj:
{include #name} // funguje
{include name} // funguje také
A také
{block name}
lze vložit oběma variantami – s křížkem i bez něj.
Takže Latte znak # na začátku jména bloku ignoruje, a pokud je # uvnitř apostrofů tak vyhodí výjimku. To vypadá, že znak # na začátku jména bloku je v Latte ignorován a používat by se asi neměl.
Editoval m.brecher (28. 5. 2023 15:25)
- Pavel Kravčík
- Člen | 1196
Důvod bude více prozaický. Prostě jsem tak zvyklý z nějaké roky staré dokumentace/verze. Jiný význam to pro mě nemá, spíš zvyk.