Tutorial Stat.web v Nette, rozšíření?
- symmetry
- Člen | 71
Zdravím, rád bych začal Nette používat formou MVP a tak mě zaujal tutorial kde se uvádí jako příklad stat. web.
Chtěl jsem si zkusit příklad rozšířit o formulář a tak jsem si do ContactPresenteru zapsal metodu:
<?php
class ContactPresenter extends BasePresenter
{
public function GetForm()
{
$form = new Form;
$form->addGroup('Výběr data a místa');
$form->addText('title', 'Titul:');
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Vložte Vaše jméno');
$form->addText('surname', 'Příjmení:')
->addRule(Form::FILLED, 'Vložte Vaše příjmení');
$form->addSubmit('send', 'Odeslat');
//End of form
echo $form;
}
}
Pokud ji nedám přímo do konstruktoru, tak nětuším, kde přímo bych ji
mohl zavolat aby se mi vykreslila na určeném místě v templatu.
Zkoušel jsem zapsat v templatu něco ve stylu:
{block GetForm}
{/block}
Ale neúspěsně.
Věděl by někdo, jak správně postupovat?
Díky za každou radu.
- Ondřej Mirtes
- Člen | 1536
Továrnička:
protected function createComponentForm() {
$form = new AppForm;
$form->addGroup('Výběr data a místa');
$form->addText('title', 'Titul:');
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Vložte Vaše jméno');
$form->addText('surname', 'Příjmení:')
->addRule(Form::FILLED, 'Vložte Vaše příjmení');
$form->addSubmit('send', 'Odeslat');
}
A v šabloně jednoduše:
{widget form}
- LuKo
- Člen | 116
Ondro, nechybí tam return $form
? Mám v tom trochu zmatek,
letmým pohledem po fóru to někde je a někde není.
Dovolím si přihřát polívčičku na tomto tématu, jak by vypadala továrnička, kdybych v šabloně potřeboval něco takového?
{widget loginForm} <!-- přihlašovací formulář na celou stránku, např. example.com/admin/ -->
{widget loginForm:simple} <!-- malý formulářík v rohu hlavní stránky example.com -->
- Ondřej Mirtes
- Člen | 1536
Pardon :))
LuKo: Tohle už bych zpracoval jako komponentu (podědit od Control, napsat do ní továrničku s formulářem a napsat si metody render() a renderSimple()).
symmetry: ano, továrničky slouží pro formuláře (třída AppForm) a komponenty (potomci Control).
- LuKo
- Člen | 116
Ondřej Mirtes napsal(a):
LuKo: Tohle už bych zpracoval jako komponentu (podědit od Control, napsat do ní továrničku s formulářem a napsat si metody render() a renderSimple()).
Mohl bych mít tu drzost a poprosit o pár řádků kódu? Bez detailů továrničky. Matně tuším, ale nejsem si vůbec jistý. Ohledně komponent stále nějak plavu na hladině a ne a ne se do toho ponořit :-/
- symmetry
- Člen | 71
Po krátkém zkoumání jsem zjistil, že pokud do metody formu zapíši k´d pro získání hodnot a například odesílání mailu, tak po volání metody $mail->send() k odeslání mailu nedojde ani nedostanu žádné exception.
Dělá se to snad jiným způsobem, nebo je chyba u mě?
Omlouvám se pokud se ptám na nějakou samozřejmost, zatím jsem ale Nette
používal jako samostané třídy a nyní je čas to změnit:)
- Ondřej Mirtes
- Člen | 1536
symmetry: Ukaž kód. Odeslání formuláře bys měl udělat přes obslužnou metodu (která se zavolá jen v případě odeslaného a validního formuláře):
$form->onSubmit[] = array($this, 'formSubmitted'); //do továrničky, před return
A obslužná metoda:
public function formSubmitted(AppForm $form) {
$values = $form->values;
//...zpracování
$this->flashMessage('Úspěch!');
$this->redirect('this');
}
- Ondřej Mirtes
- Člen | 1536
LuKo: Asi nějak takhle:
class LoginForm extends Control {
protected function createComponentForm() {
$form = new AppForm;
//....
return $form;
}
public function formSubmitted(AppForm $form) {
//...
}
public function render() {
echo $this['form'];
}
public function renderSimple() {
$template = $this->createTemplate();
$template->setFile(dirname(__FILE__) . '/template.phtml');
$template->form = $this['form'];
$template->render();
}
}
{* template.phtml *}
{* nějaké složitější vykreslování *}
<div class="small-form">
{$form['login']->label}<br />
{$form['login']}->control}
</div>
Editoval Ondřej Mirtes (28. 1. 2010 0:53)
- symmetry
- Člen | 71
Zamýšlel jsem to tímto způsobem:
protected function createComponentForm() {
$form = new AppForm();
$form->addGroup('Výběr data a místa');
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Vlozte Vaše jméno');
$form->addSubmit('send', 'Odeslat');
if($form->isSubmitted())
{
$values = $form->getValues();
$name = $values['name'];
ini_set("sendmail_from",$mail);
ini_set("SMTP","smtp.internet.starnet.cz");
$mail = new Mail;
$mail->setFrom($mail,$name);
// nebo $mail->setFrom('jirivavru@gmail.com', 'Franta');
$mail->addTo('jirivavru@gmail.com');
$mail->setSubject('Pokus');
$mail->setHtmlBody('Jméno:'.$name.'<br/>');
if($mail->send())
{
$this->flashMessage('Úspěch!');
}
return $form;
}
}
Například ale volání $this->flashMessage(‚Úspěch!‘); z Presenteru mi také nejde zprovoznit..