přepsání bloku v layoutu z inkludované šablony

ondraLE
Člen | 23
+
0
-

Předem se omlouvám za možná stupidní dotaz, ale už to zkouším den a bez výsledku. Mám hlavní layout, který na konci natahuje jquery a další JS scripty. Poté definovaný blok {block scripts}{/block}. Pokud do renderované šablony např. „view,latte“, dle presenteru dám něco do tohoto bloku pomocí {block scripts}<sript>alert("aaa");{/block} vloží se to na správné místo do renderované stránky (tedy na konec html). Pokud v šabloně chci includovat další šablonu např. „subview.latte“ , která bude obsahovat přepsání tohoto bloku, vloží se to do content a nikoli nakonec. Tedy dotaz: jak vložit javascript z includované šablony na správné místo v layoutu?

m.brecher
Generous Backer | 870
+
0
-

@ondraLE

Je potřeba říct latte, aby vložilo z includované šablony konkrétní blok:

included.latte:

{block 'content'}
    <p>content</p>
{/block}

{block 'head'}
    <style>
        //.....
    </style>
{/block}

Šablona akce:

{block 'content'}
    {* ..... *}
    {include 'content' from 'included.latte'}
{/block}

{block 'head'}
    {include parent}
    {* ..... *}
    {include 'head' from 'included.latte'}
{/block}

Editoval m.brecher (3. 12. 2023 16:59)

ondraLE
Člen | 23
+
0
-

@mbrecher Ještě bych se chtěl vrátit k řešení, mám layout tam mám

{block #javascript}{/block}

mám nějakou šablonu a ta zobrazuje komponentu (control), v latte této šablony mám např:

{define javascript}
    <script>
        alert("!aa");
    </script>
{/define}

pokud do šablony, kde je tato komponenta zobrazena vložím dle návodu include from..

{define javascript}
    {include 'javascript' from 'controls/blockReservation.latte'}
{/define}

vše funguje, ale pokud bych chtěl obecně vložit jakýkoli block „javascript“ z šablony komponenty? Nechci vyjmenovávat všechny možné, ale dát obecně, lze to?

>

{block 'content'}
    {* ..... *}
    {include 'content' from 'included.latte'}
{/block}

{block 'head'}
    {include parent}
    {* ..... *}
    {include 'head' from 'included.latte'}
{/block}
m.brecher
Generous Backer | 870
+
0
-

@ondraLE

obecně vložit jakýkoli block „javascript“ z šablony komponenty

Potřebuješ ze šablony komponenty vkládat bloky do šablony akce ??

Šablony komponenty poděděné z UI \Control např. myControl.latte nemají v latte vestavěnou automatickou podporu pro vykreslování bloků. Značka {control} automaticky vykreslí všechny bloky {block} v šabloně myControl.latte do jednoho místa. V šabloně komponenty tak nemá cenu tagy {block} používat.

Jde ale vykreslovat bloky ze šablony komponenty pomocí workaroundu. Šablonu komponenty postavíš takto:

  • html které chceme vykreslit značkou {control} umístit mimo bloky
  • html, které chceme vykreslit do jiného bloku umístíme do bloků {define}, které značka {control} automaticky nevykresluje
  • bloky {define ‚blockName‘} vkládáme pomocí {include ‚blockName‘ from ‚myControl.latte‘} do jiných bloků v šabloně akce

Příklad:

myControl.latte

<p>main html of the control</p>

{define 'javascript'}
    {* some javascript *}
{/define}

{define 'style'}
    {* some css style *}
{/define}

a šablona akce:

{block 'content'}
    {control 'myControl'}

{/block}

{block 'javascript'}
    {include parent}
    {include 'javascript' from 'myControl.latte'}
{/block}

{block 'style'}
    {include parent}
	 {include 'style' from 'myControl.latte'}
{/block}

Editoval m.brecher (23. 10. 13:54)

ondraLE
Člen | 23
+
0
-

Potřebuješ ze šablony komponenty vkládat bloky do šablony akce ??

ano, mám kopmonentu, která má svůj form, ve formu mám picker na date (flatpicker) a potřebuji jej po načtení iniciovat (a další logiku),
pokud to dám do šablony komponenty, není ještě iniciovaný jQuery (to mám v layoutu až dole), tohle se vyrenderu dříve, a hodí to chybu.
To je celý problém. Jde mi fakticky jen o umístění nějakého kódu do posledního místa vygenerovaného HTML.

m.brecher
Generous Backer | 870
+
0
-

@ondraLE

Jde mi fakticky jen o umístění nějakého kódu do posledního místa vygenerovaného HTML.

tak použij řešení jaké jsem Ti poslal a do šablony layoutu úplně na konec dej prázdný blok

layout.latte

{block 'footer'}{/block}
</html>

V šablonách akcí, kde vkládáš komponentu vytvoř příslušný blok:

createXyz.latte

{block 'footer'}
   {include 'javascript' from 'myControl.latte'}
{/block}