У меня очень простая модель. Я хочу добавить процедуру отправки электронной почты для методов для модели:
$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');
наверху, безрезультатно. Ошибка, которую я получаю:
Неустранимая ошибка: вызов undefined метода stdClass :: send () в E: \ xampp \ htdocs8080 \ app \ models \ debug.php в строке 23
Есть идеи?
Я запускаю CakePHP 1.2
Ну, вы делаете это неправильно. Вы должны поместить процедуру отправки электронной почты в свой AppController:
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(); }
Затем используйте его с ЛЮБОГО контроллера следующим образом:
$this->_sendMail($this->data['User']['email'],'Thanks for registering!','register');
И не забудьте поместить
var $components = array('Email');
в контроллерах, в которых вы используете функцию _sendMail.
даже если это не самая лучшая практика, вы действительно можете использовать модуль EmailComponent в модели, но вам необходимо создать его (в моделях нет автоматической загрузки компонентов), и вам нужно передать ему контроллер. Компонент EmailComponent полагается на контроллер из-за подключения, которое ему требуется для представления, для рендеринга шаблонов и макетов электронной почты.
С таким методом, как это в вашей модели
function sendEmail(&$controller) { App::import('Component', 'Email'); $email = new EmailComponent(); $email->startup($controller); }
Вы можете использовать его в своем контроллере следующим образом:
$ This-> Модель-> SendEmail ($ это);
(опустите символ & в методе, если вы на PHP5)
CakePHP 2.0 имеет новый класс CakeEmail, который работает в любом месте:
http://book.cakephp.org/2.0/en/core-utility-libraries/email.html
Компоненты должны использоваться в контроллерах, а не в моделях.
В вашем контроллере используйте
var $components = array('Email');
Нет необходимости использовать App :: import ();
Не зная своего приложения и причин, побуждающих его использовать в модели, я мог бы предложить вам пересмотреть свою системную архитектуру и переместить эту логику в контроллер.
Если вам определенно нужно это в вашем режиме, ваш код включал что-то вроде …
$this->Email->delivery = ...
Вы положили созданный новый экземпляр компонента и установили его в свойство вашей модели под названием «Электронная почта»? (Не знаю, будет ли это работать ум.)
Ошибка, которую вы получаете, связана с тем, что вы вызываете метод send () для объекта stdClass, а не для экземпляра компонента EmailComponent.
Хорошо, правда, неплохо использовать компоненты в моделях. Моя проблема заключалась в том, что я не хотел писать блок электронной почты миллион раз в своих контроллерах:
$ 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-> отправить ();
Вряд ли DRY, если я использую это 5 раз в контроллере. Поэтому я создал компонент Wrapper и добавил процедуру sendEmail, поэтому могу просто написать:
$ This-> Wrapper-> SendEmail ($ от, $ к, $ вопросу, $ шаблон, $ тела);
Я с тобой, Джастин.
У меня есть серия моделей, которые запускают электронные письма на основе определенных действий, которые могут исходить от пользователей, администраторов и сценариев оболочки для автоматизированных процессов.
FAR легче централизовать ответ электронной почты в модели (например, когда запись заказа отменена), чем переписывать электронную почту в нескольких местах.
Кроме того, у меня есть автоматизированные процессы в моделях, которые обрабатывают некоторую основную «логику», которая является каскадом для других hasOne, принадлежит или hasMany Models, которые являются правилами biz.
Например, скрипт crontabbed shell вызывает Offer-> expire () для «истечения» Предложения, которое затем вызывает Offer-> make (), чтобы сделать другое предложение, но если он не может, он вызывает Request-> expire () для «истекает» исходный запрос. Письма должны быть отправлены первому истекшему получателю Предложения, любым новым получателям Предложения и / или запрашивающему лицу, если оно истечет. Они могут быть вызваны оболочкой crontabbed или пользователями или админами, которые могут управлять запросами и предложениями вручную. Все с использованием разных контроллеров или интерфейсов.
Это то, что я сделал и могу назвать его в моделях и контроллерах:
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
У меня есть приложение, где я добавляю одну строку к модели (model1). Затем эта модель запускает записи в другую модель (model2). модель1 естьmany модель2. Я хотел только отправлять электронные письма, если вставка модели 2 успешно выполнена. Таким образом, я искал, чтобы sendmail1 отправлял электронные письма каждый раз, когда он успешно встраивается в model2.
На этом этапе реструктуризация системной архитектуры слишком велика.
Мое решение? Когда я делаю Model1-> addRecord, он делает model2-> addRecord (). У меня есть модель1 отслеживать каждую неудачу или успех от model2-> addRecord. Начиная с model1-> addRecord, я возвращаю массив успеха / отказа вызывающему контроллеру (model1_controller). Оттуда я буду иметь диспетчер model1_controller для электронной почты.
Таким образом, это можно сделать правильно, без необходимости полностью переписывать архитектуру. Просто верните дополнительную информацию от Model1 к контроллеру, затем попросите контроллер (правильно) отправить электронные письма.
Извините за несколько неясную запись. Сейчас мой мозг находится в кодовом режиме.
Посмотрите плагин под названием Eventful
Это позволит вам транслировать и прослушивать пользовательские события. Для плаката ниже меня: вы можете транслировать событие Model1Saved, слушать его в модели2, а затем выполнять второе сохранение, и они транслируют событие успеха на модель1 или даже контроллер. Оттуда вы можете отправить свой адрес электронной почты.