Funkce/třída na odeslání emailu

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

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

• 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)

Paradiso
Člen | 101
+
0
-

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 :-)

ViPEr*CZ*
Člen | 813
+
0
-

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

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

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

**ViPEr*CZ***: Joo už je to v pohodě. Jsem zvyklí na fluent zápis a tady to nejde :) Moje chyba.

Paradiso
Člen | 101
+
0
-

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

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)

ViPEr*CZ*
Člen | 813
+
0
-

>

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.

Proč by to nešlo? Právě, že to tak půjde a bude to hezčí. ;-)

sumiisakua
Člen | 36
+
0
-

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

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

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

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

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

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.