Snippety, AJAX, zápis –historie

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bojovyletoun
Člen | 667
+
0
-

Ahoj, může mi někdo popsat, jak se v průběhu vyvjívela podpora snippetů v nette

  • zápis
  • funkčnost
  • cílový stav vývoje
  • na webexpo 2009 – eshop s bynány, melounem a kiwi se zapisovaly bez @, ale s :, ale to je rok staré {snippet:cart} – 1h:3min videa
  • co je snippetHelper- a jeho odstranění v nové verzi
  • oldsnippetmode
Jan Tvrdík
Nette guru | 2595
+
0
-

1. Prahistorická podpora AJAXu v Nette

  • Publikace: pravděpodobně s uvedením Nette
  • Princip: Celá stránka se renderuje od output bufferu a vše kromě snippetů se zahodí. V ajaxové odpovědi posílá Nette zároveň i obslužný JS kód.
  • 1. 7. 2008 – vznik AjaxResponse a makra {partial} (budoucí snippet)
  • 3. 7. 2008 – přejmenování AjaxResponse na AjaxDriver

2. Snippety, zavináčová magie a IPartiallyRenderable aka Staré snippety

  • Publikace: 24. 7. 2008
  • Princip: Renderují se pouze snippety, ke kterým se prochází přes zavináče. V ajaxové odpovědi se posílá čistý JSON
  • 24. 7. 2008 – kompletní přepis implementace
    • vznik rozhraní IRenderable a IPartiallyRenderable + jejich implementace v Nette\Application\Control
    • AjaxDriver nyní posílá v odpovědi čistý JSON
    • makro {partial} přejmenováno na {snippet} + jeho implementace pracující s IPartiallyRenderable
  • 12. 12. 2008 – logika renderování snippetů přesunuta z Nette\Application\Control do Nette\Templates\SnippetHelper
  • 12. 12. 2008 – zjednodušení rozhraní IAjaxDriver
  • 27. 4. 2009 – přidána metoda Presenter::getPayload (alias pro AjaxDriver)
  • 15. 6. 2009 – zrušen AjaxDriver, payload si nyní drží Nette\Application\Presenter jako stdClass
  • 17. 10. 2009 – invalidace snippetu vynutí odeslání ajaxové odpovědi

3. Snippety jako bloky aka Nové snippety

  • Publikace: 17. 10. 2009 (první koncept)
  • Princip: Renderují se pouze snippety, které jsou volány přímo (bloky jsou interně implementovány jako funkce), takže neznají svůj kontext. V ajaxové odpovědi se posílá čistý JSON
  • 17. 10. 2009 – prvotní koncept nových snippetů fungujících jako bloky
    • předchozí implementace (stále výchozí) označeno jako old snippet mode
    • nové snippety se od původních liší dvojtečkou (např. {snippet:cart}), nefungují uvnitř komponent
  • 7. 10. 2009 – zrušení starých snippetů
    • zrušení zavináčů, SnippetHelperu
    • zrušeno dvojtečkové rozlišení (nové snippety se tedy zapisují jako {snippet cart})

Podrobný popis principu starých snippetů

1. Celá šablona se obalila jednou podmínkou if (!majiSeRenderovatPouzeSnippety) {}

Např. jednoduchá šablona

<p>Ahoj světe!</p>
<p>Mám rád Nette!</p>

se přeložila jako

<?php if (!majiSeRenderovatPouzeSnippety): // automatický podmínka okolo celé šablony ?>
	<p>Ahoj světe!</p>
	<p>Mám rád Nette!</p>
<?php endif; // konec automatické podmínky okolo celé šablony ?>

2. Vložení snippetu rozbilo tuto obalovací podmínku, takže tato šablona

<p>Ahoj světe!</p>
{snippet}<p>Mám rád AJAX!</p>{/snippet}
<p>Mám rád Nette!</p>

se přeložila jako

<?php if (!majiSeRenderovatPouzeSnippety): // automatická podmínka okolo celé šablony ?>
	<p>Ahoj světe!</p>
<?php endif; // {snippet} ?>

<p>Mám rád AJAX!</p>

<?php if (!majiSeRenderovatPouzeSnippety): // {/snippet} ?>
	<p>Mám rád Nette!</p>
<?php endif; // konec automatické podmínky okolo celé šablony ?>

Čímž došlo při majiSeRenderovatPouzeSnippety = TRUE k vykreslení pouze obsahu snippetu.

Zavináče pak řešili následující problém a to, že šablona:

<p>Ahoj světe!</p>
{if $mamRadAjax}
    {snippet}<p>Mám rád AJAX!</p>{/snippet}
{/if}
<p>Mám rád Nette!</p>

se přeloží jako

<?php if (!majiSeRenderovatPouzeSnippety): // automatická podmínka okolo celé šablony ?>

	<p>Ahoj světe!</p>

	<?php if ($mamRadAjax): // {if ...} ?>
	<?php endif; // {snippet} ?>

	<p>Mám rád AJAX!</p>

	<?php if (!majiSeRenderovatPouzeSnippety): // {snippet} ?>
	<?php endif; // {/if} ?>

	<p>Mám rád Nette!</p>

<?php endif; // konec automatické podmínky okolo celé šablony ?>

Po doplnění zavináčů do šablony

<p>Ahoj světe!</p>
@{if $mamRadAjax}
    {snippet}<p>Mám rád AJAX!</p>{/snippet}
@{/if}
<p>Mám rád Nette!</p>

se šablona přeložila správně jako

<?php if (!majiSeRenderovatPouzeSnippety): // automatická podmínka okolo celé šablony ?>
	<p>Ahoj světe!</p>
<?php endif; // díky @ ?>

<?php if ($mamRadAjax): // díky {if $mamRadAjax} ?>
	<?php if (!majiSeRenderovatPouzeSnippety): // díky @ ?>
	<?php endif; // díky {snippet} ?>

	<p>Mám rád AJAX!</p>

	<?php if (!majiSeRenderovatPouzeSnippety): // díky {/snippet} ?>
	<?php endif; // díky @ ?>
<?php endif; // díky {/if} ?>

<?php if (!majiSeRenderovatPouzeSnippety): // díky @ ?>
	<p>Mám rád Nette!</p>
<?php endif; // konec automatické podmínky okolo celé šablony ?>

Editoval Jan Tvrdík (16. 11. 2010 22:28)

David Grudl
Nette Core | 8228
+
0
-

Týbrďó!

Honza Kuchař
Člen | 1662
+
0
-

:) Pěkný soupis.

Filip Procházka
Moderator | 4668
+
0
-

poklona, zajímalo by mě kde a jak jsi to vyhrabal :)

Editoval HosipLan (8. 11. 2010 8:28)

Jan Tvrdík
Nette guru | 2595
+
0
-

Z repozitáře, přece :)

bojovyletoun
Člen | 667
+
0
-

Díky moc, mám v tom jasno. To by si zasloužilo zvláštní kategorii historie.
Mám verzi dev 2010–11–04 a vše tam funguje pomocí {snippet x} a snipetty se ručně invalidují. Takhle to bude finální?

Nox
Člen | 378
+
0
-

Plánování změn je tady, kdyžtak mrkni https://dev.nette.org/cs/todo

ic
Člen | 430
+
0
-

Je už v nějaké z posledních verzí nějaká podpora ajaxu, nebo takového nějakého javascriptu který by se postaral o klientskou část aplikace? Slyšel jsem že se něco takového chystá, ale nic tu o tom nemůžu najít, existuje tedy už něco nebo je to stále úkol pro jQuery?

Vyki
Člen | 388
+
0
-

Zatím si musíme stále vystačit s JS z addons. V repozitáři, nic co by řešilo tento problém nepřibylo.

ic
Člen | 430
+
0
-

Vyki napsal(a):

Zatím si musíme stále vystačit s JS z addons. V repozitáři, nic co by řešilo tento problém nepřibylo.

dobrá tedy, pustím se do toho postaru, díky za informaci

jtousek
Člen | 951
+
0
-

Jan Tvrdík: To sis docela máknul než jsi to všechno dohledal. x) Ale je to super! Konečně jsem z toho pochopil ty rozdíly mezi starými a novými snippety. :)