Где лучше формировать письмо

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Где лучше формировать письмо

Сообщение AbS_ »

У меня при регистрации пользователя, на указанный при регистрации адрес электронной почты отправляется письмо с с регистрационной информацией.
Сейчас формирование письма, заполнение всех полей, происходит внутри контроллера отвечающего за регистрацию, но как мне кажется это не совсем то место где это необходимо делать...

Кто как подходил к решению это проблемы?

Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Где лучше формировать письмо

Сообщение Svyatov »

У меня так: в компоненте с общими методами есть метод отправки e-mail, в нужных контроллерах в нужных методах формируется письмо (шаблоны писем лежат в папках вьюх контроллера), далее в функции отправки мыла передается заголовок, адрес и тело письма (т.е. основное заполнение полей, относящихся к отправке почты реализуются в методе отправки e-mail).

ATI
Сообщения: 69
Зарегистрирован: 2009.09.27, 12:35

Re: Где лучше формировать письмо

Сообщение ATI »

Передаю в шаблон все значение. В принципе так же как и Svyatov.

Код: Выделить всё

Yii::app()->mailer->Body = $this->renderPartial('../email/feedback',
    array('contact'=>$contact),true);
 

AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Где лучше формировать письмо

Сообщение AbS_ »

Да про шаблоны то понятно.

Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.

пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.

Вот и мне стало интересно, кто как решал такое.

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Где лучше формировать письмо

Сообщение 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 вьюхи

Аватара пользователя
slavcodev
Сообщения: 3133
Зарегистрирован: 2009.04.02, 21:42
Откуда: Altea, Spain
Контактная информация:

Re: Где лучше формировать письмо

Сообщение slavcodev »

Еще есть метод Своё событие
Жду Yii 3!

Аватара пользователя
metal
Сообщения: 12
Зарегистрирован: 2010.11.08, 05:48

Re: Где лучше формировать письмо

Сообщение metal »

AbS_ писал(а):Да про шаблоны то понятно.

Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.

пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.

Вот и мне стало интересно, кто как решал такое.
Кучу дублированного кода в будущем ты имел ввиду, когда появится необходимость оправлять электронные письма и по другому поводу? Например, рассылка новостей, восстановление пароля или сообщения о каких-либо событиях. Тогда можно попробовать Консольное приложение. Сразу скажу, что так не делал, это лишь идея (причем почерпнутая именно в той самой документации).
Т.е. смысл такой, создаем таблицу в БД очередей писем (типа кому, откого, тема, текст события, важность сообщения, дата постановки в очередь). Т.е. когда пользователь зарегистрировался, то просто добавляется запись в базу данных. Написать консольное приложение, которое бы выдергивала из базы порцию, например 10 записей, в порядке важности и отправляло письма, удаляет эти записи. Потом с помощью Cron'а(видел его на многих веб-серверах) настроит периодический вызов команды - Выполнение действий по cron-у. Ну и получается, что у нас будут периодически отправляться по 10 писем. И что нам будет необходимо, то просто добавлять письма в очередь, будь-то восстановление пароля или сообщение на ответ по теме

AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Где лучше формировать письмо

Сообщение AbS_ »

Так и сделано.

Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.

Аватара пользователя
metal
Сообщения: 12
Зарегистрирован: 2010.11.08, 05:48

Re: Где лучше формировать письмо

Сообщение metal »

AbS_ писал(а):Так и сделано.

Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
А где ее еще заполнять? Я познакомился с MVC совсем недавно и мало его еще знаю, но по-моему как раз контроллер и предназначен, чтобы работать с моделями(заполнять, удалять и изменять), и отправлять все это представлениям, чтобы показывать результат.

Или здесь о заполнении модели Майл в контроллере, который по идеи работает с моделью Юзер, и ему не нужно управлять другими моделями. Тут может и правда сделать какие-нибудь события, на которые реагировали бы другие компоненты, но в этом я пока не силен

Dr0ID
Сообщения: 27
Зарегистрирован: 2010.04.04, 20:02
Откуда: Новосибирск
Контактная информация:

Re: Где лучше формировать письмо

Сообщение 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. Как мне кажется очень удобно.

Ответить