Nové snippety, staré snippety a zavináče

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

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

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

Já bych to hodil do větve a až bude nalezena (byť nevhodná) implementace pro komponenty, tak bych to dal do master větve.

pekelnik
Člen | 462
+
0
-

Pokud je to plně funknčí na úrovni presenterů cpal bych to do masteru

arron
Člen | 464
+
0
-

Davide, coz nejdriv doresit treba ten context nez tu zacneme resit neco noveho? Chci rict, delejme to jedno po druhem:-)

Jinak Tebou navrzeny postup +1.

Vyki
Člen | 388
+
0
-

Jak to vypadá s těmi zavináči a novými, starými snippety? Mám Nette v poslední verzi ze dneška, odstranil jsem dvojtečky a nahradil je mezerami, ale když vypustím zavináče, tek se snippety vykreslují špatně.

Majkl578
Moderator | 1364
+
0
-

Vyki napsal(a):

Jak to vypadá s těmi zavináči a novými, starými snippety? Mám Nette v poslední verzi ze dneška, odstranil jsem dvojtečky a nahradil je mezerami, ale když vypustím zavináče, tek se snippety vykreslují špatně.

Aktuálně fungují pouze staré se zavináči.
A
 B

Honza Marek
Člen | 1664
+
0
-

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

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.

dakota
Člen | 148
+
0
-

Nove snippety nefunguju tiež v inkludovaných šablonách.

https://forum.nette.org/…vana-sablona

iguana007
Člen | 970
+
0
-

Honza Marek napsal(a):
Asi nejsem sám, komu toto brání updatovat na novější verzi Nette…

Souhlasím, já zůstal u poslední verze, kde snippety fungovaly, od té doby neupdatuju, protože všechny moje weby snippety používají.

Dr.Diesel
Člen | 53
+
0
-

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

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)

crempa
Člen | 198
+
0
-

Dynamicke snippety jdou urcitym zpusobem resit pomoci komponent, za vetsi bubaky povazuju issue 170 a issue 160

Dr.Diesel
Člen | 53
+
0
-

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 na as $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>