Náhodilá chyba: „Unknown macro {wizard}“ (pro mé vlasní makro)

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

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)

mdjimy
Člen | 9
+
0
-

Dodatek…

Tak jsem zjistil, že se to teda neděje náhodile, ale při každé rekompilaci template s těmito makry.

Chtěl bych se proto zeptat, zdali registruji tyto makra chybně, nebo mám hledat chybu někde jinde.

Zatím čau a díky za každou pomoc…

Tomáš Votruba
Moderator | 1114
+
0
-

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

Tomáš Votruba napsal(a):

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.

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 ;)

Michal Vyšinský
Člen | 608
+
0
-

Verzi Nette zjistíš jednoduše tak, ze najdeš v debug baru na logo Nette.