Как реализовать подтверждение по электронной почте при удалении пользователя в Yii

В моем проекте мне нужно реализовать следующие функции: - когда пользователь решает удалить свою учетную запись, перед удалением этому пользователю должно быть отправлено электронное письмо с «$deletionUrl», чтобы подтвердить решение по электронной почте. Я использую расширение Yiimailer, и оно работает нормально. Однако я не уверен, где и как я должен поставить эти условия относительно удаления пользователя. Это мое действие Удалить:

public function actionDelete($id) 
{
    $this->loadModel($id)->delete();
    if (!isset($_GET['ajax'])) {
        $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
}

Я искал в Интернете и обнаружил, что CActiveRecord имеет защищенный метод перед удалением ()

protected function beforeDelete()
{
    if($this->hasEventHandler('onBeforeDelete'))
    {
        $event=new CModelEvent($this);
        $this->onBeforeDelete($event);
        return $event->isValid;
    }
    else
        return true;
}

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#beforeDelete-detail

Но не знаю, как адаптировать его к моему случаю. И есть ли другой способ сделать это?


person BeeCoding    schedule 22.04.2014    source источник
comment
onbeforeDelete используется для дополнительной записи для удаления записей из модели. Почему вы используете здесь . вы можете изменить actionDelete . Используйте какой-нибудь ненужный ключ для удаления пользователя. проверьте обратный URL-адрес, который вы отправили ранее.   -  person Babu    schedule 22.04.2014
comment
Если пользователь удаляет из БД. Письмо с подтверждением отправлено пользователю. Это ваша цель, я прав?   -  person Babu    schedule 22.04.2014
comment
Пользователь запрашивает удаление, но перед удалением из базы данных пользователю отправляется письмо с подтверждением, чтобы предотвратить неправильное использование.   -  person BeeCoding    schedule 22.04.2014
comment
это нормально, вы просто активируете почту перед функцией удаления. почему вы используете это if($this-›hasEventHandler('onBeforeDelete')) { $event=new CModelEvent($this); $this-›onBeforeDelete($event); вернуть $event-›isValid; } иначе вернуть истину   -  person Babu    schedule 22.04.2014
comment
Аналогичная ситуация при активации проверки электронной почты при регистрации, но здесь применяется для удаления пользователя.   -  person BeeCoding    schedule 22.04.2014
comment
эта функция вызывается перед удалением записи. нет необходимости проверять hasEvent и далее. Вызовите php mailer здесь, отправьте свою почту просто здесь   -  person Babu    schedule 22.04.2014
comment
Да, это было бы отлично.   -  person BeeCoding    schedule 22.04.2014


Ответы (2)


Мне удалось решить эту проблему следующим образом. Мой actionDelete в UserController:

    public function actionDelete($id) {
    $model = $this->loadModel($id);
    $deletionUrl= Yii::app()->createAbsoluteUrl('user/confirm',array('aHash'=>$model->aHash));


       $message = new YiiMailer();
       $message->setView('contact');
       $message->setBody($deletionUrl);
       $message->setData(array('message' => '

        You have received this email because you requested a deletion of your account.
        If you did not make this request, please disregard this
        email. You do not need to unsubscribe or take any further action.
        </br>
        <hr>

        We require that you confirm  your request to ensure that
        the request made  was correct. This protects against
        unwanted spam and malicious abuse.

        To confirm deletion of your account, simply click on the following link:
        '.$deletionUrl.' <br> <br>
        (Some email client users may need to copy and paste the link into your web
        browser).','name' => '[email protected]', 'description' => 'Please   click on the link below in order to confirm your request:'));
       $message->setLayout('mail');
       $message->IsSMTP();
       $message->setSubject ('Request for account deletion');
       $message->Host = 'smtp.123.com';
       $message->SMTPAuth = true;    
       $message->Username = '[email protected]';                            
       $message->Password = 'yourpassword';   
       $message->setFrom('[email protected]', 'yourname');
       $message->setTo($model->aEmail);
       if (  $message->send())
     {
        $this->render ('removeuser');
     }
}

Мой actionConfirm() в UserController:

    public function actionConfirm ()
{   
   $model = User::model()->findByAttributes(array('aHash' => $_GET['aHash']));
    if ($model === null)
        throw new CHttpException(404, 'Not found');
    else
        {
        $this->loadModel($model->aUserID)->delete();
        $model->save();
        $this->render('afterdelete');
        }
}
person BeeCoding    schedule 24.04.2014

person    schedule
comment
Хорошо, позвольте мне попробовать. Большое спасибо! - person BeeCoding; 22.04.2014
comment
еще одна информация по этому сценарию: не делайте аппаратное удаление, попробуйте мягкое удаление. вы отправляете какое-то подтверждение. В некоторой степени пользователь сообщает, что не вызывается первоначальным пользователем. Вы не можете восстановить удаленную запись. Лучшей практикой является мягкое удаление. Добавьте статус столбца в пользовательскую таблицу. Вы просто меняете статус флага. Это полезно для ваших будущих аспектов - person Babu; 22.04.2014
comment
Да, таким образом, когда пользователь запрашивает удаление, ему отправляется электронное письмо с подтверждением, однако я должен сделать это таким образом, чтобы удаление не выполнялось до подтверждения по электронной почте, как предварительное условие, если вы знаете, что Я имею в виду? - person BeeCoding; 23.04.2014
comment
Я уже спрашиваю вас раньше. Потому что подтверждающая почта бесполезна перед удалением. Это будет обрабатываться отдельно на контроллере. Нужна проверка от пользователя, после этого подтверждения вам нужно удалить записи из БД. Это правильный путь. Надеюсь, вы хорошо. Это поможет вам в будущем - person Babu; 23.04.2014
comment
Да, вы правы. Мне не нужна функция beforeDelete(). Я реализовал отправку электронной почты в actionDelete в контроллере и удаление пользователя в actionVerify (после того, как пользователь подтвердит удаление по электронной почте). Спасибо. - person BeeCoding; 23.04.2014
comment
Может быть, вы знаете, как я могу получить объем памяти, используемый некоторым приложением yii? - person BeeCoding; 23.04.2014
comment
Вы можете проверить использование памяти с помощью yii. см. здесь - person Babu; 23.04.2014
comment
Райан, спасибо за ваши рекомендации, они привели меня в правильном направлении. - person BeeCoding; 24.04.2014