Historie: snippety a AJAX

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 ?>