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)に表示したい場合は、「Model.check_out_reason」ではなく「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 に答える