jednoduchý emailový formulář
- Berry
- Začátečník | 70
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
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.
- natlaid
- Člen | 18
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.
- Berry
- Začátečník | 70
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
- Berry
- Začátečník | 70
Jan Tvrdík napsal(a):
Místo
Nette\Templates\Template
použijNette\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
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
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
Ach jo, ty jsi druhý radvis. Jestli nezvládneš sám opravit parse error, tak přestaň programovat.
- Berry
- Začátečník | 70
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}
?>
- Berry
- Začátečník | 70
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
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)