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