Chyba při vlastním renderingu formuláře

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

Dobrý den,

prosím Vás, vytvářím formulář, ten se při volání {widget loginForm} normálně vykreslí, ale pokud použiju vlastní rendering, dostávám chybu InvalidArgumentException – Component with name ‚loginForm‘ does not exist.

form:

<?php
public function createComponentLoginForm()
    {
        $form = new AppForm();

        $this->template->form = $form;

        $renderer = $form->getRenderer();
        $renderer->wrappers['form']['container'] = NULL;
        $renderer->wrappers['form']['errors'] = FALSE;
        $renderer->wrappers['controls']['container'] = NULL;
        $renderer->wrappers['pair']['container'] = NULL;
        $renderer->wrappers['control']['container'] = NULL;
        $renderer->wrappers['label']['container'] = NULL;

        $form->addText('login')->setValue('Login')->addRule(Form::FILLED, 'Login musí být vyplněn!');
        $form->addPassword('password')->addRule(Form::FILLED, 'Heslo je povinné!');
        $form->addSubmit('enter');

        $form->onSubmit[] = callback($this, 'onLoginForm');

        return $form;
    }
?>

a template:

<ul class="vmenu">
        {if ($lang=='cs')}
        <li class="kategorie"><span class="txt">Uživatel</span></li>
        {else}
        <li class="kategorie"><span class="txt">User</span></li>
        {/if}

        {* widget loginForm *}

        {? $presenter['loginForm']->render('begin') }

            {if !empty($presenter['loginForm']->errors)}
                <div class="errors">
                {foreach $presenter['loginForm']->errors as $error}
                {$error} <br />
                {/foreach}
                </div>
            {/if}

            <li class="major">
                {$presenter['loginForm']['login']->control}
            </li>
            <li class="major">
                {$presenter['loginForm']['password']->control}
            </li>
            <li class="major">
                {$presenter['loginForm']['enter']->control}
            </li>

        {? $presenter['loginForm']->render('end') }
</ul>

problém je na řádku {? $presenter['loginForm']->render('begin') }. Nevíte v čem by mohl být problém..?

toka
Člen | 253
+
0
-

A jak se ten problém jmenuje v „Laděnce“? To usnadní spoustu práce při pomoci :-D

westrem
Člen | 398
+
0
-

No problem je ocividne v tom, ze Formular nie je zaradeny medzi komponenty presenteru.

Na 90% tvrdim, ze „pruser“ bude na tomto riadku kde z nejakeho dovodu neprejde podmienka a neprida sa komponenta. Rozdiel je totiz v tom, ze ak volas widget component tak sa vola getComponent($name) ale ak to mas ako pristup cez pole vola sa ako getComponent($name, TRUE) kde to true naznacuje, ze je $need teda potrebna – preto hodi exception s tym textom co si napisal.

Bohuzial ani po polhodine brblania sa v API nie som schopny prist na to kde konkretne to zlyhava, skus postnut vygenerovany kod sablony, mozno je problem v tom, ze sa formular naatachuje k niecomu nespravnemu (ad: quick tip, skus vymazat, podla mna nepotrebny, riadok $this->template->form = $form;)

Mesiah
Člen | 240
+
0
-

tak jo, vyřešeno.

Místo $presenter['loginForm']->render('begin') jsem použil $control['loginForm']->render('begin'), až zpětně jsem si uvědomil, že nepracuji nad presenterem, ale nad controlem…

Mockrát díky westreme za odkrytí tajů a zákoutí Nette.

westrem
Člen | 398
+
0
-

:D aha, tak to ma naozaj nemohlo z toho co si napisal napadnut, ze sa nejedna o kontext presenteru ale o nieco ine ..

zarubik
Člen | 31
+
0
-

Jenom jsem to prolítnul, ale nechybí ti za:

$renderer->wrappers['label']['container'] = NULL;

Nastavení změny zpět do rendru?

$form->setRenderer($renderer);

Edit: aha :).. koukám, že jsi to vyřešil.. to vykresluješ ručně, tak to tam celej render v tovarnicce mít ani nemusíš.

Editoval zarubik (14. 9. 2010 17:13)

westrem
Člen | 398
+
0
-

zarubik napsal(a):

Jenom jsem to prolítnul, ale nechybí ti za:

$renderer->wrappers['label']['container'] = NULL;

Nastavení změny zpět do rendru?

$form->setRenderer($renderer);

Edit: aha :).. koukám, že jsi to vyřešil.. to vykresluješ ručně, tak to tam celej render v tovarnicce mít ani nemusíš.

No je pravda, ze to ako to vykresluje ide urobit cisto pomocou wrapperov a ak sa nemylim tak nasledovne:

$renderer->wrappers['form']['errors'] = TRUE; // resp. zmaz to nastavenie na false
$renderer->wrappers['error'] = array(
             'container' => 'div class=errors',
             'item' => NULL,
         );
$renderer->wrappers['pair'] = array(
             'container' => 'li class=major',
             '.required' => 'required',
             '.optional' => NULL,
             '.odd' => NULL,
         );
$renderer->wrappers['form']['container'] = NULL;
$renderer->wrappers['controls']['container'] = NULL;
$renderer->wrappers['control']['container'] = NULL;
$renderer->wrappers['label']['container'] = NULL;

A to nastavenie spat do formu mu nechyba, pretoze predtym vola $form->getRenderer, ktory vracia objekt (referenciu nan), takze vykonane zmeny sa prejavia aj na nom ..

Editoval westrem (14. 9. 2010 18:07)