Samostatné použití Latte – Nefunkční makro {form}

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

Zdravím, snažím se využít formluáře a Latte šablony samostatně. Když jsem vyzkoušel kód z dokumentace:

$latte = new Latte\Engine;
$latte->setTempDirectory(__DIR__ . '/temp');
$latte->render(__DIR__ . '/form.latte', ['subscribeForm' => $this->form]);

Šablona pak vypadá takto:

<form n:name="subscribeForm">
     <input n:name="email" type="email" placeholder="Enter your e-mail and..." class="radius" />
     <input n:name="send" type="submit" value="Download free pdf guide" class="button" />
</form>

Zařve mi to na chybě „Unknown attribute n:name…“. Takto použitá šablona zřejmě umí jen základní makra jako {$promenna}, {if}, {while} (to mi funguje), ale makro {form} nefunguje. Víte někdo co s tím? Můžu to makro {form} do šablony nějak registrovat?

Editoval Martin Mates (7. 10. 2014 21:50)

David Matějka
Moderator | 6445
+
+2
-

Ano, musis ale zaregistrovat Nette\Bridges\FormsLatte\FormMacros, zhruba takhle:

$latte->onCompile[] = function($latte) {
 Nette\Bridges\FormsLatte\FormMacros::install($latte->getCompiler());
}

Editoval matej21 (7. 10. 2014 22:05)

Martin Mates
Člen | 179
+
0
-

Díky moc! To mě posunulo o něco dál. Šablona už se zkompiluje. Teď zase pro změnu dostávám error `Argument 1 passed to Nette\Bridges\FormsLatte\FormMacros::renderFormBegin() must be an instance of Nette\Forms\Form, null given `

Teď to vypadá takhle:

$latte = new Latte\Engine;
        $latte->setTempDirectory(__DIR__ . '/temp');

        $latte->onCompile[] = function($latte) {
            FormMacros::install($latte->getCompiler());
        };

        $latte->render(__DIR__ . '/form.latte', ['subscribeForm' => $this->form]);

Formulář je správně a je typu Nette\Forms\Form, protože když v šabloně napíšu {$subscribeForm}, tak se to vykreslí. Asi to nějak špatně té šabloně předávám.

Ve zkompilované šabloně to vypadá takhle:

<?php Nette\Bridges\FormsLatte\FormMacros::renderFormBegin($form = $_form = $_control["subscribeForm"], array()) ?>

Nerozumím tomu, ale trochu mi dělá starosti to $_control tam. Čím by to mohlo být?

David Matějka
Moderator | 6445
+
0
-

Ty tam mas totiz pouze nazev – tak se to snazi hledat ten formular v komponente.
zkus pouzit:

<form n:name="$subscribeForm">

(tedy s $, takze to rovnou vezme objekt v te promenne)

Martin Mates
Člen | 179
+
0
-

Wow!! To je ono díky!