Ako poslať z userManagera konfirmačný email

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

Zdravím,
prosím vás ako mám vyriešiť takúto vec:

  1. Z registračného formu dostanem meno, email, heslo, role
  2. Pošlem to na App\Model\UserManager::add($params, $presenter/vysvetlím/)
  3. V metóde add() otvorým transakciu pretože sa vkladá do viacerých tabuliek.
  4. Kôli tej transakcii to musím commitnúť. A kôl tomu commitu pridávam k tomu celému aj odoslanie emailu. Nekameňujte ma aj tak to nefunguje. Inak si totiž neviem predstaviť, ako by som urobil rollback ak by odoslanie emailu v presentery zlyhalo.
  5. Volanie createTemplate vyvolá chybu „Call to undefined method App\Model\UserManager::createTemplate().“

Dúfam, že chápete. Snažil som sa byť stručný. Ak nie vysvetlím.

Editoval Čamo (11. 3. 2015 23:25)

bazo
Člen | 620
+
+1
-

no a odkial by ten UserManager mal vediet co je metoda createTemplate? definoval si mu ju? odhlianuc od toho, ze je to blbost. posielanie mailov by si mal delegovat na iny objekt, nejaky Mailer, ktory bude mat latte a tam si mozes vytvarat templaty.

a este ked to prepojis cez eventy tak to bude zuzo

Čamo
Člen | 798
+
0
-

No lenže ja tú metódu volám takto:

$presenter->createTemplate()->setFile(__DIR__ . '/../templates/Register/email.latte');

$presenter je presenter tak v čom je chyba?

echo
Člen | 134
+
0
-

Ta metoda je protected: https://api.nette.org/…esenter.html#…

šup dostudovat základy php

Čamo
Člen | 798
+
0
-

Aký ste milý na mňa, pritom si nemyslí, že toto je nejaká triviálna otázka…

Keby ste tak ešte niekto napísali, ako sa toto rieši. Nemyslím tým vetu urob si mailer…

Práve sa snažím to urobiť ako komponentu, ale bez úspechu…

Michal Vyšinský
Člen | 608
+
0
-

Proč vytváříš šablonu přes presenter? Injectni si LatteFactory a vytvoř šablonu jednoduše přes ni. Jak na to sepsal hezky David

Editoval Michal Vyšinský (12. 3. 2015 11:23)

Čamo
Člen | 798
+
0
-

Ten článok vidím prvý krát, tak si ho idem prečítať.

Ale dovolím si jednu hnidopišskú otázku. Ako by sa to riešilo, vo verzii 2.0?

Editoval Čamo (12. 3. 2015 11:26)

studna
Člen | 181
+
0
-

Udělej si samostatně službu na odesílání e-mailů. Zkusím to letmo nastínit..

class Postman extends Nette\Object {

	private $mailer;

	private $dir;

	function __construct($dir, IMailer $mailer) {
		$this->mailer = $mailer;
		$this->dir = $dir;
	}

	public function getSubscribedEvents() {
		return [
			'App\Model\UserManager::onRegister' => 'onRegister'
		]
	}

	public function onRegister(User $user, ActivationToken $token) {
		$message = new Message();
		// ..

		$html = $this->getHtmlString('onRegister.latte', [
			'user' => $user,
			'token' => $token
		]);

		$message->setHtmlBody($html);
		$this->mailer->send($message);
	}

	private function getHtmlString($name, $params = []) {
		$filename = $this->dir . DIRECTORY_SEPARATOR . $name;
		$latte = new Latte\Engine();
		return $latte->renderToString($filename, $params);
	}

}

Pokud používáš Kdyby\Events, tak stačí, když této službě přidáš tag kdyby.subscriber v configu. A samozřejmě do UserManager doplníš něco jako:

class UserManager extends Nette\Object {

	public $onRegister = [];

	public function register($params) {
		// $user = zpracujes data a vlozis uzivatele
		// $activationToken = vytvoris uzivateli aktivacni token

		$this->onRegister($user, $activationToken);
	}
}

Pokud bys potřeboval vytvářet odkazy, přečti si https://phpfashion.com/…-a-nette-2-3.

Michal Vyšinský
Člen | 608
+
0
-

Čamo napsal(a):

Ten článok vidím prvý krát, tak si ho idem prečítať.

Ale dovolím si jednu hnidopišskú otázku. Ako by sa to riešilo, vo verzii 2.0?

upgradem na 2.3 :)

Editoval Michal Vyšinský (12. 3. 2015 11:30)

Čamo
Člen | 798
+
-3
-

Som ešte na planéte na ktorej si myslím, že som? volá sa táto sekcia, „začátečníci“?
Ako díky Studna, ale nerozumiem ani F. Nedá sa to urobiť jednoduchšie? Eventy sú ešte neni v mojom repertoári.

No a áno potrebujem vytvárať odkazy.

studna
Člen | 181
+
+3
-

Pokud nechceš používat eventy, tak si tuto službu prostě předáš do UserManager (skrz konstruktor) a upravíš metodu add():

$this->postman->onRegister(..); // namísto $this->onRegister(...)

A ano, toto je sekce začátečníci, ale když používáš Nette framework, tak se jaksi očekává, že zvládáš alespoň základy OOP.

Zkus popsat, co přesně je pro tebe složité. A nebo jaké řešení si představuješ?

Čamo
Člen | 798
+
-7
-

Ako súvisí systém injektovania, systém šablon + vytvárania odkazov v šablonách … a eventy v Nette s oop? Možno v tom mám chaos, ale pokiaľ čítam dobre v tom článku od DG tak chaos to je aj bezo mňa a oop.
Je to trochu trápne ako sa ma snažíte za každú cenu zhodiť nie?

Editoval Čamo (12. 3. 2015 12:26)

akadlec
Člen | 1326
+
+3
-

nic ve zlém ale jediný kdo se tady shazuje si ty sám. Dostal si tady několik rad jak se to řeší a předpoklad používání nette je abys rozuměl php a oop.

Čamo
Člen | 798
+
-6
-

Už netrepte. Je tu kopa vláken, kde sa riešia úplne rovnaké otázky o ktorých by sa dalo povedať, že sú to základy php. Ale nechcem nikoho zhadzovať, tak s tým prestaňte, kým sa do toho nepustím. Každý je len človek a kto sa tvári že je viac má nejaký problém v hlave.

Editoval Čamo (12. 3. 2015 12:59)