Náhodilá chyba: „Unknown macro {wizard}“ (pro mé vlasní makro)
- mdjimy
- Člen | 9
Nazdar lidi…
Vytvořil jsem si vlastní komponentu, generující wizard pro snadnou editaci některých dat v DB.
Abych mohl tento wizard v šabloně vykreslit po jednotlivých kartách a případně dostylovat dle potřeby, zavedl jsem si makra {wizard} {card} …
Vše funguje bezvadně, ale Nette mi při kompilaci šablony s těmito makry zahlásí, že tato makra nezná a vyhodí vyjímku. Při následném reloadu stránky se problém neopakuje a vše se vyrenderuje jak má.
Netušíte někdo, v čem by mohl být problém?
Přikládám kód jak makra registruji.
bootstrap.php
$configurator->onCompile[] = function ($configurator, $compiler) {
$compiler->addExtension('dibi', new DibiNetteExtension);
$compiler->addExtension('inputlist', new InputListExtension);
$compiler->addExtension('wizard', new WizardExtension);
};
WizardExtension.php
class WizardExtension extends CompilerExtension {
public function loadConfiguration() {
$container = $this->getContainerBuilder();
$latte = $container->getDefinition('nette.latte');
$latte->addSetup('MartinDendis\Wizard\WizardMacros::install(?->compiler)', array('@self'));
}
}
WizardMacros.php
class WizardMacros extends MacroSet {
private $inWrap = FALSE;
public static function install(Compiler $parser) {
$me = new static($parser);
$me->addMacro('wizard', array($me, 'macroStartWizard'), array($me, 'macroEndWizard'));
$me->addMacro('card', array($me, 'macroStartCard'), array($me, 'macroEndCard'));
$me->addMacro('error', array($me, 'macroStartError'), array($me, 'macroEndError'));
$me->addMacro('failure', array($me, 'macroStartFailure'), array($me, 'macroEndFailure'));
$me->addMacro('success', array($me, 'macroStartSuccess'), array($me, 'macroEndSuccess'));
$me->addMacro('sending', array($me, 'macroStartSending'), array($me, 'macroEndSending'));
}
public function macroStartWizard(MacroNode $node, $writer) {
if ($this->inWrap) {
return FALSE;
}
$this->inWrap = TRUE;
return $writer->write('$_wizard = (is_object(%node.word) ? %node.word : $_control[%node.word]);' . "\n" . ' $_wizard_form = $_wizard->getForm();' . "\n" . ' echo $_wizard->addAttributes(%node.array)->startTag();' . "\n");
}
public function macroEndWizard(MacroNode $node, $writer) {
if (!$this->inWrap) {
return FALSE;
}
$this->inWrap = FALSE;
return $writer->write(' echo $_wizard->endTag();' . "\n" . ' unset($_wizard_form);' . "\n" . ' unset($_wizard);' . "\n");
}
...
}
Editoval mdjimy (30. 4. 2014 19:35)
- Tomáš Votruba
- Moderator | 1114
Jakou máš verzi Nette? Ve 2.2 se o šablony nestará
nette.latte
, ale nette.latteFactory
.
Zkus si dumpnout v třídě s makry, zda proběhne
install
.
Editoval Tomáš Votruba (30. 4. 2014 20:53)
- mdjimy
- Člen | 9
Tomáš Votruba napsal(a):
Jakou máš verzi Nette? Ve 2.2 se o šablony nestará
nette.latte
, alenette.latteFactory
.Zkus si dumpnout v třídě s makry, zda proběhne
install
.
Hele zkoušel jsem vše možné a nemožné, až mne nakonec napadlo promazat tmp složku s templaty a od té doby nemám problém… :D
Celkem by mne ale zajímalo, kde mohlo docházet k chybě, resp. nesetkal jsem se s tím poprvé, že mi něco nefungovalo korektně, dokud jsem nepřemazal tmp…
Jinak k tvému dotazu, mám Nette verze je 2.1.2 (nebo 2.0.14?), nevím jak to zjistit, nepodařilo se mi to dohledat, ale myslím si, že je to ta novější z nich.
PS: ještě jednou díky za help ;)