Vlastní makra – problém s vytvořením
- bluray
- Člen | 178
Dobrý den, zkouším si vytvořit vlastní makro a postupuji podle návodu
zde.
Mám následující kod:
class CustomMacros extends MacroSet
{
public static function install(Compiler $compiler)
{
$set = new static($compiler);
$set->addMacro("test2", NULL, NULL, "class='pokus'");
}
}
V configu mám:
nette:
latte:
macros:
- CustomMacros::install
a v latte:
<span n:test2="parameter1">Lorem lipsum..</span>
A stále se mi vypisuje chyba Use of undefined constant attributes – assumed ‚attributes‘ a laděnka mi ukazuje že se vygenerovalo toto: <span<?php attributes ?>>Lorem lipsum..</span>
Stále nerozumím tomu jak vytvoření toho makra funguje, co vlastně
dosazovat za parametry. Dejte tomu že budu chtít udělat makro které mi
zobrazí chybový text. představoval bych si to nějak takto:
{error}Došlo k nějaké chybě{/error} a vygeneruje se <span
class=„error“>Došlo k nějaké chybě</span>
Jak by vypadal potom kod? děkuji za pomoc
- newPOPE
- Člen | 648
Ja mam napr. makro allowed takto:
$set->addMacro(
'allowed',
'if($presenter->isAllowed(%node.args)):',
'endif'
);
A tu je navod ako to funguje https://latte.nette.org/en/#…
- bluray
- Člen | 178
Dobře, ale když budu chtít vytvořit makro které se přepíše na nějaký div jak bych to udělal? dejme tomu že chci udělat to makro error, použití bude následující:
{error}Došlo k chybě{/error}
//vygeneruje se: <span class="error">Došlo k chybě</span>
Dále bych chtěl toto makro ještě rozšířit abych mohl přidávat další parametry, např. aby se chyba zobrazila vpravo:
{error class=right}Došlo k chybě{/error}
//vygeneruje se: <span class="error right">Došlo k chybě</span>
Pro ten první případ už mám řešení:
$set->addMacro("danger",
function (MacroNode $macroNode, PhpWriter $phpWriter){
return $phpWriter->write('echo "<span class=\"error\">";');
},
function(MacroNode $macroNode, PhpWriter $phpWriter){
return $phpWriter->write('echo "</span>"');
},
null);
Když ale budu chtít do makra přidat parametry, mám s tím problém:
{error right}Došlo k chybě{/error}
//se přeloží jako <span class="error 'right'">Došlo k chybě</span>
kod vypadá takto:
$set->addMacro("danger",
function (MacroNode $macroNode, PhpWriter $phpWriter){
return $phpWriter->write('echo "<span class=\"error %node.args\">";');
},
function(MacroNode $macroNode, PhpWriter $phpWriter){
return $phpWriter->write('echo "</span>"');
},
null);
Jak tedy odstranit ty apostrofy?
A ještě lepší by bylo kdyby to fungovalo takto:
{error class=right parametr=neco}Došlo k chybě{/error}
by
vygenerovalo <span class="error right" parametr="neco">Došlo k chybě</span>
Tedy v kostce aby makro {error} vytvořilo span který bude mít třídu nastavenou předem na error a aby bylo možné tomuto makru přidávat další parametry které by se zobrazovali ve span, pokud by se přidal parametr class, potom by se jeho hodnota dopsala za class error ve span.
- bluray
- Člen | 178
Tak už jsem pokročil. už umím přidávat do parametru class další třídy:
$set->addMacro(error,
function(MacroNode $macroNode, PhpWriter $phpWriter) {
return $phpWriter->write('if ($_l->tmp = array_filter(%node.array)) echo \'<span class="error \' . %escape(implode(" ", array_unique($_l->tmp))) . \'">\'');
},
function(MacroNode $macroNode, PhpWriter $phpWriter){
return $phpWriter->write('echo "</span>"');
}, null
);
}
Použití:
{error right}Chyba{/error} //<span class="error right">Chyba</span>
Ted bych ještě chtěl přidávat další parametry tedy:
{error right id=neco}Chyba{/error} //<span class="error right" id="něco">Chyba</span>
Nenapadá někoho jak na to?
- Michal Hlávka
- Člen | 190
Všechno potřebné už k tomu máš. Akorát v templatu volej
{error 'class' => right, 'id' => 'neco'}
a nebo tam vkládej
pole bez klíčů, s tím že podle pořadí budeš vědět, kam hodnotu
z pole zařadit.
Editoval emptywall (25. 9. 2015 15:23)
- newPOPE
- Člen | 648
Ono ty chces nieco ako makro {input}
ktore pracuje cca tak ako
potrebujes https://api.nette.org/…ros.php.html#…
- bluray
- Člen | 178
Děkuji za odpovědi. Koukám na to makro input ale příliš tomu kódu nerozumím. mě by stačilo vědět jak získám všechny ty parametry toho makra. není nějaký jiný způsob než přes %node.array? to totiž jak jsem pochopil můžu použít jenom v PhpWriter::write že jo? no a ta metoda přijímá string takže se s tím dost blbě pracuje, když potřebuju napsat nějaký kód. příjemnější by bylo vytvořit si ten span pomocí třídy Html a tu potom nějak vrátit než psát php kod do stringu..
Edit:
K parametrům makra se dostanu pomocí MacroNode::args, jenomže to mi je
vrátí jako string. Když budu mít například toto: {error right
id=>pokus} tak bych očekával že v args bude [right, id ⇒ pokus]
Editoval bluray (25. 9. 2015 21:59)