Intereting Posts
Безопасный вход с правильной аутентификацией в PHP Могу ли я получить текущую информацию о маршруте в промежуточном программном обеспечении с помощью Lumen? Могу ли я высмеять реализацию интерфейса с помощью PHPUnit? Обратный массив в php Javascript crc32 и PHP crc32 не соответствуют Как добавить <tr> </ tr> после каждого четвертого члена цикла <td> </ td> Показать запрос в строке таблицы (th) Строки порядка php mysql Java-клиент и сервер PHP с сокетами Как установить MySql SQL_MODE в ANSI из PHP jQuery – получение массива $ _FILES с использованием $ .post Как изменить текстовое поле на видимое в зависимости от того, какой элемент выбран в раскрывающемся меню? получать файлы изображений из каталога на сервере для дальнейшей обработки быстрый способ получить родительский ключ массива в многомерных массивах с php Как обновлять / редактировать данные в базе данных с помощью AngularJS

Как использовать компонент электронной почты из модели в 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'); 

наверху, безрезультатно. Ошибка, которую я получаю:

Неустранимая ошибка: вызов 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 или даже контроллер. Оттуда вы можете отправить свой адрес электронной почты.