Vlastní makra – problém s vytvořením

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

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
+
+1
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ono ty chces nieco ako makro {input} ktore pracuje cca tak ako potrebujes https://api.nette.org/…ros.php.html#…

bluray
Člen | 178
+
0
-

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)

bluray
Člen | 178
+
0
-

také nerozumím tomu co znamená v 0.word v té metodě macroInput. A kde se vzali proměnné $_form a $_label

Editoval bluray (25. 9. 2015 23:07)