Страница 1 из 1
Где лучше формировать письмо
Добавлено: 2010.11.25, 11:03
AbS_
У меня при регистрации пользователя, на указанный при регистрации адрес электронной почты отправляется письмо с с регистрационной информацией.
Сейчас формирование письма, заполнение всех полей, происходит внутри контроллера отвечающего за регистрацию, но как мне кажется это не совсем то место где это необходимо делать...
Кто как подходил к решению это проблемы?
Re: Где лучше формировать письмо
Добавлено: 2010.11.25, 11:15
Svyatov
У меня так: в компоненте с общими методами есть метод отправки e-mail, в нужных контроллерах в нужных методах формируется письмо (шаблоны писем лежат в папках вьюх контроллера), далее в функции отправки мыла передается заголовок, адрес и тело письма (т.е. основное заполнение полей, относящихся к отправке почты реализуются в методе отправки e-mail).
Re: Где лучше формировать письмо
Добавлено: 2010.11.25, 11:22
ATI
Передаю в шаблон все значение. В принципе так же как и
Svyatov.
Код: Выделить всё
Yii::app()->mailer->Body = $this->renderPartial('../email/feedback',
array('contact'=>$contact),true);
Re: Где лучше формировать письмо
Добавлено: 2010.11.25, 21:23
AbS_
Да про шаблоны то понятно.
Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.
пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.
Вот и мне стало интересно, кто как решал такое.
Re: Где лучше формировать письмо
Добавлено: 2010.11.25, 23:54
Ekstazi
Код: Выделить всё
$model=new Register();
if($model->saved()){
$this->setMessage('На ваш e-mail адрес были высланы инструкции по активации');
$this->sendEmail($model->email, '/email/user/register', array(
'model'=>$model
));
$this->redirect(array('login'));
}
$this->render('register',array(
'model'=>$model
));
Примерно так у меня. Тема письма формируется на основе pageTitle вьюхи
Re: Где лучше формировать письмо
Добавлено: 2010.11.26, 10:06
slavcodev
Еще есть метод
Своё событие
Re: Где лучше формировать письмо
Добавлено: 2010.11.29, 13:50
metal
AbS_ писал(а):Да про шаблоны то понятно.
Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.
пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.
Вот и мне стало интересно, кто как решал такое.
Кучу дублированного кода в будущем ты имел ввиду, когда появится необходимость оправлять электронные письма и по другому поводу? Например, рассылка новостей, восстановление пароля или сообщения о каких-либо событиях. Тогда можно попробовать
Консольное приложение. Сразу скажу, что так не делал, это лишь идея (причем почерпнутая именно в той самой документации).
Т.е. смысл такой, создаем таблицу в БД очередей писем (типа кому, откого, тема, текст события, важность сообщения, дата постановки в очередь). Т.е. когда пользователь зарегистрировался, то просто добавляется запись в базу данных. Написать консольное приложение, которое бы выдергивала из базы порцию, например 10 записей, в порядке важности и отправляло письма, удаляет эти записи. Потом с помощью Cron'а(видел его на многих веб-серверах) настроит периодический вызов команды -
Выполнение действий по cron-у. Ну и получается, что у нас будут периодически отправляться по 10 писем. И что нам будет необходимо, то просто добавлять письма в очередь, будь-то восстановление пароля или сообщение на ответ по теме
Re: Где лучше формировать письмо
Добавлено: 2010.11.29, 16:26
AbS_
Так и сделано.
Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
Re: Где лучше формировать письмо
Добавлено: 2010.11.29, 17:58
metal
AbS_ писал(а):Так и сделано.
Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
А где ее еще заполнять? Я познакомился с MVC совсем недавно и мало его еще знаю, но по-моему как раз контроллер и предназначен, чтобы работать с моделями(заполнять, удалять и изменять), и отправлять все это представлениям, чтобы показывать результат.
Или здесь о заполнении модели Майл в контроллере, который по идеи работает с моделью Юзер, и ему не нужно управлять другими моделями. Тут может и правда сделать какие-нибудь события, на которые реагировали бы другие компоненты, но в этом я пока не силен
Re: Где лучше формировать письмо
Добавлено: 2010.11.30, 10:57
Dr0ID
Я создал класс NotificationManager, который является приемником эвентов и занимается отправкой уведомлений.
Код: Выделить всё
class NotificationManager
{
/**
* Уведомление о аппруве
*@param CModelEvent $event
*/
public function approved($event)
{
// мой экстеншн для отправки нотификейшнов
Yii::app()->notification
->addRecipientsFromModel('Email', $event->sender, 'email')
->setComponentSetting('Email', 'subject', 'Ваша кандидатура утверждена')
->setView('approved')
->send();
}
}
В моделе:
Код: Выделить всё
public function doApprove()
{
...
$this->onApproved(new CModelEvent($this));
...
}
/**
* Событие срабатывающее при утверждении юзера
* @param CModelEvent $event
*/
public function onApproved($event)
{
$this->raiseEvent('onApproved', $event);
}
В контроллере:
Код: Выделить всё
public function actionApprove()
{
...
$notificationManager = new NotificationManager();
$employeeModel->onApproved = array($notificationManager, 'approved');
...
}
Соответственно, если нужно добавить кроме мыла еще методы для уведомления, это делается в notificationManager'е. Если есть еще места где можно утверждать юзеров и тд, достаточно подписаться на событие approved. Как мне кажется очень удобно.