Ruční vypsání formu – chyba „render()“
- Manny7
- Člen | 67
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)
- Manny7
- Člen | 67
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 :-/
- Patrik Votoček
- Člen | 2221
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}
- Patrik Votoček
- Člen | 2221
v tom že to není tfuj tfuj… a že to používám až tam kde potřebuju… (neprasím)
- Manny7
- Člen | 67
Cifro napsal(a):
:D
Ten riadok čo napísal redhead nemá byť v
createComponentLoginForm()
ale v nejakejrender<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)
- Manny7
- Člen | 67
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
Č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
Použij to co jsem tu pastoval ja… a zahod
$this->template->form = $form;
a mas po problemech…
- Manny7
- Člen | 67
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)
- uestla
- Backer | 796
@Manny7: vadí tomu ty mezery u složených závorek
A nezapomínej vracet vytvořenou komponentu v továrničkách (tj.
upravil
Vrtak-CZ (důvod: Lež!)return $form;
musí být vždy).
// 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)
- Manny7
- Člen | 67
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
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
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.
- jasir
- Člen | 746
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