2008-11-23 35 views
6

Tôi có một mô hình rất đơn giản. Tôi muốn thêm một thói quen email gửi đến trên các phương pháp mô hình:Tôi làm cách nào để sử dụng thành phần email từ mô hình trong 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'; 

Tôi đã thử đặt

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

ở đầu, không có kết quả. Lỗi tôi nhận được là:

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

Bất kỳ ý tưởng nào?

Tôi đang chạy CakePHP 1.2

Trả lời

11

Vâng, bạn đang làm nó một cách sai lầm.Bạn nên đặt email gửi thói quen trong AppController của bạn:

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(); 
} 

Sau đó sử dụng nó từ bất kỳ bộ điều khiển như thế này:

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

Và đừng quên để đặt

var $components = array('Email'); 

trong bộ điều khiển, trong đó bạn đang sử dụng hàm _sendMail.

+2

Cảm ơn! "Vui lòng nhập ít nhất 10 ký tự". là một yêu cầu câm. – Justin

+0

Vâng, tôi không thể nói lời cảm ơn. Làm phiền. – Justin

+0

tôi có thể thêm mô hình này vào mô hình ứng dụng thay thế không? –

2

Các thành phần được cho là được sử dụng trong bộ điều khiển chứ không phải mô hình.

Trong việc bạn sử dụng bộ điều khiển

var $components = array('Email'); 

Không có nhu cầu sử dụng App :: nhập khẩu();

Nếu không biết ứng dụng của bạn và lý do muốn sử dụng nó trong một mô hình, tôi có thể đề nghị bạn nghĩ lại kiến ​​trúc hệ thống của bạn và di chuyển logic này đến bộ điều khiển của bạn.

Nếu bạn chắc chắn cần đến nó trong chế độ của bạn, mã của bạn bao gồm một cái gì đó giống như ...

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

có bạn đặt tạo ra một thể hiện mới của các thành phần và đặt nó là một thuộc tính của mô hình của bạn được gọi là Email? (Không có ý tưởng nếu điều này sẽ làm việc tâm trí.)

Lỗi bạn đang nhận được là vì bạn đang gọi phương thức send() trên đối tượng stdClass tức là không phải là phiên bản của phần tử EmailComponent.

2

OK, đúng là không tốt khi sử dụng các thành phần trong mô hình. Vấn đề của tôi là tôi không muốn phải viết khối email một triệu lần trong bộ điều khiển của mình:

$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();

Khó DRY nếu tôi sử dụng 5 lần này trong bộ điều khiển. Vì vậy, tôi đã tạo ra một thành phần được gọi là Wrapper, và thêm một thói quen SendEmail, vì vậy tôi chỉ có thể viết:

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

19

ngay cả khi nó không phải là thực hành tốt nhất, bạn thực sự có thể sử dụng EmailComponent trong một mô hình, nhưng bạn cần phải instanciate nó (trong các mô hình không có tải thành phần tự động) và bạn cần phải vượt qua nó một bộ điều khiển. EmailComponent dựa trên Bộ điều khiển vì kết nối cần để xem, để hiển thị mẫu và bố cục email.

Với một phương pháp như thế này trong mô hình của bạn

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

Bạn có thể sử dụng nó trong điều khiển của bạn như thế này:

$ this-> Model-> SendEmail ($ này);

(bỏ qua & trong chữ ký phương pháp nếu bạn đang ở trên PHP5)

2

Tôi ở cùng bạn Justin.

Tôi có một loạt các Mô hình kích hoạt email dựa trên một số hành động nhất định có thể đến từ Người dùng, Quản trị viên và tập lệnh shell cho các quy trình tự động.

Sẽ dễ dàng hơn để tập trung phản hồi email trong Mô hình (như khi bản ghi Đơn đặt hàng bị 'hủy') thay vì viết lại email ở nhiều vị trí.

Ngoài ra, tôi có các quy trình tự động trong Mô hình xử lý một số 'logic' cốt lõi mà xếp vào các mô hình hasOne, dependsTo hoặc hasMany khác là các quy tắc biz. Ví dụ, một script shell crontabbed gọi Offer-> expire() để 'hết hạn' một Offer sau đó gọi Offer-> make() để thực hiện một Offer khác, nhưng nếu nó không thể sau đó nó gọi Request-> hết hạn() để 'hết hạn' yêu cầu ban đầu. Email phải được gửi đến Người nhận ưu đãi đã hết hạn đầu tiên, cho bất kỳ người nhận Ưu đãi mới và/hoặc người yêu cầu nếu nó hết hạn. Chúng có thể được gọi bởi shell crontabbed hoặc bởi Users hoặc bởi Admins, người có thể quản lý các Requests và Offer một cách thủ công. Tất cả đều sử dụng Bộ điều khiển hoặc giao diện khác nhau.

Đây là những gì tôi đã làm và có thể gọi nó bên trong mô hình và bộ điều khiển:

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

Bây giờ tôi có thể gọi đây là từ chỉ là về bất cứ nơi nào và tập trung tất cả các logic cho những dữ liệu để tìm(), những gì email để tạo ra, mà gửi nó cho vv qua sau đây gọi là bên trong Model:

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

Vì tất cả các logic email về cơ bản là gọi bằng các mô hình gián tiếp thông qua MailsController, tôi sẽ cung cấp cho mã rscherer của một sự cố gắng.

Hope this helps, oh4real

+1

"Bạn không được phép sử dụng EmailComponent trong một mô hình. Sử dụng một bộ điều khiển" thực sự là thiếu điểm và dựa trên lý luận tùy ý. Trong các email Rails thường được gửi từ một Observer, mà về cơ bản là một hành vi mô hình trong Cake, vì các email thường xảy ra trên các thay đổi trạng thái. – method

0

Tôi có một ứng dụng mà tôi thêm một hàng duy nhất để một mô hình (MODEL1). Mô hình đó sau đó kích hoạt các mục nhập vào một mô hình khác (model2). model1 hasmany model2. Tôi chỉ muốn gửi email nếu model2 chèn thành công. Vì vậy, tôi đã tìm cách để model1 gửi email mỗi khi nó chèn thành công vào model2.

Tái cấu trúc kiến ​​trúc hệ thống là quá nhiều thời gian tại thời điểm này.

Giải pháp của tôi? Khi tôi làm một Model1-> addRecord, nó thực hiện mô hình 2-> addRecord(). Tôi có model1 theo dõi từng thất bại hoặc thành công từ model2-> addRecord. Từ model1-> addRecord tôi sau đó trả về một mảng thành công/thất bại cho bộ điều khiển gọi (model1_controller). Từ đó tôi sẽ có vấn đề model1_controller các email.

Vì vậy, có thể thực hiện điều này một cách chính xác mà không phải viết lại hoàn toàn kiến ​​trúc. Chỉ cần trả lại thêm thông tin từ Model1 đến bộ điều khiển, sau đó có bộ điều khiển (đúng) gửi email.

Xin lỗi vì bài đăng không rõ ràng. Bộ não của tôi hiện đang được mã hóa.

0

Nhìn vào một plugin gọi Sôi động

Nó sẽ cho phép bạn để phát sóng và lắng nghe cho các sự kiện tùy chỉnh. Đối với áp phích bên dưới tôi: bạn có thể phát sự kiện Model1Saved, lắng nghe nó trong model2, sau đó thực hiện lần lưu thứ hai và phát lại sự kiện thành công trở lại model1 hoặc thậm chí là bộ điều khiển. Từ đó bạn có thể gửi email của bạn.

Các vấn đề liên quan