Nové snippety, staré snippety a zavináče
- David Grudl
- Nette Core | 8218
Je nejvyšší čas dotáhnout do finále podporu „nových“ snippetů,
které vycházejí z bloků a nevyžadují zavináče. Dosud se tyto snippety
odlišovaly dvojtečkou v syntaxi {snippet:nazev}
. Koexistence
starých a nových snippetů dělá zmatky, je tedy potřeba nejprve staré
snippety odstranit a poté doladit nové k ideální funkčnosti.
Navrhuji tedy postup:
- pošlu commit, ve kterém bude odstraněna podpora starých snippetů, nové
se budou zapisovat bez dvojtečky a ze zavináče se stane běžný znak (bude
třeba nahradit v šablonách výskyt
@{
za{
). - nové snippety by měly být zcela funkční na úrovni presenterů, nicméně bude to potřeba otestovat
- následně bude potřeba najít vhodnou implementaci pro použití uvnitř komponent
- Patrik Votoček
- Člen | 2221
Zrovna jsem se chystal udělat issue za odstranění (obou) starých
snippetů. A nahození novými vzhledem ke znefunkčnění
{snippet:nazev}
.
Btw onen postup bych uvedl rovnou do praxe (od toho je master DEV) a počkal rovnou na připomínky (kdo nebude chtít neaktualizuje). Případně udělal novou větev (v tom GITu je to tak snadné).
- Honza Marek
- Člen | 1664
Já bych to hodil do větve a až bude nalezena (byť nevhodná) implementace pro komponenty, tak bych to dal do master větve.
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
- následně bude potřeba najít vhodnou implementaci pro použití uvnitř komponent
To by mělo mít velmi vysokou prioritu. Asi nejsem sám, komu toto brání updatovat na novější verzi Nette, abych moh zkoušet další věci (n:class, nové formuláře mají přijít tento víkend). Jinak můžu jedině přejít na bezajaxový provoz.
- Vyki
- Člen | 388
Honza Marek napsal(a):
To by mělo mít velmi vysokou prioritu. Asi nejsem sám, komu toto brání updatovat na novější verzi Nette, abych moh zkoušet další věci (n:class, nové formuláře mají přijít tento víkend). Jinak můžu jedině přejít na bezajaxový provoz.
+1. Také jsem zamrznul na poslední vývojové verzi před zrušením zavináčů. Dokud se to nevyřeší také nemůžu přejít na nejnovější verzi.
- Dr.Diesel
- Člen | 53
Tak jsem se na popud flame v jiném vláknu, že pořád jen naříkáme, zkusil pustit do dynamických snippetů a snippetů uvnitř řídících struktur. Zastavila se na tom totiž imho větší část lidí, která nette upgradovala a testovala.
Docílil jsem toho, že sice funguje vyrenderování
{snippet neco$id}test{/snippet}
, což by předpokládalo několik
výskytů {snippet neco}
s různým html id, ale samotná
funkcionalita snippetů nechodí. Viz sample:
Vycházím ze sandboxu, kam jsem přidal jedno <li>
templates/Homepage/default.latte
<li><h3><a class="ajax" href="{link test!}">Test snippets</a></h3>
<ul>{foreach array(1,2) as $i}{?$template->anyVariable .= $i}
{snippet test li $i}{$template->anyVariable}{/snippet}
<li>{$template->anyVariable}</li>
{/foreach}</ul>
</li>
presenters/HomepagePresenter.php
public function handleTest(){
$this->template->anyVariable = "ajax variable";
$this->presenter->invalidateControl("test");
}
a patche v LatteMacros, nejsou imho podstatné, protože problém vyřešen není:
Problém totiž nastává s tím, že implementace v rámci ajaxu (imho
účel snippetů?) je následně úplně mimo původní kontext, kde je
původní snippet umístěný ({block content}
). Volá se pouze
konkrétní blok s daným name
. Dokud se ale nevykoná samotný
{block content}
, nemám při ajaxu ponětí o nějakém
{foreach}
nebo přiřazení do $template
(jen
demonstrativní účel, do globálního scope templaty totiž nový snippet
nevidí, ale i to by se dalo nejspíš vyřešit). Čím dál víc to pak
směřuje k tomu, že potřebuju vykonat block content
a uvnitř
něj řídící struktury. Na čemž jsem se zastavil, protože prakticky
znovuvynalézám kolo – zavináče.
Můj osobní názor je, že nové {snipppet}
y jako náhrada
původních jsou prostě fail, který nevyšel (stane se, o co jde?). Problém
defakto neřeší, ale odstraňují původní funcionalitu. V jádru jsou
totiž vyřešeny pouze tyto zavináče, které samy o sobě problematické na
pochopení nebyly.
{block content}
,{/block}
{layout}
,{extends}
Více toho imho nové snippety neumí. Před ostatními tagy se sice používat „nemusí“, ale je to proto, že je ta funkcionalita zrušená, nikoli odstraněna povinnost je escapovat zavináči.
{include}
,{if}
,{foreach}
,{for}
S sebou to dále přineslo odstranění další funkcionality:
dynamické pojmenování
Řešení z mého pohledu:
- Vrátit původní vychytanou (!) implementaci se zavináči a nové ponechat
buď s dvojtečkou nebo pod názvem
{bsnippet}
(či jinak)
Editoval Dr.Diesel (11. 2. 2011 13:56)
- jasir
- Člen | 746
Nemohl by jsi demonstrovat, například modifikací této perfektní ukázky o jakých problémech (kromě dynamických snippetů) mluvíš? Díky
Editoval jasir (11. 2. 2011 14:08)
- Dr.Diesel
- Člen | 53
2 jasir: Ahoj. Dík za nasměrování, sample je výbornej.
{if},{ifSet},{ifCurrent}
se nevyhodnocuje. Nereálný příklad pouze pro demonstraci, komponenta by neměla být vůbec na XHR vykreslena, přesto se refreshne:
<div style="float: left; width: 30%;">
{if !$presenter->isAjax()}
{control b}
{/if}
</div>
{foreach}+{if}
: Nelze dyn. pojmenovat + Není přístup k lokálním datům, např. iterace po recordsetu. Pokud změníšas $template->i
naas $i
, spadne to i mimo ajax na Notice.
<h3>Snippet Y:</h3>
{foreach range(1,5) as $template->i}
{if $iterator->odd}{snippet dynamic}{$i}{/snippet}{/if}
{/foreach}
- nechodí {include} se snippetem, psal „crempa“ výše linky
<h3>Snippet Y:</h3>
{include inc.latte}
inc.latte:
<div n:snippet="dynamic" class="snippet">
{=microtime(true)}
</div>