2008-11-23 42 views
6

我有一個非常簡單的模型。我想一個發送電子郵件程序添加到爲模型的方法:如何在CakePHP中使用模型中的電子郵件組件?

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

我試圖把

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

在頂部,但無濟於事。我得到的錯誤是:

Fatal error: Call to undefined method stdClass::send() in E:\xampp\htdocs8080\app\models\debug.php on line 23

任何想法?

我在運行CakePHP 1.2

回答

11

嘛,你這樣做是錯誤的方式。你應該把電子郵件在你的AppController發送例行:

function _sendMail($to,$subject,$template) { 
    $this->Email->to = $to; 
    // $this->Email->bcc = array('[email protected]'); // copies 
    $this->Email->subject = $subject; 
    $this->Email->replyTo = '[email protected]'; 
    $this->Email->from = 'MyName <[email protected]>'; 
    $this->Email->template = $template; 
    $this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text') 
    $this->Email->send(); 
} 

然後從任何像這樣的控制器使用方法:

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

而且不要忘記將

var $components = array('Email'); 
在控制器

,其中你正在使用_sendMail函數。

+2

謝謝! 「請輸入至少10個字符。」是一個愚蠢的要求。 – Justin 2009-03-11 01:32:31

+0

是的,我不能說謝謝。煩人。 – Justin 2009-10-22 02:04:43

2

組件應該用在控制器中,而不是模型中。

在你的控制器使用

var $components = array('Email'); 

沒有必要使用App ::進口();

如果不知道您的應用程序以及想要在模型中使用它的原因,我可能會建議您重新考慮您的系統架構並將此邏輯移至您的控制器。

如果你一定要在你的方式,你的代碼中包含了類似...

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

,你是否曾經創建的組件的新實例,並將其設置爲所謂的電子郵件模型的屬性? (不知道這是否會起作用。)

你得到的錯誤是因爲你正在調用stdClass對象上的send()方法,而不是EmailComponent的一個實例。

2

好的,真的不好在模型中使用組件。我的問題是我不希望有一百萬次寫郵件阻塞在我的控制器:

$this->Email->delivery = 'smtp';

$this->Email->template = $template;

$this->Email->sendAs = 'text';

$this->Email->from = $from;

$this->Email->to = $to;

$this->Email->subject = $subject;

$this->Email->send();

未乾,如果我在一個控制器使用5次。所以,我創建了一個名爲包裝成分,並添加了sendEmail程序,這樣我就可以寫:

$this->Wrapper->sendEmail($from,$to,$subject,$template,$body);

19

即使它不是最好的做法,實際上,你可以使用EmailComponent在模型中,但你需要實例化它(在模型中沒有自動的組件加載),你需要傳遞一個控制器。 EmailComponent依賴於Controller,因爲它需要連接到視圖,用於呈現電子郵件模板和佈局。

隨着模型這樣的方法

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

你可以用它在你的控制器是這樣的:

$這個 - >型號 - > sendEmail($本);

(省略&方法簽名,如果你是在PHP5)

2

我和你在一起Justin。

我有一系列模型可以根據某些操作觸發電子郵件,這些操作可以來自用戶,管理員和用於自動化流程的shell腳本。

在模型中集中化電子郵件響應(例如訂單記錄'取消'時)比在多個位置重寫電子郵件更容易。

此外,我在模型中處理一些核心'邏輯'級聯到其他hasOne,belongsTo或hasMany模型是biz規則的自動化流程。

例如,一個crontabbed shell腳本調用Offer-> expire()來'過期'一個Offer,然後調用Offer-> make()來創建另一個Offer,但如果它不能,那麼它調用Request->過期()將'過期'原始請求。電子郵件必須發送給第一個過期的收件人,任何新的收件人和/或要求者過期。這些可以由crontabbed shell或由用戶或可以手動管理請求和優惠的管理員調用。全部使用不同的控制器或接口。

這是我做的,並可以調用它的內部模型和控制器:

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

現在我可以從任何地方撥打這一點,並集中所有的邏輯來查找數據(),有什麼電子郵件產生,誰通過以下稱爲模型內發送到,等:

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

由於所有的電子郵件邏輯基本上是通過間接通過MailsController的模型叫,我去給rscherer代碼一試。

希望這有助於 oh4real

0

我有一個應用程序,我添加一行到模型(模型1)。該模型然後觸發到另一個模型(模型2)的條目。 model1 hasmany model2。如果model2插入成功,我只想發送電子郵件。所以我期望每次成功插入model2時,model1都會發送電子郵件。

此時重構系統架構的時間太多了。

我的解決方案?當我做一個Model1-> addRecord時,它做了一個model2-> addRecord()。我有model1跟蹤來自model2-> addRecord的每個失敗或成功。從model1-> addRecord,然後將一個成功/失敗的數組返回給調用控制器(model1_controller)。從那裏我將有model1_controller發出電子郵件。

因此,不必完全重寫體系結構就可以正確執行此操作。只需將Model1的更多信息返回給控制器,然後讓控制器(正確)發送電子郵件。

對不起,有點不明確的職位。我的大腦現在處於代碼模式。

0

尋找到一個插件叫做多事

它可以讓你播放和監聽自定義事件。對於我以下的海報:您可以廣播一個Model1Saved事件,在model2中偵聽它,然後執行第二次保存,並將成功事件廣播回到model1,甚至是控制器。從那裏你可以發送你的電子郵件。

相關問題