Переопределить Model :: save () или реализовать до / после событий?Как мне откармливать торт? - PullRequest
1 голос
/ 06 сентября 2010

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

У меня есть действие users / edit в моем контроллере Users.Я хочу разрешить пользователям сбрасывать пароль (или не сбрасывать пароль) в моей форме.Если они предоставляют новый пароль, тогда я передаю три поля пароля в save (), используя параметр списка полей save ().Если они не предоставляют эти поля, я не хочу передавать эти поля в списке полей.

Код для проверки этих полей в настоящее время находится в моем контроллере, что было бы хорошим способом перенести это в модель?

Вот как выглядит действие редактирования моего контроллера:

function edit($id = null) {
    if ($this->Session->check('Auth.User') && $this->Session->read('Auth.User.id') == $id) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash('Invalid Account','default',array('class'=>'flash_error'));
            $this->redirect(array('controller'=>'directories', 'action' => 'index'));
        }
        if (!empty($this->data)) {
            // take out the following and an error occurs in parentNode()
            $this->data['User']['group_id'] = 2;
            if (empty($this->data['User']['old_password'])) {   //TODO: pass in a field list for every publicly available save() call.
                //dont update the password fields if they aren't passing in the old password
                if ($this->User->save($this->data,true,array('first_name', 'last_name', 'email', 'username'))) {
                    $this->Session->setFlash('Your changes have been saved','default',array('class'=>'flash_ok'));
                    $this->redirect(array('controller'=>'directories','action'=>'index'));
                } else {
                    $this->Session->setFlash('Your changes could not be saved. Please, try again.','default',array('class'=>'flash_error'));
                }                   
            } else {
                //update the passwords
                if ($this->User->save($this->data,true,array('first_name', 'last_name', 'email', 'username', 'password', 'password_confirm', 'old_password'))) {
                    $this->Session->setFlash('Your changes have been saved','default',array('class'=>'flash_ok'));
                    $this->redirect(array('controller'=>'directories','action'=>'index'));
                } else {
                    $this->Session->setFlash('Your changes could not be saved. Please, try again.','default',array('class'=>'flash_error'));
                }
            }
        }
        if (empty($this->data)) {
            $this->data = $this->User->read(array(
                'first_name', 'last_name', 'email', 'username'
            ), $id);
        }
        $this->set('user_id',$id);
        $this->set('current_subscription', $this->User->Subscription->currentSubscription($id));
    } else {
        //redirect to not authorized
        $this->Session->setFlash('Invalid Account','default',array('class'=>'flash_error'));
        $this->redirect(array('controller'=>'directories', 'action' => 'index'));
    }
}

1 Ответ

2 голосов
/ 06 сентября 2010

Более изящный стиль будет

function edit($id = null)
{
     if($id && $this->Modelname->isValidLoginUser($id) && $this->data)
     {
         $login_tag = $this->Modelname->resetPass($id,$this->data);
         switch($login_tag)
         {
             case 0: $this->Session->setFlash();$this->redirect();break;
             case 1: $this->Session->setFlash();$this->redirect();break;
             ....
         }
     }
     else
     {
         $this->Session->setFlash("missing arguments.");
     }
}

А функция Modelname->resetPass() в модели выглядит как

function resetPass($id,$data)
{
     $user = $this->findById($id);
     $oldpasswd = $user[modelname]['password'];
     $newpasswd = $data[modelname][passwd1];
     $confirmpasswd = $data[modelname][passwd2];
     if($newpasswd=="" || $confirmpasswd=="")
     {
        return 0;
     }
     if($newpasswd != confirmpasswd)
     {
        return 1;
     }
     ....//perhaps other invalid situations

     if($newpasswd == $oldpasswd)
     {
       $this->saveField("password",$newpasswd);
       return N; //N is an int meaning success.
     }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...