Funkce/třída na odeslání emailu
- sumiisakua
- Člen | 36
Jelikož chci tuto „funkci/třídu“ použít vícekarát, tak jsem se rozhodl jí dát do samostatného souboru. Jenže díky tomu mi vznikne plno problému.
• Nedostanu se k proměnným, které mám definované
v basepresenteru
• Nefunguje na 100% latte
Mám tohle, ale určitě by to šlo líp.
<?php
use Nette\Mail\Message;
class Email
{
const ACTIVATE = "activate";
const PASSWORD = "password";
public $config;
public $to;
public $template;
public $html;
public $subject;
public $text;
public function send($reason, $to, $data = NULL)
{
$this->to = $to;
if($reason === self::ACTIVATE) {
$this->subject = $this->config->name . " - Aktivace účtu";
$this->template = "../data/Email/activate.latte";
}elseif($reason === self::PASSWORD) {
$this->subject = $this->config->name . " - Zapomenuté heslo";
$this->template = "../data/Email/password.latte";
}elseif($reason === TRUE) {
$this->subject = $this->config->name . " - " . $data["subject"];
$this->html = $data["text"];
}else{
$this->subject = $this->config->name . " - " . $data["subject"];
}
if($this->template) {
$this->template = new \Nette\Templating\FileTemplate($this->template);
$this->template->registerFilter(new \Nette\Latte\Engine);
$this->template->variables = $data;
}
$mail = new Message;
$mail->setFrom($this->config->email)
->addTo($this->to)
->setSubject($this->subject);
if($this->template || $this->html) {
$mail->setHtmlBody($this->template ?: $this->html);
}else{
$mail->setBody($data["text"]);
}
$mail->send();
}
}
Rád bych, kdyby mi někdo poradil jak vyřešit ty zmíněné problémy?
Chci to použít jen na odeslání emailu, tedy se nikde nic nevykreslí, ale jen proběhne (úplně stejně, jako action v Presenterech).
Volám ji například (chci jí volat), když po odeslání formuláře.
Jako zoufalé řešení bych mohl vzít jen tu funkci a dát ji do
basepresenteru, ale ......
Editoval sumiisakua (19. 2. 2012 18:19)
- ViPEr*CZ*
- Člen | 817
• Nedostanu se k proměnným, které mám definované
v basepresenteru
Co takhle udělat si tam nějaké settery?
• Nefunguje na 100% latte
Poslal bych si asi z presenteru právě tím setterem objekt šablony přes
$template = $this->createTemplate();
A zkusil bych si to udělat přes dědičnost. ;-)
class Email extends Nette\Mail\Message {
}
Editoval ViPEr*CZ* (19. 2. 2012 20:19)
- ViPEr*CZ*
- Člen | 817
Paradiso napsal(a):
a nebylo by to lepší udělat jako komponentu?
Nette se stále teprve učím, ale přivoněl jsem ke komponentám a je to luxusní věc :-)
Souhlas… Ale tady to podle mě vypadá na rozšíření stávající knihovny, tak nevidím logiku pro komponentu? Spíš si to přes dědičnost rozšířit a zaregistrovat maximálně jako službu.
- sumiisakua
- Člen | 36
Paradiso: Možná by to bylo lepší, ale to bych musel někde vidět pěknou komonentu, abych pochopil jak na ně.
To co je v doc sem nedokázal „převést“ na svůj problém.
Potřebuji určovat, která šablona se má použít, případně zda se má použít html nebo jen text.
Jak dostanu do templatu nějakou proměnnou, když používám toto:
$template = $this->createTemplate();
$template->setFile("aaaa");
$template->variables = $data;
Tak po dumpnutí $variables v šabloně, jako když tam nic není.
Editoval sumiisakua (19. 2. 2012 21:46)
- ViPEr*CZ*
- Člen | 817
Toto musí fungovat:
$data = "pokus";
$template = $this->createTemplate();
$template->setFile("aaaa");
$template->variables = $data;
Nette\Diagnostics\Debugger::dump($template->variables);
$this->terminate();
Tak toto by mělo vypsat, že $template->variables obsahuje řetězec pokus.
- sumiisakua
- Člen | 36
**ViPEr*CZ***: Joo už je to v pohodě. Jsem zvyklí na fluent zápis a tady to nejde :) Moje chyba.
- Paradiso
- Člen | 101
sumiisakua napsal(a):
to bych musel někde vidět pěknou komonentu, abych pochopil jak na ně.
moc se mi líbí přednáška od Jana Tvrdíka: https://www.youtube.com/watch?…
- sumiisakua
- Člen | 36
ViPErCZ napsal(a):
class Email extends Nette\Mail\Message { }
Tohle nepůjde.
Chci mít třídu/funkci, které předám xyz parametrů a ona odešle email.
Paradiso: Tak jsem to shlédnul a spíš sem se utvrdil v tom, že komponenta v tomto případě nejde použít.
• Nic nerendruji
• Po odeslájní formuláře, při jeho zpracování, si zavolám tuhle funkci
na odeslání emailů.
Editoval sumiisakua (20. 2. 2012 11:55)
- sumiisakua
- Člen | 36
ViPErCZ: Přemýšlel jsem nad tím jak dlouho, ale nemůže to
fungovat.
Však se koukni na ten kod v prním postu. (Ted neřešim to, že se funkce
jmenuje send, ale její obsah)4
Např vidim problém v tom, že ->setSubject() se zadává až v té funkci. Stejně tak, zda se má použít ->setHtmlBody() nebo ne.
- Paradiso
- Člen | 101
No já si nemůžu pomoci, třídu mail tedy zatím vůbec neznám, ale podle mě by to tou komponentou šlo. Viz. VP od Davidla Grudla.
<?php
/**
* Nette Framework Extras
*
* This source file is subject to the New BSD License.
*
* For more information please see https://addons.nette.org
*
* @copyright Copyright (c) 2009 David Grudl
* @license New BSD License
* @link https://addons.nette.org
* @package Nette Extras
* @version $Id: VisualPaginator.php 4 2009-07-14 15:22:02Z david@grudl.com $
*/
use Nette\Application\UI\Control;
use Nette\utils\Paginator;
/**
* Visual paginator control.
*
* @author David Grudl
* @copyright Copyright (c) 2009 David Grudl
* @package Nette Extras
*/
class VisualPaginator extends Control
{
/** @var Paginator */
private $paginator;
/** @persistent */
public $page = 1;
/**
* @return Nette\Paginator
*/
public function getPaginator()
{
if (!$this->paginator) {
$this->paginator = new Paginator;
}
return $this->paginator;
}
.
.
.
- Panda
- Člen | 569
Už jsem si asi třikrát přečetl celé vlákno a vlastně vůbec nevím, v čem je problém. Hodil by se příklad, čeho přesně chceš dosáhnout. Popis „Nedostanu se k proměnným, které mám definované v basepresenteru“ nebo „Nefunguje na 100% latte“ je dost neurčitá. K jakým proměnným se chceš dostat? Co z Latte Ti nefunguje?
Komponenta zde může i nemusí být výhodná. Nevizuální komponenty musí před použitím být připojeny k presenteru, vizuální mají navíc podporu pro šablony a o jejich inicializaci se automaticky postarají. Když jí vytvoříš, tak ji pak nemusíš vykreslit, jen si tu šablonu můžeš „Vypůjčit“. Takže záleží na tom, co přesně potřebuješ…
- sumiisakua
- Člen | 36
Panda napsal(a):
Už jsem si asi třikrát přečetl celé vlákno a vlastně vůbec nevím, v čem je problém. Hodil by se příklad, čeho přesně chceš dosáhnout. Popis „Nedostanu se k proměnným, které mám definované v basepresenteru“ nebo „Nefunguje na 100% latte“ je dost neurčitá. K jakým proměnným se chceš dostat? Co z Latte Ti nefunguje?
Tohle už jsem vyřešil díky setterům, které tu byly zmíněny.
Panda napsal(a):
Komponenta zde může i nemusí být výhodná. Nevizuální komponenty musí před použitím být připojeny k presenteru, vizuální mají navíc podporu pro šablony a o jejich inicializaci se automaticky postarají. Když jí vytvoříš, tak ji pak nemusíš vykreslit, jen si tu šablonu můžeš „Vypůjčit“. Takže záleží na tom, co přesně potřebuješ…
Komponentu jsem nezvolil právě pro to, že to je věc, kterou si
představuji někde vykreslenou.
V mém případě nic nevykresluji. Jen předám funkci proměnné, které
potřebuje a odešle email.
Dálě jsem jí nezvolil taky pro to, že jsem se nikdy nevěnoval jejich
nastudování.
- Oggy
- Člen | 306
Co něco takového?
<?php
<?php
use \Nette\Mail\Message;
/**
* Description of Mailer
*
* @author Petr Ogurcak <petr.ogurcak.cz>
*/
class Mailer extends \Nette\Application\UI\Control {
private $presenter;
function __construct($application) {
$this->presenter = $application->getPresenter();
}
/**
*
* @param string $template
* @param array $variables
* @param array $to
* @param string $subject
* @param string $from
*/
public function sendMail($templateName,$variables,$to,$subject = NULL,$from = NULL) {
$template = $this->presenter->createTemplate();
$template->setFile($this->presenter->context->parameters['appDir'].'/templates/mails/'.$templateName.'.latte');
foreach($variables as $name => $value) {
$template->{$name} = $value;
}
$mail = new Message;
if (!$from) $from = 'petr@ogurcak.cz';
$mail->setFrom($from);
foreach ($to as $emailTo) {
$mail->addTo($emailTo);
}
$mail->setSubject($subject)
->setHtmlBody($template);
$mail->send();
}
}
?>
config:
<?php
mailer: Mailer(@application)
?>
presenter:
<?php
try {
$this->context->mailer->sendMail('forgottenPassword',array('email'=> $values['email'],'password'=>$password),array($values['email']),'zapomenuté heslo');
$this->flashMessage("Tak nové heslo máš v mailu, změnit si ho můžeš po přihlášení. A radím ti udělat si uzel, abys ho zase nezapomněl/a.", 'success');
$this->redirect('in');
} catch (\Nette\InvalidStateException $exc) {
\Nette\Diagnostics\Debugger::log($exc, \Nette\Diagnostics\Debugger::ERROR);
$this->flashMessage("Tak nové heslo jsem ti nastavil, ale nedaří se mi ti ho poslat.", 'error');
}
?>
- Panda
- Člen | 569
sumiisakua napsal(a):
Komponentu jsem nezvolil právě pro to, že to je věc, kterou si představuji někde vykreslenou.
V mém případě nic nevykresluji. Jen předám funkci proměnné, které potřebuje a odešle email.
Dálě jsem jí nezvolil taky pro to, že jsem se nikdy nevěnoval jejich nastudování.
Tak si jí představ nevykreslenou, případně vykreslenou uživateli do mailu. ;-) Neříkám, že je to vhodné řešení pro Tvůj problém, protože Tvůj problém neznám. Někdy může být komponenta vhodná, někdy ne.
A nevěnoval jsi se nastudování? Nejvyšší čas začít! :-) Opravdu nic na tom není, je to jednoduchý princip.