vložení části kódu z component šablony do presenter šablony

dehtak
Člen | 113
+
0
-

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

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

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

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 20×
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 | 1180
+
0
-

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

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 | 1180
+
+2
-

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.

dehtak
Člen | 113
+
0
-

Ja vim ze to slepi soubory do jednoho. To uz ale mam , vsak jsem to psal vejs.
Asi jsme se oba nepochopily.

m.brecher
Generous Backer | 732
+
0
-

@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 | 1180
+
+2
-

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.