我发现我在CakePHP控制器中的编辑操作很快变得混乱,我想将大部分废话拉入模型中。让我给你一个场景。
我的用户控制器中有用户/编辑操作。我想让用户在我的表单中重置密码(或不重置密码)。如果他们提供了新密码,那么我使用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'));
}
}
答案 0 :(得分:2)
更优雅的风格是
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.
}
}