jak nastavit šablonu formuláře?

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

Vzdávám se, po dvanácti hodinách studia formulářů se mi nepodařilo zprovoznit něco takového:

třída formuláře která dědí od AppForm (pokusForm.php)

<?php
...
public function render()
{
  $template = new FileTemplate;
  $template->setFile(__DIR__ . '/pokusForm.latte');
  $template->registerFilter($latte = new LatteFilter());
  FormMacros::register($latte->getHandler());

  $template->form = $this;

  $template->render();
}
...
?>

šablona formuláře (pokusForm.latte)

<?php
{form $form}
    <p class="error" n:foreach="$formErrors as $error">{$error}</p>
    <table>
        <tr>
            <th>{label name, text => "Username"}</th>
            <td>{input name}</td>
        </tr>
{/form}
?>

Registraci maker, včetně těch vylepšených samozřejmě mám. V presenteru si továrničkou vytvořím komponentu toho formuláře a pak ji chci vykreslit pomocí {control pokusForm}. A nestarat se o šablony, ty by si měl formulář načíst sám. Boužel takto mi to nešlape.

Zkolabuje to na:

<?php
Undefined variable: control
$formErrors = FormMacros::beginForm($form, $control, array())->getErrors();
?>

Zkoušel jsem do proměnné $form předávat až vytvořenou komponentu po připojení k presenteru (pomocí monitorování a metody attached) ale taky bez úspěchu. Přitom volání {include 'pokusForm.latte', form => $presenter['pokusForm']} mi funguje bez problémů.

Tušíte někdo jak na to, pls? Nechci se v šabloně pohledu starat o to, kde mám nějaké šablony každého formuláře na stránce, chci si ho tam prostě vložit a nestarat se (resp. starat se jen když k tomu mám nějaký zvláštní důvod).

P.S. Pokud to přepíšu bez použití vylepšených maker, tak problém přetvává, naprosto stejný..

Editoval Šaman (3. 4. 2011 6:20)

Filip Procházka
Moderator | 4668
+
0
-

Řešením je vlastní TemplateFactory, které registruješ jako službu a následně zneužiješ ve formulářích.

Aurielle
Člen | 1281
+
0
-

Nepředáváš do šablony proměnnou $control (popř. $presenter, chceš-li používat plink). Volání $control[‚form‘]->render() pak tedy skončí na tom, že proměnná je nedefinována.