Как я использую почтовый компонент из модели в CakePHP?

Kingfisher (5.1.0) выдает мне эту ошибку только с Xcode 9. , он отлично работает с Xcode 10. .

Ошибка в файле String + MD5.swift

6
задан Justin 9 November 2009 в 12:57
поделиться

7 ответов

Ну, Вы делаете его неправильно путь. Необходимо поместить, электронная почта отправляют стандартную программу в 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 функцию.

10
ответ дан 8 December 2019 в 02:16
поделиться

даже если это не лучшая практика, на самом деле можно использовать EmailComponent в модели, но Вам нужен к instanciate он (в Моделях нет никакой автоматической загрузки Компонента), и необходимо передать его контроллер. EmailComponent полагается на Контроллер из-за соединения, в котором он нуждается к представлению для рендеринга почтовых шаблонов и разметок.

С методом как это в Вашей модели

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

Можно использовать его в Контроллере как это:

$this-> Модель-> sendEmail ($this);

(опустите и в сигнатуре метода, если Вы находитесь на PHP5),

19
ответ дан 8 December 2019 в 02:16
поделиться

Компоненты, как предполагается, используются в контроллерах, не моделях.

В Вашем использовании контроллера

var $components = array('Email');

Нет никакой потребности использовать Приложение:: импорт ();

Не зная Ваше приложение и причины желания использовать его в модели, я мог бы предложить, чтобы Вы заново продумали свою архитектуру системы и переместили эту логику в Ваш контроллер.

При определенной необходимости в нем в режиме код включал что-то как...

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

Вы поместили, создал новый экземпляр компонента и установил его на свойство Вашей модели, названной электронной почтой? (Никакая идея, если это будет работать ум.)

Ошибка, которую Вы получаете, состоит в том, потому что Вы называете отправление () метод на объект stdClass т.е. не экземпляр EmailComponent.

2
ответ дан 8 December 2019 в 02:16
поделиться

Хорошо, верный не хорошо использовать компоненты в моделях. Моя проблема была, я не хотел должным быть писать, что электронная почта блокирует миллион раз в моих контроллерах:

$this-> электронная почта-> доставка = 'smtp';

$this-> электронная почта-> обрабатывают по шаблону = $template;

$this-> электронная почта-> sendAs = 'текст';

$this-> электронная почта-> от = $from;

$this-> электронная почта-> к = $to;

$this-> электронная почта-> подвергают = $subject;

$this-> электронная почта-> отправляют ();

Едва DRY, если я использую это 5 раз в контроллере. Таким образом, я создал компонент под названием Обертка и добавил sendEmail стандартную программу, таким образом, я могу просто записать:

$this-> Обертка-> sendEmail ($from, $to, $subject, $template, $body);

2
ответ дан 8 December 2019 в 02:16
поделиться

Я - с Вами Justin.

У меня есть ряд Моделей, которые инициировали электронные письма на основе определенных действий, которые могут произойти от Пользователей, Администраторов и сценариев оболочки для автоматизированных процессов.

Это - FAR, легче централизовать почтовый ответ в Модели (как то, когда запись Порядка 'отменяется'), чем переписать электронную почту в нескольких местоположениях.

Кроме того, у меня есть автоматизированные процессы в Моделях, которые обрабатывают некоторую базовую 'логику', которые располагаются каскадом к другому hasOne, belongsTo или hasMany Моделям, которые являются правилами бизнеса.

Например, crontabbed сценарий оболочки звонит, Предложение-> истекают () для 'истекания' Предложения, которое затем звонит, Предложение-> делают (), чтобы сделать другое Предложение, но если это не может затем он звонить, Запрос-> истекают () для 'истекания' исходного запроса. Электронные письма должны быть посланы первому получателю Предложения с истекшим сроком любым новым получателям Предложения и/или просителю, если это истекает. Их может назвать оболочка 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

2
ответ дан 8 December 2019 в 02:16
поделиться

У меня есть приложение, в котором я добавляю одну строку в модель (model1). Затем эта модель запускает записи в другую модель (model2). модель1 имеет много модель2. Я хотел только отправлять электронные письма, если model2 вставляет успешно. Поэтому я хотел, чтобы модель 1 отправляла электронные письма каждый раз, когда она успешно вставляется в модель 2.

На этом этапе перестройка архитектуры системы занимает слишком много времени.

Мое решение? Когда я делаю Model1-> addRecord, он делает model2-> addRecord (). У меня есть model1 отслеживать каждый сбой или успех от model2-> addRecord. От модели1-> addRecord Затем я возвращаю массив успеха / неудачи вызывающему контроллеру (model1_controller). Оттуда я тогда заставлю model1_controller выдавать электронные письма.

Таким образом, можно сделать это правильно, не переписывая архитектуру полностью. Просто верните больше информации от Model1 к контроллеру, затем попросите контроллер (должным образом) отправить электронные письма.

Извините за несколько неясный пост. Мой мозг сейчас в кодовом режиме.

0
ответ дан 8 December 2019 в 02:16
поделиться

Посмотрите на плагин под названием Eventful

, который позволит вам транслировать и прослушивать пользовательские события. Для плаката подо мной: вы можете транслировать событие Model1Saved, прослушивать его в model2, затем выполнять второе сохранение, и они транслируют событие успеха обратно в model1 или даже в контроллер. Оттуда вы можете отправить свою электронную почту.

0
ответ дан 8 December 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: