Jak migrovat z Twig na Latte?

souki
Bronze Partner | 22
+
+2
-

Děláme eshopy a používáme Twig šablony. Některé věci mi v nich ale chybí, takže bych to rád migroval na Latte. Narazil jsem ale na dvě věci, který neumím v Latte vyřešit.
Základním problémem je, že šablony si editují klienti (tzn. editace šablony je veřejně přístupná), takže editací šablony nesmí jít rozbít nic jiného, než šablona samotná. Není například možné, aby zápisem v šabloně šel smazat produkt a podobně.

Sandbox
Ve twigu lze definovat sandbox policy (http://twig.sensiolabs.org/doc/api.html#…), která omezí, jaké atrbibuty/metody jsou přístupné z šablon. Například lze říct, že u všech objektů v šablonách lze přistupovat pouze k metodám začínajícím na get nebo is

PHP
V šabloně lze používat jen to, co ji bylo předáno. Není tam možné například přímo vkládat PHP kód nebo nějak volat SQL dotazy. Pokud se má v šabloně procházet něco z databáze, tak se jí to musí předat jako iterator v proměnné.

Je tohle nějak řešitelné? Nebo jde Latte zkrátka opačným směrem a je určené pouze pro vývojáře a s takovým použitím nepočítá?

Pavel Macháň
Člen | 282
+
-6
-

@souki Tak pokud budeš do šablony vkládat pouze entity tak se o smazání dat atd bát nemusíš. Prostě nesmíš do šablony vložit repozitáře, fasády nebo něco co může měnit data.

Editoval Pavel Macháň (12. 7. 2014 11:38)

hrach
Člen | 1834
+
0
-

@souki toto implementovat neni v soucasnem latte vubec jednoduche, zda-li mozne.

MartinitCZ
Člen | 580
+
+3
-

V posledním odstavci jsi si odpověděl. Latte je pro programátory/kodéry.
Nikoliv pro BFU a editaci přes nějaký js editor. ;)

David Kudera
Člen | 455
+
+5
-

Pavel Macháň napsal(a):

@souki Tak pokud budeš do šablony vkládat pouze entity tak se o smazání dat atd bát nemusíš. Prostě nesmíš do šablony vložit repozitáře, fasády nebo něco co může měnit data.

No, sice se to nemá, ale pořád můžu udělat např. toto:

{var $database = $presenter->context->getByType('Nette\Database\Context')}
llook
Člen | 407
+
+4
-

Latte umožňuje vykonat PHP kód v parametrech maker, např. {assign $foo = unlink('/path/to/file')} apod.

Radím zůstat u Twigu. Má možná ošklivější syntax (věc vkusu) a nemá kontextové escapování, ale je možné ho nastavit tak, aby se k němu dali pustit cizí lidé.

souki
Bronze Partner | 22
+
0
-

Díky za rady, zůstanu u Twigu.
Bude jednodušší naučit Twig rozumět HTML tagům než přetáčet Latte na něco, k čemu není určené.

hason
Člen | 23
+
+2
-

@souki Pro Twig je spousta rozšíření. Podporu pro „t-tagy“ a analýzu html přidává rozšíření twital https://github.com/goetas/twital

<ul t:if="users">
    <li t:for="user in users">
        {{ user.name }}
    </li>
</ul>

Zápis pomocí haml syntaxe řeší MtHaml https://github.com/…ud-lb/MtHaml

- if users
  %ul
    - for user in users
      %li.user
        = user.name

Samozřejmě lze obě rozšíření kombinovat:

%ul(t:if="users")
  %li(t:for="user in users")
    = user.name

Kontextové escapování se připravuje pro twital i mthaml. V Twigu nelze řešit, protože je obecným šablonovacím systémem.

David Grudl
Nette Core | 8128
+
0
-

hrach napsal(a):

@souki toto implementovat neni v soucasnem latte vubec jednoduche, zda-li mozne.

Je to naopak (kupodivu) velmi jednoduché, implementoval jsem to, ale nakonec do Latte nedal. Připadá mi to jako zbytečnost.

Filip Procházka
Moderator | 4668
+
+26
-

@DavidGrudl No a nemyslíš že by bylo fajn, kdyby to existovalo jako rozšíření? Já bych to taky ocenil.

souki
Bronze Partner | 22
+
0
-

hason napsal(a):

@souki Pro Twig je spousta rozšíření. Podporu pro „t-tagy“ a analýzu html přidává rozšíření twital https://github.com/goetas/twital

<ul t:if="users">
    <li t:for="user in users">
        {{ user.name }}
    </li>
</ul>

Díky! Já věděl, že už to někdo musel řešit :)

hrach
Člen | 1834
+
+3
-

@DavidGrudl neverim tomu =P nekde tam byl urcite hacek.

souki
Bronze Partner | 22
+
0
-

David Grudl napsal(a):

hrach napsal(a):

@souki toto implementovat neni v soucasnem latte vubec jednoduche, zda-li mozne.

Je to naopak (kupodivu) velmi jednoduché, implementoval jsem to, ale nakonec do Latte nedal. Připadá mi to jako zbytečnost.

Typické využití je v šablonách e-mailů. Chci, aby si je uživatel mohl editovat, ale zároveň nechci, aby tím mohl obejít veškerá přístupová práva.

Honza Kuchař
Člen | 1662
+
0
-

Myslím, že jako nádstavba nad šablonovacím systémem by to bylo super, ale přímo do jádra Latte bych to netahal.

souki
Bronze Partner | 22
+
0
-

Honza Kuchař napsal(a):

Myslím, že jako nádstavba nad šablonovacím systémem by to bylo super, ale přímo do jádra Latte bych to netahal.

Určitě. Ve Twigu je „Sandbox“ vlastně taky jen extension.

Caine
Člen | 216
+
+6
-

David Grudl napsal(a):

hrach napsal(a):

@souki toto implementovat neni v soucasnem latte vubec jednoduche, zda-li mozne.

Je to naopak (kupodivu) velmi jednoduché, implementoval jsem to, ale nakonec do Latte nedal. Připadá mi to jako zbytečnost.

@DavidGrudl – Proc je to zbytecnost? Uz to resime asi u 3. vetsiho projektu, spousta klientu si chce psat vlastni sablony napr. mailu a dokumentu (ze kterejch se pak generuje pdf) + chtej tam mit placeholdery a moznost podminkovat, cykly, nekdy i filtry..

potapnik
Člen | 127
+
+12
-

+1 pro zverejneni, alespon konceptu, jak na to :)

Jan Tvrdík
Nette guru | 2595
+
0
-

@potapnik Proženeš výslednou zkompilovanou šablonu phpparserem od nikic a zkontroluješ, že neobsahuje nic, co nechceš. Good luck!

MartyIX
Člen | 217
+
+1
-

Tak přemýšlím, jak bych to dělal, a asi bych si do Latte zaregistroval vlastní striktní makra pro všechny operace, které chci povolit (napr. {if $zdePouzePromenna}, {foreach $iterable as $key ⇒ $value}, …). Ale samozřejmě záleží, jak jsou ty šablony komplikované.

Opačná cesta je cesta do pekel (jak naznačuje Jan Tvrdík).

Caine
Člen | 216
+
0
-

A jak pak zabranis napr tomuto?

{foreach Environment::getContext()->getByType('NDB/Connection')->query(...) as $key ⇒ $value}
MartyIX
Člen | 217
+
0
-

Povolis makru pouze zapis: {foreach $promenna as $promenna2 ⇒ $promenna2}, coz si vynutis pres regularni vyraz.

Editoval MartyIX (25. 2. 2015 8:38)

FreeWall
Člen | 2
+
+7
-

Potýkám se se stejným problémem. Máte někdo implementované nějaké efektivní řešení?

@DavidGrudl Mohl byste aspoň naznačit způsob vaší velmi jednoduché implementace? Hodně by to pomohlo :)

Martk
Člen | 655
+
0
-

@FreeWall Používám tohle: https://github.com/AntikCz/Latte (Zbraňuje volání tříd, funkcí, globálních funkcí, superglobálních a globálních proměnných, konstant a omezuje makra)

Instalace jako Latte\Engine.

esorimer
Člen | 114
+
0
-

@Antik Tohle doufam nikdo nepoužívá jako sandbox. Vždyť je možné napsat do šablony <?php ... libovonlý kód ... ?>

David Grudl
Nette Core | 8128
+
+2
-

Knihovna pro migraci z Twig na Latte: https://twig2latte.nette.org a https://github.com/…/latte-tools