MacroTokenizer::fetchArray()

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

Do makro tokenizera by sa zišla ešte metóda ktorá vytvorí z parametrov makra pole. Trieda MacroTokenizer má iba metódu fetchWord. Na zaklade údajov z tochto poľa by som chcel vypisať určité hodnoty. Príklad:

{listComments
	comments => $post->comments,
	begin => '<ol id="comments">',
	end => '</ol>'
}
obsah komentara...
{/listComments}

To znamená že makro listComments má nepovinné parametre, a ak nie sú zadané, tak sa vypíšu nejaké defaultné. V tomto prípade mi ide o to aby som celý ten ‚bordeľ‘ čo sa stará o stromové vykreslenie komentárov skryl do jedneho makra.

$set->addMacro('listComments', function($node, $writer) {
	$params = $node->tokenizer->fetchArray(); // toto by sa zišlo
	if(isset($params['begin'])
		$begin = $params['begin'];
	else
		$begin = "<ul id=myComments>";
    return $writer->write('echo "' . $begin . '"; foreach(' . $params['comments'] . ' as $comment) atd...');
}, 'endlistComments');

Takto by sa pri zapise šablóny zapisali len potrebné údaje. Inak musím celý tento kód napisať ako obsah makra, ktorý sa vykonáva pri každom prečitaní vygenerovanej šablóny. Inak by sa vykonal iba pri zapise šablony to tempu.

Alebo mi niečo uniká a dá sa to nejak inak?

Editoval Cifro (10. 8. 2011 23:46)

David Grudl
Nette Core | 8218
+
0
-

Tohle by omezovalo dynamičnost zpracování. Jak by se mělo chovat třeba {listComments $a => '<ol id="comments">'}

Filip Procházka
Moderator | 4668
+
0
-

Nebylo by jednodušší to udělat takto?

<ol id="comments" n:comments="$post->comments"></ol>
Cifro
Člen | 245
+
0
-

Aaa sorry chlapci, nevšimol som si, že niekto mi odpisal na moj post :-|

David Grudl napsal(a):

Tohle by omezovalo dynamičnost zpracování. Jak by se mělo chovat třeba {listComments $a => '<ol id="comments">'}

Ak naraž, nato že „povinný“ parameter comments => $post->comments sa vynechá, tak to by som práve tým $tokenizer->fetchArray() zistil, že chýba a vyhodil vynimku, nech to koder opraví. Je to podobné keby napisal {include}… bez parametrov. Ono tá metóda by bola len doplnkom ku fetchWord(), pre tých čo by to potrebovali. Pri pohľade na fetchWord() nemam ani zdania ako by som si sám ja napisal fetchArray().

HosipLan napsal(a):

Nebylo by jednodušší to udělat takto?

<ol id="comments" n:comments="$post->comments"></ol>

Vyzerá to dobre, len neviem ako by som to dosiahol aby mi vykreslilo strom. Viď moj odkazovaný príklad. Je tam napr. jeden tag </li> za {/foreach}. A práve toto chcem ja schovať do makra.

Editoval Cifro (16. 8. 2011 0:34)

Filip Procházka
Moderator | 4668
+
0
-

Tak třeba. Uděláš si na to nějakou statickou funkci, nebo helper. Pak budeš tag překládat na něco jako

CommentsRenderer::render($post->comments, '<ol id="comments">');

Nebo můžeš využít komponenty a vykreslovat pomocí nich

{control comments $post->comments, '<ol id="comments">'}

A ještě tě nakopnu s tou rekurzí: Tree

Cifro
Člen | 245
+
0
-

Nerobím s celým MVP. Iba šablóny a Latte pre WP. Ja by som len potreboval dostať parametre makra ako PHP pole. Aby som podľa neho robil nejaké rozhodnutia… A netýka sa len toho makra pre komenty, už aj pri ďalších makrach som to potreboval.