Latte zvláštne správanie šablóny a snippetov v komponente
- JakubH
- Člen | 13
Ahoj,
narazil som na dva zvláštne problémy, ktoré nemajú žiadnu logiku
z pohľadu kódu.
Aby som všetko upresnil tak mám vytvorený vlastný datagrid, v ktorom
prebieha 2× loop, raz na dáta a raz na stĺpce.
Prvý problém je ten, že v stĺpci mám tento kód:
{if $iterator->first}
{$pagination->getPrimaryKeys()|escapeJs}
{/if}
Po spustení sa zobrazia id a cyklus sa bez dôvodu ukončí, to isté ak je v nadradenom loope. Zvyšok kódu sa vykoná bez problémov. $pagination->getPrimaryKeys() vráti len array takže tu problém nie je. Mám to použité aj neskôr len nie v loope a ide to bez problémov.
Druhý problém sa týka zvláštneho vykreslenia ajax snippetu.
Mám tento kód:
<div n:snippet="list" n:if="!$dataCustomTemplate">
…
</div>
{if $dataCustomTemplate}
<div n:snippetArea="dataTemplate">
{include $dataCustomTemplate}
</div>
{/if}
Čo je veľmi zvláštne je keď si ajaxovo chcem preklesiť šablónu, ktorá má nastavený parameter $dataCustomTemplate tak sa prekreslí snippet list, keď som to dál celé do if else a ako prvý bol customTemplate tak sa pre zmenu prekresloval len customTemplate aj keď nebol nastavený.
{if $dataCustomTemplate}
<div n:snippetArea="dataTemplate">
{include $dataCustomTemplate}
</div>
{else}
<div n:snippet="list">
…
</div>
{/if}
Na ajaxy používam Naju. Cache som vyčistil a pozrel aj generovaný temp file, bez úspechu.
Vedeli by ste mi s týmto pomôcť?
- m.brecher
- Generous Backer | 864
@JakubH
Čo je veľmi zvláštne je keď si ajaxovo chcem preklesiť šablónu, ktorá má nastavený parameter $dataCustomTemplate tak sa prekreslí snippet list
U vykreslování snippetů které se vykreslí, nebo nevykreslí vůbec je potřeba si uvědomit, jak Nette Ajax funguje. Pokud chceš mít snippet prázdný a vykreslit do něj něco pomocí redrawControl(snippet: ‚mySnippet‘), tak musíš zajistit, aby se VŽDY VYKRESLIL I PRÁZDNÝ SNIPPET. Ajaxová knihovna totiž musí mít html tag prázdného snippetu předem vykreslený, aby bylo kam html snippet z payloadu vložit !!!
Proto je nevhodné jak máš v kódu:
<div n:snippet="list" n:if="!$dataCustomTemplate">
....
</div>
Místo toho doporučuji použít raději:
<div n:snippet="list">
{if !$dataCustomTemplate}
....
{/if}
</div>
Potom nehrozí, že se snippet nebude mít kam překreslit.
Takže zkus dát ify DOVNITŘ snippetů, aby snipety v html stránce byly prázdné, ale vykreslily se.
Potom je ještě potřeba synchronizovat ify ve snippetech s ifami v metodě render komponenty, aby byly v šablonách k dispozici data, která tam jsou potřeba – pozor, vždy se vykonává celá šablona, i když se nakonec do prohlížeče pošle jenom snippet a zbytek html se zahodí.
Editoval m.brecher (13. 10. 2023 17:10)
- David Grudl
- Nette Core | 8218
Případně
<div n:snippet="list" n:inner-if="!$dataCustomTemplate">
....
</div>
- JakubH
- Člen | 13
@mbrecher @DavidGrudl
Ďakujem za odpovede
Bohužiaľ to nerieši môj problém. Snippety fungujú ak odstránim tento blok kódu ako je ukázané vyššie. Plus bez n:if.
{if $dataCustomTemplate}
<div n:snippetArea="dataTemplate">
{include $dataCustomTemplate}
</div>
{/if}
Keď už idem prekresliť snipet cez Naju zo servera dostanem chybu Latte\Runtime\Template::createTemplate(): Argument #1 ($name) must be of type string, null given, called in xyz Tracy mi ukáže aj aké parametre dostanem. Ale dataCustomTemplate je null, čo by mal ten if preskočiť, čo sa tak nedeje, kontrolované niekoľko krát.
{if $dataCustomTemplate}
<div n:snippetArea="dataTemplate">
{include $dataCustomTemplate}
</div>
{/if}
V prípade, že dám celý kód customTemplate a snippet do if tak je výsledok rovnaký, if prejde tak ako by hodnota bola kladná. Kontrolované aj cez is_null a isset.
{if $dataCustomTemplate}
<div n:snippetArea="dataTemplate">
{include $dataCustomTemplate}
</div>
{else}
<div n:snippet="list">
…
</div>
{/if}
Momentálne mám Latte 3.0.10, problém je rovnaký aj v nižších verziách. Deje sa to len vtedy, ak spravím ajax request na prekreslenie snippetov.
Editoval JakubH (13. 10. 2023 21:04)