vlastní confirm makro – špatné generování

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

Zdravim, mam problém s vložením vlastního makra. Nějaký nahrazující text mi to generuje, ale bohužel před tag <a>. Mohl by prosím někdo poradit?

v presenteru

public function templatePrepareFilters($template) {
  $template->registerFilter($latte = new Engine);
  $latte = new MacroSet($latte->compiler);
  $latte->addMacro('confirm', 'echo "data-confirm=\'" , %node.word , "\'"', '');
}

v šabloně

<a n:confirm="Opravdu smazat položku?" href="{plink Delete! $page->id}" class="del ajax"></a>
Caine
Člen | 216
+
0
-

Správně by mělo být:

$latte->addMacro('confirm', null, null, ' echo "data-confirm=\'" , %node.word , "\'"');

Vzhledem k tomu jaká je tady dokumentace, nejlepší máš se zkusit dívat rovnou do zdrojáků, v tomhle případě se to dalo najít Nette/Latte/Macros/CoreMacros.php ;)

zapp
Člen | 32
+
0
-

Tohle jsem taky už zkoušel, nicméně to vyhodí exception: „invalid callback“

Caine
Člen | 216
+
0
-

Mě to fungovalo bez problémů.. Chybu budeš mít někde jinde;)

zapp
Člen | 32
+
0
-

Už to funguje, asi jsem neupdatoval nette z 22.1.

Jen ještě jeden dotaz…%node.word mi vrátí jen první slovo, existuje něco co vrátí celou větu?

Editoval zapp (1. 2. 2012 16:43)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ano, pokud se nemýlím, mělo by to být %node.args.

zapp
Člen | 32
+
0
-

S %node.args mi to právě nefungovalo, ale už jsem objevil problém. Děkuji všem

Glottis
Člen | 129
+
0
-

cao, mam taky jeden problem stimhle makrem

v sablone mam

<?php
<a n:href="delete! $pricelist->id" n:confirm="Opravdu si přejete záznam vymazat?">Delete</a>
?>

makro zaregistruju v base presenteru

<?php
	function templatePrepareFilters($t)
	{
	    $t->registerFilter($l = new Nette\Latte\Engine);
	    $l = new Nette\Latte\Macros\MacroSet($l->compiler);
	    //konfirmace akce
	    $l->addMacro('confirm', null, null, 'echo " data-confirm=\"%node.args\""');
	}
?>

ale ten sicak mi nageneruje toto (za otaznik prida :null)

<?php
<a data-confirm="Opravdu si přejete záznam vymazat?:null" href="neco/default/12?do=delete">Delete</a>
?>

kdyz do sablony otaznik nedam tak ej to v pohode ale ja ho tam chci :) nevite kde je problem?

lukyrys
Člen | 36
+
0
-

co pouzit entitu?

&#063;

Editoval lukyrys (4. 5. 2012 11:32)

Glottis
Člen | 129
+
0
-

jo s entitou to funguje, dik :) ale zajimalo by me proc se to deje a proc ostatnim zrejme ne? pripadne nea se definice makra napsat tak aby tam ten otaznik mohl byt?

lukyrys napsal(a):

co pouzit entitu?

?

Editoval Glottis (4. 5. 2012 12:02)

lukyrys
Člen | 36
+
0
-

dle myho nazoru n makra preklada php kod a ? bere jako zkracenej if a automaticky tam doplni null

llsm
Člen | 121
+
0
-

Jednoduchym resenim je pouzit v makru str_replace() a nahradit co tam vygeneruje spatne:

<?php
	$set->addMacro('confirm', null, null, ' echo "data-confirm=\'" , str_replace(\'?:null\' , \'?\', \'%node.args\') , "\'"');
?>
potty
Člen | 13
+
0
-

Po dlouhém hledání jsem to nakonec vyřešil takto, parametr confirmu se už nepřekládá jako PHP kód.

<?php
public function templatePrepareFilters($tpl)
{
	$tpl->registerFilter($latte = new Nette\Latte\Engine);
	$set = Nette\Latte\Macros\MacroSet::install($latte->compiler);
	$set->addMacro('confirm',
		NULL,
		NULL,
		function(Nette\Latte\MacroNode $node, Nette\Latte\PhpWriter $writer) {
			return 'echo \' data-confirm="'. $node->args .'"\'';
		}
	);
}
?>