MacroTokenizer::fetchArray()
- Cifro
- Člen | 245
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
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
Nebylo by jednodušší to udělat takto?
<ol id="comments" n:comments="$post->comments"></ol>
- Cifro
- Člen | 245
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
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