Ruční vypsání formu – chyba „render()“

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

Zkouším si ručně vypsat formulář. Z toho, co jsem pročetl na foru, jsem poskládal šablonu následovně:

{block #content}
{$form->render('begin')}
{$form->render('errors')}
  	<div>Přihlašovací e-mail</div>
  	<div>{$presenter['loginForm']['login']->control}</div>

	<div>Heslo</div>
  	<div>{$presenter['loginForm']['password']->control}</div>



  	<div class="submit">
  		{$presenter['loginForm']['send']->control}
  	</div>

  	<div class="clear"></div>
{$form->render('end')}
{/block}

Presenter mám takto:

protected function createComponentLoginForm($name)
{
    $form = new AppForm($this, $name);

		$renderer = $form->getRenderer();

    $form->addText('login', 'Email:')
         ->addRule(Form::EMAIL, 'Prosím zadajte registračný email.');

    $form->addPassword('password', 'Password:')
         ->addRule(Form::FILLED, 'Prosím zadajte heslo.');

    $form->addProtection('Prosím odošlite prihlasovacie údaje znova (vypršala platnosť tzv. bezpečnostného tokenu).');
    $form->addSubmit('send', 'Log in!');
		//$form->addImage('send', $this->template->baseUri. 'images/admin/adm-login.jpg', 'Prihlásiť sa');

    $form->onSubmit[] = array($this, 'loginFormSubmitted');
}

A při spuštění dostávám neustále chybovou hlášku Call to a member function render() on a non-object… neporadili byste, kde by mohla být chyba? Zkoušel jsem něco hledat v dokumentaci, ale moc jsem neuspěl..
Díky

Editoval Manny7 (10. 8. 2010 23:34)

redhead
Člen | 1313
+
0
-

No a plníš template proměnnou $form tím fomulářem??

$this->template->form = $this['loginForm'];

Pak můžeš teprv využít proměnnou $form tak jak chceš (navíc ji můžeš použít i pro ty controly a nedělat to přes $presenter[‚loginForm‘]

Editoval redhead (10. 8. 2010 23:54)

Manny7
Člen | 67
+
0
-

upravil jsem kód podle tvé rady:
PRESENTER

protected function createComponentLoginForm($name)
{
    $form = new AppForm($this, $name);

		$renderer = $form->getRenderer();

    $form->addText('login', 'Email:')
         ->addRule(Form::EMAIL, 'Prosím zadajte registračný email.');

    $form->addPassword('password', 'Password:')
         ->addRule(Form::FILLED, 'Prosím zadajte heslo.');

    $form->addProtection('Prosím odošlite prihlasovacie údaje znova (vypršala platnosť tzv. bezpečnostného tokenu).');
    $form->addSubmit('send', 'Log in!');

    $form->onSubmit[] = array($this, 'loginFormSubmitted');

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

		return $form;
}

a ŠABLONA

{block #content}
{$form->render('begin')}
  	<div>Přihlašovací e-mail</div>
  	<div>{$form['login']->control}</div>

	<div>Heslo</div>
  	<div>{$form['password']->control}</div>



  	<div class="submit">
  		{$form['send']->control}
  	</div>

  	<div class="clear"></div>
{$form->render('end')}
{/block}

Ale pořád dostávám ono Call to a member function render() on a non-object :-/

Cifro
Člen | 245
+
0
-

:D

Ten riadok čo napísal redhead nemá byť v createComponentLoginForm() ale v nejakej render<Niečo> metóde .

Patrik Votoček
Člen | 2221
+
0
-

redhead napsal(a):

No a plníš template proměnnou $form tím fomulářem??

$this->template->form = $this['loginForm'];

Ale no fuj!

{block #content}
{control loginForm, 'begin'}
{control loginForm, 'errors'}
	{var form => $control['loginForm']}
  	<div>Přihlašovací e-mail</div>
  	<div>{$form['login']->control}</div>

	<div>Heslo</div>
  	<div>{$form['password']->control}</div>



  	<div class="submit">
  		{$form['send']->control}
  	</div>

  	<div class="clear"></div>
{control loginForm, 'end'}
{/block}
redhead
Člen | 1313
+
0
-

V čem je rozdíl? Stejně ho nakonec přiřazuješ do proměnné…

Patrik Votoček
Člen | 2221
+
0
-

v tom že to není tfuj tfuj… a že to používám až tam kde potřebuju… (neprasím)

Manny7
Člen | 67
+
0
-

Cifro napsal(a):

:D

Ten riadok čo napísal redhead nemá byť v createComponentLoginForm() ale v nejakej render<Niečo> metóde .

Já už jsem se do toho zamotal… zkouším to i přes render, ale pořád dostávám tu chybovou hlášku..

protected function createComponentLoginForm($name)
    {
        $form = new AppForm($this, $name);

		$renderer = $form->getRenderer();

        $form->addText('login', 'Email:')
             ->addRule(Form::EMAIL, 'Prosím zadajte registračný email.');

        $form->addPassword('password', 'Password:')
             ->addRule(Form::FILLED, 'Prosím zadajte heslo.');

        $form->addProtection('Prosím odošlite prihlasovacie údaje znova (vypršala platnosť tzv. bezpečnostného tokenu).');
        $form->addSubmit('send', 'Log in!');

        $form->onSubmit[] = array($this, 'loginFormSubmitted');

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

		//return $form;    I kdyz odkomentuji, vysledek je stejny
    }


	public function renderLoginForm () {
          $form = $this->getComponent('loginForm');
          $this->template->form = $form;
	}

EDIT: jak se dá ten kód vložit v barevné verzi?

Editoval Manny7 (11. 8. 2010 10:18)

redhead
Člen | 1313
+
0
-

ne renderLoginForm() ale render<ta-akce-ktera-se-vykonava>() (na kterou tvoříš link Presenter:<ta-akce> (pokud máš defaultní akci tak renderDefault())

Manny7
Člen | 67
+
0
-

zkusil jsem takto:

	public function renderDefault() {
	$form = $this->getComponent('loginForm');
	$this->template->form = $form;
	}

i takto:

	public function renderLoginFormSubmitted() {
	$form = $this->getComponent('loginForm');
		$this->template->form = $form;
	}

v presenteru vytvářím pouzeformulář a zpracovávám jej – 2 metody jen. To, co jsem se zde teďka pastnul – nefunguje mi ani v jednom případě – zkusil jsem ty rendery umístit hned za vytvoření formuláře, za zmíněné 2 metody, i řped ně, ale bohužel se mi to pořád nedaří

redhead
Člen | 1313
+
0
-

Čichám tu základní nepochopení nette principů. Na pořadí metod nezáleží, záleží tu na jejich jménech. Záleží tu na tom, co voláš za akci na presenteru (jaké máš routování a jak se na tuto akci dostaneš).

Pochop, že metodami render* v presenteru nerenderuješ komponenty, ale akci presenteru. Podle ní se taky vybere šablona (jak se jmenuje tvá šablona, tak by se měla jmenovat i akce – Presenter.default.phtml nebo Presenter/default.phtml, tak je akce default). Podle mě by sis měl projít nějaký quickstart nebo jiné tutoriály..

Patrik Votoček
Člen | 2221
+
0
-

Použij to co jsem tu pastoval ja… a zahod $this->template->form = $form; a mas po problemech…

Manny7
Člen | 67
+
0
-

vrtak-cz – to jsem zkoušel, ale dostal jsem tenhle error o neznámém makru: Filter Nette\Templates\LatteFilter::__invoke: Unknown macro {var form ⇒ $control[‚loginForm‘]} on line 8. (in file …/AdminModule/templates/Auth.login.phtml)

redhead ano, jsem začátečník a ty pojmy mi nejsou ještě úplně zřejmé, nicméně se s tím snažím něco dělat. Soubor, který ten formulář má vykreslovat, se jmenuje Auth.login.phtml, ale i po definování renderDefault (což by mělo sedět) se mi nedaří té prokleté hlášky zbavit

EDIT: vrtak-cz – toho erroru jsem se zbavil
jen teď řeším druhý problém – namísto formulářových prvků se mi vypsalo text, tak jako tady níže:

{ var form => $control['loginForm'] }
Přihlašovací e-mail
{ $form['login']->control }
Heslo
{ $form['password']->control }
{ $form['send']->control }
{ control loginForm, 'end' }

Editoval Manny7 (11. 8. 2010 11:14)

redhead
Člen | 1313
+
0
-

To samozřejmě sedět nebude – jak jsem říkal o těch jménech – pokud máš Auth.login.phtml tak akce je login tudíž renderLogin(). Udělej to podle vrtaka – asi máš starší verzi tak místo var dej assign.

Editoval redhead (11. 8. 2010 11:16)

uestla
Backer | 796
+
0
-

@Manny7: vadí tomu ty mezery u složených závorek

A nezapomínej vracet vytvořenou komponentu v továrničkách (tj. return $form; musí být vždy). upravil Vrtak-CZ (důvod: Lež!)

// EDIT by uestla: omlouvám se za demagogii!

OT: jinak díky vrtákovi za ukázaný příklad! Ruční vykreslování už nikdy jinak!

Editoval uestla (11. 8. 2010 13:19)

redhead
Člen | 1313
+
0
-

uestla napsal(a):

A nezapomínej vracet vytvořenou komponentu v továrničkách (tj. return $form; musí být vždy).

Nemusí, pokud je komponenta přiřazena již v konstuktoru komponenty ($this, $name). Vlastně by mělo být buď to a nebo ono (ne zároveň)

Manny7
Člen | 67
+
0
-

Tak už jsem to vyřešil…
uestla – ano, na to jsem po chvilce bádání přišel, ale už jsem nepřišel na to, co přepsat, aby se mi zobrazovaly formulářové prvky a ne jen texty typu „{ $form[‚login‘]->control }“ …nepomohlo ani var, ani assign, pořád je tam text namísto formulářových elementů

Vyřšil jsem to nakonec přes ten render.
Díky za pomoc všem, kteří sem přispívali!

Patrik Votoček
Člen | 2221
+
0
-

uestla napsal(a):

A nezapomínej vracet vytvořenou komponentu v továrničkách (tj. return $form; musí být vždy).

Lež!

Manny7 napsal(a):

uestla – ano, na to jsem po chvilce bádání přišel, ale už jsem nepřišel na to, co přepsat, aby se mi zobrazovaly formulářové prvky a ne jen texty typu „{ $form[‚login‘]->control }“ …nepomohlo ani var, ani assign, pořád je tam text namísto formulářových elementů

To bude tím že nečteš co ti tu píšeme… Vyházej ty mezery!!!

místo: { $form['login']->control } má být {$form['login']->control}

toka
Člen | 253
+
0
-

vrtak-cz napsal(a):

redhead napsal(a):

No a plníš template proměnnou $form tím fomulářem??

$this->template->form = $this['loginForm'];

Ale no fuj!

{block #content}
{control loginForm, 'begin'}
{control loginForm, 'errors'}
	{var form => $control['loginForm']}
  	<div>Přihlašovací e-mail</div>
  	<div>{$form['login']->control}</div>

	<div>Heslo</div>
  	<div>{$form['password']->control}</div>



  	<div class="submit">
  		{$form['send']->control}
  	</div>

  	<div class="clear"></div>
{control loginForm, 'end'}
{/block}

Nejlepší způsob jak ručně renderovat.

Cifro
Člen | 245
+
0
-

redhead napsal(a):

Nemusí, pokud je komponenta přiřazena již v konstuktoru komponenty ($this, $name). Vlastně by mělo být buď to a nebo ono (ne zároveň)

Ech toto je kua dôležitý detail, do dokumentácie s ním! Majkl či kto spisoval formuláre alebo tovarničky.

jasir
Člen | 746
+
0
-

redhead napsal(a):

uestla napsal(a):

A nezapomínej vracet vytvořenou komponentu v továrničkách (tj. return $form; musí být vždy).

Nemusí, pokud je komponenta přiřazena již v konstuktoru komponenty ($this, $name). Vlastně by mělo být buď to a nebo ono (ne zároveň)

Myslím, že se v pohodě může komponenta připojit i vrátit současně, viz
https://github.com/…ontainer.php#L148

redhead
Člen | 1313
+
0
-

Ale neplatí, že tam MUSÍ být return. Navíc je to jedno, protože ten return tam bude k ničemu (pokud už byla komponenta přiřazena), podle kódu na který si odkazoval.

Editoval redhead (11. 8. 2010 14:05)