jednoduchý emailový formulář

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Berry
Začátečník | 70
+
0
-

zdar, chci se informovat ohledne formularu. Co tak nejak koukam na foru tak pro nette by melo byt appform pokud chapu dobre. Jak zaclenit treba jednoduchy emailovy formular. Treba mam presenter ContactPresenter a default šablonu pro Contact. Co kam mam umistit? Zatim pronikam do taju nette tak se informuju.

natlaid
Člen | 18
+
0
-

To máš docela jednoduché.

Do ContactPresenter.php přidáš toto:

// Tímto vytvoříme funkci na vytvoření komponenty
public function createComponentContactForm($name)
{
	// Pro PHP 5.2
	// $form = new AppForm($this, $name);

	//Pro PHP 5.3
	$form = new \Nette\Application\AppForm($this, $name);

	// Přidáme Textbox
	$form->addText('name', 'Vaše jméno:');

	// A TextAreu
	$form->addTextArea('content', 'Co nám chcete říci:');

	// Tlačítko
	$form->addSubmit('send', 'Odešli!');

	// A Callback na odeslání formuláře
	$form->onSubmit[] = array($this, 'contactFormSubmitted');

	// Nakonec formulář vrátíme, aby se mohl vykreslit
	return $form;
}

public function contactFormSubmitted($form)
{
	// Tady dej kód na zpracování
}

Tak a do šablony dej:

{block #content}
{control contactForm}

Tím {control contactForm}, zavoláš tuto metodu: createComponentContactForm().

Doufám, že se to dá pochopit a že jsem na nic nezapomněl.

redhead
Člen | 1313
+
0
-

Jen bych radši viděl místo array($this, 'contactFormSubmitted') tak callback($this, 'contactFormSubmitted')

Berry
Začátečník | 70
+
0
-

Diky, neco takoveho uz se mi i povedlo, jen prave nevim kam zadat muj email, aby mi to prislo na mail a aby tam byl i mail odesilatele. Ja uz dal neco dohromady, ale nejak to nefungovalo tak jsem to smazal.

natlaid
Člen | 18
+
0
-

Takže, do formuláře přidáš ještě todle:

$form->addText('email', 'Váš E-mail:')
    ->addRule(Form::EMAIL, 'E-mailová adresa není platná');

A pak do zpracování (metody contactFormSubmitted):

// Vezmeš hodnoty z formuláře
$values = $form->getValues();

// Nastavíš template pro E-mail, nebo to můžeš udělat textově (Uvidíš níže)
// PHP 5.2
//$template = new Template;

//PHP 5.3
$template = new \Nette\Templates\Template();
$template->setFile('path/to/your/templates/email.phtml');

// Vytvoříš nový Mail
// PHP 5.2
//$mail = new Mail;

//PHP 5.3
$mail = new \Nette\Mail\Mail();
// Nastavíš odesílatele
$mail->setFrom($values['name'] . ' <' . $values['email] . '>');

//Nastavíš svůj E-mail
$mail->addTo('yourmail@example.com');

// A tělo emailu
// Také jde:
// $mail->setHtmlBody('<b>Some Text</b>');
$mail->setHtmlBody($template);
$mail->send();

Zase myslím, že je to správně, ale nějaké chybky tam asi budou.

mkoubik
Člen | 728
+
0
-

Na samotné odesílání mailu použij třídu Mail https://doc.nette.org/cs/mail

Berry
Začátečník | 70
+
0
-

natlaid napsal(a):

Takže, do formuláře přidáš ještě todle:

$form->addText('email', 'Váš E-mail:')
    ->addRule(Form::EMAIL, 'E-mailová adresa není platná');

A pak do zpracování (metody contactFormSubmitted):

// Vezmeš hodnoty z formuláře
$values = $form->getValues();

// Nastavíš template pro E-mail, nebo to můžeš udělat textově (Uvidíš níže)
// PHP 5.2
//$template = new Template;

//PHP 5.3
$template = new \Nette\Templates\Template();
$template->setFile('path/to/your/templates/email.phtml');

// Vytvoříš nový Mail
// PHP 5.2
//$mail = new Mail;

//PHP 5.3
$mail = new \Nette\Mail\Mail();
// Nastavíš odesílatele
$mail->setFrom($values['name'] . ' <' . $values['email] . '>');

//Nastavíš svůj E-mail
$mail->addTo('yourmail@example.com');

// A tělo emailu
// Také jde:
// $mail->setHtmlBody('<b>Some Text</b>');
$mail->setHtmlBody($template);
$mail->send();

Zase myslím, že je to správně, ale nějaké chybky tam asi budou.

Tak jsem se k tomu po delsi dobe dostal. Formular se mi zobrazil, po vyplneni jsem dal odeslat a ladenka

Fatal Error

Cannot instantiate abstract class Nette\Templates\Template

Jan Tvrdík
Nette guru | 2595
+
0
-

Místo Nette\Templates\Template použij Nette\Templates\FileTemplate.

Berry
Začátečník | 70
+
0
-

Jan Tvrdík napsal(a):

Místo Nette\Templates\Template použij Nette\Templates\FileTemplate.

Diky, jeste zkousim vselijaky kombinace tohoto

$template->setFile('path/to/your/templates/email.phtml');

Jaká ma byt ta cesta, nejak mi to nejde do hlavy. Vytvoril jsem si temlate email.latte a mam to v app/templates/Homepage/email.latte

Jan Tvrdík
Nette guru | 2595
+
0
-

Cesta se nastavuje stejně jako všude jinde, kde pracuješ se soubory.

$template->setFile(APP_DIR . '/templates/Homepage/email.latte');
Berry
Začátečník | 70
+
0
-

Jan Tvrdík napsal(a):

Cesta se nastavuje stejně jako všude jinde, kde pracuješ se soubory.

$template->setFile(APP_DIR . '/templates/Homepage/email.latte');

Jo, vsechno jsem mel dobre, jen chybelo APP_DIR. Dal teda ladenka hlasi

Parse Error

syntax error, unexpected T_VARIABLE

75: $mail = new \Nette\Mail\Mail();

Jsem lama a podle chyb se ucim no.

Jan Tvrdík
Nette guru | 2595
+
0
-

Ach jo, ty jsi druhý radvis. Jestli nezvládneš sám opravit parse error, tak přestaň programovat.

bojovyletoun
Člen | 667
+
0
-

Doporučuji k přečtení tohle

Berry
Začátečník | 70
+
0
-

Jan Tvrdík napsal(a):

Ach jo, ty jsi druhý radvis. Jestli nezvládneš sám opravit parse error, tak přestaň programovat.

Tak promin, ze te obtezuju.

Jinak uz jsem to vyresil. Email se mi odesle, ale prazdnej. Rekneme, ze v sablone chci mit to co Ondra Mirtes

<?php
<h3>Nová zpráva z kontaktního formuláře</h3>

<ul>
        <li><strong>Jméno</strong> {$name}</li>
        <li><strong>E-mail</strong> <a href="mailto:{$email}">{$email}</a></li>
</ul>

<h4>Text zprávy</h4>

{!$text}
?>
uestla
Backer | 799
+
0
-

Řekněme, že ti to s šablonou Ondry Mirtese funguje.

Berry
Začátečník | 70
+
0
-

uestla napsal(a):

Řekněme, že ti to s šablonou Ondry Mirtese funguje.

Tak ja bych spis potreboval vedet kde je chyba tady u toho formuláře

uestla
Backer | 799
+
0
-

To jsme se moc neposunuli – to, jakým způsobem ti to nefunguje, si mám vyvěštit z koule, nebo nám to i prozradíš?
Děkuji za odpověď.

Berry
Začátečník | 70
+
0
-

uestla napsal(a):

To jsme se moc neposunuli – to, jakým způsobem ti to nefunguje, si mám vyvěštit z koule, nebo nám to i prozradíš?
Děkuji za odpověď.

Dyt je to napsaný o kus vejš, odešle se prázdný mail. Kod je tady taky ve foru. Nereš to, jinym stylem to funguje. Já jen chtěl vědět proč ne tímto. Zamknem to tu a hotovo když vás to obtěžuje. ;)

Editoval Berry (20. 3. 2011 19:29)

Droid
Člen | 92
+
0
-

Berry napsal(a):

<?php
<h3>Nová zpráva z kontaktního formuláře</h3>

<ul>
        <li><strong>Jméno</strong> {$name}</li>
        <li><strong>E-mail</strong> <a href="mailto:{$email}">{$email}</a></li>
</ul>

<h4>Text zprávy</h4>

{!$text}
?>

Chodí ti prázdný maily protože ty hodnoty proměnných $name, $mail a $text do té šablony nějak musíš dostat. Nevím, jestli je to best practice, ale já to řeším takhle:

                $values = $form->getValues();
                $template = new FileTemplate(TEMP_DIR . '/templ_mail.latte');
                $template->registerFilter(new LatteFilter);
                 foreach ($values as $key => $val) {
                     $template->$key = $val;
                    }
//a dál už se klasicky vytvoří mail a jako tělo mailu se nastaví $template - je to popsáno tady někde výš

EDIT: Teď koukám, Ondra to ve svém řešení dělá ručně, ale princip je stejný.

Editoval Droid (25. 3. 2011 23:43)