použití {$promenna} v {block|texy}

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

Ahoj,
jak správně použít v {$promenna} v {block|texy}?

Zkouším:

{block|texy}
{$title}
========
text bla bla bla
{/block}

{$title} to vypíše, ale formát podtržení na H1 to nepřevede. Místo toho vrací {$title}======== . Přitom text dál zformátuje správně.

Inicializuju v beforeRender v BasePresenter, ze kterého pak dědím do všech presenterů

$texy = new Texy;
$texy->encoding = 'utf-8';
$texy->allowedTags = Texy::NONE;
$texy->allowedStyles = Texy::NONE;
$texy->setOutputMode(Texy::XHTML1_STRICT);

$this->template->registerFilter('Nette\Templates\CurlyBracketsFilter::invoke');
$this->template->registerHelper('texy', array($texy, 'process'));

Editoval MartinJanda (14. 4. 2009 9:45)

Honza Marek
Člen | 1664
+
0
-

S blokem nevím, já jsem spíš používal

{!$title |texy}
MartinJanda
Člen | 60
+
0
-

No mě jde hlavně o to formátování přímo v šabloně :-)

Honza Marek
Člen | 1664
+
0
-

Aha… tak to bych se nedrbal levou uchou za pravou nohou a napsal bych tam něco takového:

<h2>{$title}</h2>
{block|texy}
text bla bla bla
{/block}
MartinJanda
Člen | 60
+
0
-

Jasně, zatím to tak řeším, ale asi mi dáš za pravdu, že to ubírá na významu použití Texy a přehlednosti.

Honza Marek
Člen | 1664
+
0
-

Mně to takhle nevadí…

_Martin_
Generous Backer | 679
+
0
-

MartinJanda napsal(a):

Jasně, zatím to tak řeším, ale asi mi dáš za pravdu, že to ubírá na významu použití Texy a přehlednosti.

Ani ne, význam Texy přeci není psát celé (X)HTML čistým textem. Ve většině případů jde o to, mít někde uložené lehce upravitelné texty (třeba zadané uživateli, kteří (X)HTML znát nemusí) a ty následně pomocí Texy formátovat. Nikoliv psát šablonu (kde se naopak obsah typu (X)HTML očekává) způsobem

{block|texy}
šablona
{/block}

To poněkud ubírá na významu použití šablon.

stpnkcrk
Generous Backer | 190
+
0
-

V kódu

<?php
{block|texy}
{$title}
========
text bla bla bla
{/block}
?>

stačí za {$title} vložit mezeru. :)

tark
Člen | 22
+
0
-

Drsné workaround řešení, ale i tak myslím, že je to bug ;)

Editoval tark (14. 4. 2009 22:47)

stpnkcrk
Generous Backer | 190
+
0
-

No, jak se to vezme. Myslím, že je to „správné“ chování. Protože:

{$title} se do PHP přeloží jako (zjednodušeně) <?php echo $title; ?>

A když v normálním kódu použiješ <?php … ?>, také se neudělá nový řádek za tím. Chápeš?

tark
Člen | 22
+
0
-

Nemyslím si. Za tím {$title} je totiž ENTER ;) A ten už by se jako nový řádek přeložit měl.

stpnkcrk
Generous Backer | 190
+
0
-

Ale když v normální scriptu uděláš za ?> ENTER, chová se to úplně stejně.

kravčo
Člen | 721
+
0
-

To, ako to funguje je riadne pochopiteľné, php parser „zožerie“ aj nový riadok bezprostredne za ukončovacím tagom ?>, otázkou je, či sa to dá považovať za správnu funkcionalitu. Ja si myslím, že nie.

Už pred časom som skúmal ako vyzerá výstup po expandovaní CurlyBracketsFiltra – totiž ja osobne mám rád pekne odsadené HTML, nové riadky, kde ich treba a podobne – a tam sa tento problém tiež prejaví: z vygenerovanej šablóny pri vykonaní miznú nové riadky práve týmto spôsobom.

Myslím, že pridanie medzery nie je riešenie – pridáva do výstupu medzeru, ktorá môže byť nežiadúca. Problém by vyriešilo zdvojenie nového riadku. To by však mohlo mať za následok sťažené debugovanie vygenerovaných šablón…

Čo si o tom myslíte vy?

Editoval kravco (15. 4. 2009 23:58)

David Grudl
Nette Core | 8172
+
0
-

Lidi, vy si navymýšlíte věci – pekne odsadené HTML ;)

Ok, zkusil jsem to implementovat.

kravčo
Člen | 721
+
0
-

David Grudl napsal(a):

Lidi, vy si navymýšlíte věci – pekne odsadené HTML ;)

Ok, zkusil jsem to implementovat.

Áno, vymýšľam si úchylné veci, no nemyslel som to ako feature request. Navyše odsadzovanie aké som myslel na úrovni CB implementovať nejde – musí prebiehať v runtime a je zamýšľané buď na development, alebo v kombinácii s kešovaním hotového html výstupu:

list.phtml

<ul>
	{include 'items.phtml'}
</ul>

items.phtml

<li>item1</li>
<li>item2</li>

výsledok

<ul>
	<li>item1</li>
	<li>item2</li>
</ul>

To na čo som upozorňoval (resp. navrhoval úpravu) je miznutie nového riadku z výstupu v prípade, že cb konštrukt je na konci riadku a zmenou na php blok parser tento znak nového riadku vezme so sebou… Pri podmienkach a cykloch by to mohlo byť žiadúce, ale aj nie – podľa situácie:

<ul>
	<li>item1</li>
	<li>item2</li>
{if 1}
	<li>item3</li>
{/if}
	{if 0}<li>item4</li>{/if}
</ul>

Naopak pri vypisovaní premenných určite nie – viď príklad vyššie s {block |texy}, generovanie plaintext mailov zo šablóny (kde jeden newline hore-dole zaváži) a pod.

Tento príspevok je myslený ako námet na diskusiu ;)

David Grudl
Nette Core | 8172
+
0
-

kravco napsal(a):

To na čo som upozorňoval (resp. navrhoval úpravu) je miznutie nového riadku z výstupu v prípade, že cb konštrukt je na konci riadku a zmenou na php blok parser tento znak nového riadku vezme so sebou… Pri podmienkach a cykloch by to mohlo byť žiadúce, ale aj nie – podľa situácie:

No vždyť píšu, že jsem se to pokusil implementovat…

list.phtml

<ul>
	{include 'items.phtml'}
</ul>

Tohle raději dělat manuálně, třeba pomocí {include 'items.phtml'|indent}, protože to nemusí být vždy chtěné.

kravčo
Člen | 721
+
0
-

David Grudl napsal(a):

No vždyť píšu, že jsem se to pokusil implementovat…

Zjavne som doobeda tvoju implementáciu nepochopil, skúšal som ju totiž práve na príklade s texy nadpisom

{$heading}
=======

na ktorý nie je stavaná… myslím, že odôvodnene…

David Grudl
Nette Core | 8172
+
0
-

A smazal jsi cache? aha, tohle skutečně nejde…

David Grudl
Nette Core | 8172
+
0
-

zkus teď

kravčo
Člen | 721
+
0
-

Dobré :)

Mám návrh na dva malé fixy:

  • prvý riadok „nezačína“ na "\n", teda v prvom riadku je fungovanie trochu rozbité (v predošlej revízii nebolo – nahradzovalo sa v "\n" . $s)
  • ak šablóna začína prázdnym riadkom, kód úvodných nastavení ukončený ?> bez nového riadka zabráni jeho vypísaniu

ps> Tipnite si, čo vypíšu tieto dve šablóny?

#1

{contentType text/plain}
qwerty

#2

<!-- tu má byť úplne prázdny riadok, texy mi ho v kóde nezobrazí -->
{contentType text/plain}
asdfgh
David Grudl
Nette Core | 8172
+
0
-

Můžeš prosím vyzkoušet, jestli vložení \n před $s na tomto řádku problémy vyřeší?

kravčo
Člen | 721
+
0
-

Toto je priamočiare riešenie 2. problému, to že vyrieši i prvý mi predtým ani nenapadlo – samozrejme je to tak… „Moje“ problémy to vyrieši.

Editoval kravco (17. 4. 2009 21:45)

David Grudl
Nette Core | 8172
+
0
-

Super, tak to komitnu.