1

我正在尝试检查用户尝试删除的记录是否有任何附加记录(在这种情况下是附加费用索赔的用户)。我可以使用 beforeDelete() 模型函数来做到这一点。但是,如果找到记录并且不允许删除,我想传回一条闪存消息,但我只是收到以下错误:

Fatal error: Call to a member function setFlash() on a non-object in...

这是我的代码:

public function beforeDelete($cascade  = false) {

    $count = $this->ExpenseClaim->find("count", array(
        'conditions' => array('ExpenseClaim.user_id' => $this->id)
    ));

    if ($count == 0) {
        return true;
    } else {
        $this->Session->setFlash('User cannot be deleted as they have ' . $count . 'number of expenses claims already in the system');
        return false;
    }

}

有人能指出我正确的方向吗?

提前致谢

4

3 回答 3

4

您应该在控制器上检查无法删除用户并从那里设置闪存消息。

如果无法删除用户,您将false在模型中返回,这很简单:User

if(!$this->User->delete($id){
     $this->Session->setFlash('User cannot be deleted');
}else{
    //....
}

如果您想向用户提供有关原因的更多详细信息,我建议您在User模型中创建一个函数来检查要删除的用户声明的数量。

这样,您可以在控制器中执行以下操作:

if($count = $this->User->getClaims($id)){
    $this->Session->setFlash('User cannot be deleted as they have ' . $count . 'number of expenses claims already in the system');
    $this->redirect(array('controller' => 'User', 'action' => 'index'));

}

在你的User模型中有这个:

public function getClaims($id){
    return $this->ExpenseClaim->find("count", array(
    'conditions' => array('ExpenseClaim.user_id' => $this->id)
));
}

虽然直接调用ExpenseClaim模型会更好。

于 2012-11-23T12:36:38.083 回答
3

在模型中设置来自 beforeDelete() 的 flash 消息

public function beforeDelete($cascade  = false) {
//count query
$count = $this->ExpenseClaim->find("count", array(
    'conditions' => array('ExpenseClaim.user_id' => $this->id)
));
//count checking
if ($count == 0) {
    return true;
} else {
    //custom flash message 
    SessionComponent::setFlash('User cannot be deleted as they have ' . $count . 'number of expenses claims already in the system');
    return false;
}

}
于 2013-07-25T08:38:30.987 回答
-1

@motsmanish 答案与最佳实践一致,因为它将防止删除的代码放在它所属的位置 - 在模型中,在 CakePHP 中,这属于 beforeDelete() 方法。为了增强这一点,您可以在尝试删除的控制器中的方法中引用 Session flash 消息:

//e.g. in UserController.php, within public function delete($id){...}

if(!$this->User->delete($id)) {
    if(!$this->Session->check('Message.flash')) {
        $this->Session->setFlash(__('The User could not be deleted'));
    }
} else {
//success stuff
}

这样做的目的是允许在 beforeDelete() 中设置的 flash 消息如果存在则持续存在,但如果由于其他原因删除失败,则提供不同的消息。

于 2014-08-26T13:46:02.687 回答