1

我试图通过控制器而不是模型中的条件使字段无效。

$this->Model->invalidate('check_out_reason', __('Please specify check out reason.', true));

以上不会使该字段无效。相反,我需要以下内容:

$this->Model->invalidate('Model.check_out_reason', __('Please specify check out reason.', true));

但是,如果我希望错误消息显示在“字段”本身($this->model->validationErrors),它需要是“check_out_reason”而不是“Model.check_out_reason”。这意味着,如果我希望使控制器中的输入无效,我无法在字段本身中显示错误消息。

我可以知道这是 CakePHP 中的错误吗?

4

2 回答 2

1

我找到了从控制器手动失效的解决方法。在这个问题上阅读了很多我发现 save() 函数没有考虑通过在控制器中调用的 invalidate() 函数设置的失效,但是(这非常重要)如果它是直接从模型函数调用 beforeValidate () 它运行良好。

所以我建议进入 AppModel.php 文件并创建下一个公共方法:

public $invalidatesFromController = array();

public function beforeValidate($options = array()) {
    foreach($this->invalidatesFromController as $item){
       $this->invalidate($item['fieldName'], $item['errorMessage'], true);
    }        
    return parent::beforeValidate($options);
}

public function invalidateField($fieldName, $errorMessage){
    $this->invalidatesFromController[] = array(
        'fieldName' => $fieldName,
        'errorMessage' => $errorMessage
    );
}

之后,确保您的模型的 beforeValidate() 函数调用了父模型的函数:

public function beforeValidate($options = array()) {
    return parent::beforeValidate($options);
}

在使字段无效的控制器中,使用下一行:

$this->MyModel->invalidateField('fieldName', "error message");

希望能帮助到你!对我来说,它的工作!

于 2013-01-22T13:34:13.807 回答
1

我创建了一个名为“Invoices”的测试控制器,仅用于测试,我开发了以下功能

public function index(){
            if (!empty($this->request->data)) {
                $this->Invoice->invalidate('nombre', __('Please specify check out reason.'));
                if ($this->Invoice->validates()) {
                // it validated logic
                        if($this->Invoice->save($this->request->data)){
                            # everthing ok
                        } else {
                            # not saved
                        }
                } else {
                    // didn't validate logic
                    $errors = $this->Invoice->validationErrors;

                }
            }
        }

我认为它对我有用 在此处输入图像描述

更改名为“check_out_reason”的字段的“nombre”字段,以使函数适应您的代码

于 2012-10-19T09:50:46.380 回答