Nasıl CakePHP'de bir model e-posta bileşeni kullanıyorsunuz?

8 Cevap php

Ben çok basit bir modeli var. Ben model için yöntemler üzerinde bir gönderme e-posta rutin eklemek istiyorum:

$this->Email->delivery = 'smtp';
$this->Email->template = 'default';
$this->Email->sendAs = 'text';     
$this->Email->from    = 'email';
$this->Email->to      = 'email';
$this->Email->subject = 'Error';

Ben koyarak denedim

App::import('Component', 'Email');

üstünde, boşuna. Ben almak hatadır:

Ölümcül hata: tanımsız yöntemi stdClass Çağrı :: E () gönderin: \ xampp \ htdocs8080 23. satırdaki app \ modeller \ debug.php \

Herhangi bir fikir?

Ben CakePHP'ye 1.2 koşuyorum

8 Cevap

Peki, bunu yanlış bir şekilde yapıyoruz. Sen AppController e-posta gönderme rutin koymalısın:

function _sendMail($to,$subject,$template) {
    $this->Email->to = $to;
    // $this->Email->bcc = array('secret@example.com'); // copies
    $this->Email->subject = $subject;
    $this->Email->replyTo = 'noreply@domain.com';
    $this->Email->from = 'MyName <noreply@domain.com>';
    $this->Email->template = $template;
    $this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
    $this->Email->send();
}

Sonra böyle HERHANGİ denetleyicisi kullanabilirsiniz:

$this->_sendMail($this->data['User']['email'],'Thanks for registering!','register');

Ve bir yerde unutma

var $components = array('Email');

kontrolörleri, hangi '_sendMail işlevini kullanarak yeniden.

en iyi uygulama olmasa bile, aslında bir modelde EmailComponent kullanabilirsiniz, ancak (Modeller hiçbir otomatik Bileşen yükleme yoktur) o instanciate gerekiyor ve bunu bir denetleyici geçmesi gerekiyor. EmailComponent e-posta şablonları ve düzenleri oluşturma için, çünkü görünüme ihtiyacı bağlantı Kontrolörü dayanır.

Modeliniz böyle bir yöntem ile

function sendEmail(&$controller) {
    App::import('Component', 'Email');
    $email = new EmailComponent();
    $email->startup($controller);
}

Bu gibi Controller kullanabilirsiniz:

$ This-> Model-> SendEmail ($ this);

(Eğer PHP5 iseniz ve yöntem imzası ihmal)

CakePHP 2.0 yerde çalışır yeni CakeEmail sınıf vardır:

http://book.cakephp.org/2.0/en/core-utility-libraries/email.html

Bileşenleri kontrolörleri, değil modeller kullanılacak olması gerekiyordu.

Denetleyicisi kullanımda

var $components = array('Email');

App :: import () kullanmaya gerek yoktur;

App ve bir model kullanmak isteyen için nedenleri bilmeden, sana yeniden düşünmek sistem mimarisi önerebiliriz ve denetleyici için bu mantığı taşıyın.

Kesinlikle modunda ihtiyacınız varsa, kod gibi bir şey dahil ...

$this->Email->delivery = ...

Eğer bileşeninin yeni bir örneğini oluşturulur ve e-posta denilen model bir özelliği ayarlamak koyduk? (Bu zihin çalışacaktır eğer fikrim yok.)

Eğer EmailComponent bir stdClass nesnesi yani bir örneğinde send () yöntemini çağırarak çünkü sen alıyorsanız hatadır.

Tamam, gerçek bu modellerde bileşenleri kullanmak için iyi değildir. Benim sorunum e-posta benim denetleyicileri bir milyon kez engellemek yazmak zorunda istemiyordu oldu:

$ This-> E-> teslim = 'smtp';

$ This-> E-> template = $ şablon;

$ This-> E-> Sendas = 'text';

$ This-> E-> = $ den;

$ This-> E-> = $ ila;

$ This-> E-> subject = $ konu;

$ This-> E-> send ();

Zor KURU Ben bir denetleyicisi bu 5 kez kullanıyorsanız. Yani Sarıcı adlı bir bileşeni oluşturulur ve bir SendEmail rutin eklendi, bu yüzden sadece yazabilirim:

$ This-> Sargı> SendEmail ($ için, $ konu, $ şablon, $ vücuttan $);

Seninle Justin değilim.

Ben otomatik işlemler için Kullanıcıları, yöneticileri ve kabuk komut gelebilir bazı eylemler tabanlı e-postalar tetikleyecek Modellerinin bir dizi var.

Bu birden çok yerde e-posta yeniden yazmak daha (bir sipariş kaydı 'iptal' olduğu zaman gibi) Model bir e-posta yanıtı merkezileştirme FAR kolaydır.

Ayrıca, diğer hasOne, belongsTo ya da biz kurallardır hasMany Modelleri için bazı çekirdek 'mantık' o çağlayan ele Modeller işlemleri otomatik var.

Örneğin, bir crontabbed kabuk komut dosyası daha sonra başka bir teklif yapmak için) (Teklif-> çağrıları Teklif 'sona' için) (Teklif-> sona aramaları, ama sonra iste-> dolacak () çağrıları olamaz eğer Orijinal talebi 'sona'. E-postalar süresi sona eğer herhangi bir yeni teklif alıcılara ve / veya istekte, ilk teklif süresi dolmuş alıcıya gönderilmesi gerekir. Bu crontabbed kabuğu veya Kullanıcılar tarafından veya İstekleri yönetmek ve elle Teklifler olabilir Yöneticileri tarafından çağrılabilir. Tüm farklı Kontrolörleri veya arabirimleri kullanarak.

Bu ben yaptım ve Modelleri ve Kontrolörler içine arayabilirsiniz şeydir:

if(empty($this->MailsController)) {
    App::import('Controller','Mails');
    $this->MailsController = new MailsController();
    $this->MailsController->constructClasses();
    $this->MailsController->Email->startup($this->MailsController);
}

Şimdi ben), ne oluşturmak için e-posta, kime Modelin içinde denir takip yoluyla, vb göndermek için hemen hemen her yerde bu çağrı ve (veri bulmak için ne için tüm mantığını merkezde mümkün duyuyorum:

$this->MailsController->orderMail($user_id,$this->id,$mode);

E-posta mantık hepsi temelde MailsController üzerinden dolaylı Modeller denir beri, ben rscherer en kodu denemeye gidiyorum.

Hope this helps, oh4real

Ben bir model (modeli1) tek bir satır eklemek bir uygulama var. Bu model daha sonra başka bir model (model2) içine girişleri tetikler. modeli1 hasMany model2. Ben model2 başarıyla ekler yalnızca e-postalar göndermek istedi. Bu yüzden e-postalar bu Model2 içine başarıyla ekler her zaman göndermek modeli1 için bakıyordu.

Sistem mimarisini yeniden yapılandırılması, bu noktada çok fazla zaman.

Benim çözüm? Ben Model1-> addRecord yaptığınızda, o) (a model2-> addRecord yapar. Ben model2-> addRecord her başarısızlık veya başarı takip modeli1 var. Modeli1-> addRecord itibaren ben o çağıran denetleyicisi (model1_controller) için başarı / başarısızlık bir dizi döndürür. Oradan sonra model1_controller issue e-postalar var olacaktır.

Yani bu tamamen mimarisini yeniden yazmak zorunda kalmadan doğru olarak yapmak mümkün. Sadece (düzgün) e-postalar göndermek denetleyicisi var, sonra denetleyiciye Model1 daha fazla bilgi döndürür.

Biraz belirsiz yazı için özür dilerim. Beynim hemen codemode bulunmaktadır.

Olaylı adında bir eklenti içine bak

Bu yayın ve özel olayları dinlemek için izin verir. Bana aşağıda poster için: Eğer bir Model1Saved olay yayını olabilir Model2 bunun için dinlemek, sonra ikinci tasarruf yapmak ve onları geri modeli1 başarılı bir olay için yayın, hatta bir denetleyici. Oradan size e-posta gönderebilirsiniz.