unset($this['email'])
Иначе говоря, все, кто хочет изменить email, идут лесом: это не разрешается. Как быть тем, кто хочет сделать более дружелюбный интерфейс?
На самом деле, Америки я открывать не собираюсь, но иногда готовый алгоритм может сэкономить час-другой времени.
Итак, чтобы разрешить пользователю изменять свой email, нужно:
1. Добавить поле для смены email в форму редактирования своего профиля
2. Добавить в схему данных новое поле new_email
3. В форме редактирования профиля добавляем обработчик данных: если email изменился, то отправляем письмо со сгенерированной ссылкой на подтверждение email
function updateObject($values=null) { $old_email=$this->getObject()->email; $new_email=$this->getValue('email'); parent::updateObject($alues); if ($old_email != $new_email) { $this->getObject()->email=$old_email; $this->getObject()->new_email=$new_email; $this->getObject()->validate=self::createGuid(); $this->getOption('action')->mail(array( 'subject' => 'Смена email на сайте XXX.XX', 'name' => $this->getObject()->name, 'email' => $this->getObject()->new_email, 'parameters' => array('name' => $this->getObject()->name, 'validate' => $this->getObject()->validate), 'text' => 'profile/sendValidateEmailText', 'html' => 'profile/sendValidateEmail' )); } return $this->getObject(); }
4. Составляем письмо со ссылкой:
Здравствуйте, Вы запросили изменение регистрационного email на сайте XXX.XX. Подтвердите изменение переходом по ссылке: [php echo url_for('@confirm_new_email?validate='.$validate, true) ] Если вы не понимаете о чем речь, просто проигнорируйте это письмо. ------ Почтовый робот
5. Добавляем роут для подтверждения смены email
confirm_new_email: url: /profile/confirm_new_email/:validate param: { module: profile, action: confirmNewEmail }
6. Экшен обработки подтверждения:
public function executeConfirmNewEmail(sfRequest $request) { $validate = $this->request->getParameter('validate'); if (!strlen($validate)) return 'Invalid'; $user=Doctrine::getTable('sfGuardUser')->findOneByValidate($validate); if (!$user) return 'Invalid'; if (!$user->new_email) return 'Invalid'; $user->email=$user->new_email; $user->validate=null; $user->save(); $this->user = $user; }
Комментариев нет:
Отправить комментарий