Tutorial Stat.web v Nette, rozšíření?

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

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
+
0
-

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}
symmetry
Člen | 71
+
0
-

Pokud ale zapíši:
{widget form}
V templates/contact/default.phtml

Dostanu Exception:
Component with name ‚form‘ does not exist.

Přičemž metodu na vytvoření formu defunuji v:
presenters/ContactPresenter.php

Editoval symmetry (27. 1. 2010 23:57)

LuKo
Člen | 116
+
0
-

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 Brejla
Člen | 746
+
0
-

Ano, Ondrovi chybí na konci metody return $form;.

symmetry
Člen | 71
+
0
-

Díky, již se zobrazuje, a toto je tedy stadardní způsob volání? Jelikož třeba na takový formulář, mě vůbec nenapadlo použít továrničku na objekty.

Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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..

symmetry
Člen | 71
+
0
-

Aha, do templatu se musí umístit konstrukce pro procházení flashzpráv:

{foreach $flashes as $flash} <div class="flash">{$flash->message}</div> {/foreach}