2

検証エラーが表示されないことについてのフォーラムをたくさん見て、さまざまなことを試しましたが、役に立ちませんでした...

基本的に、検証では、フィールドに値がないことを正しく認識しますが、エラーメッセージは入力ボックスの下に「自動的に」表示されません。

モデル検証ルールを以下に示します。

var $validate = array(
    'description' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a description of the change'
    )
);

echo pr($ this-> data); 出力を以下に示します。

Array
(
[Change] => Array
    (
        [0] => Array
            (
                [id] => 3237
                [cn_id] => 5132
                [req_id] => 25
                [description] => 
            )

        [1] => Array
            (
                [id] => 3238
                [cn_id] => 5132
                [req_id] => 22
                [description] => 
            )

        [2] => Array
            (
                [id] => 3239
                [cn_id] => 5132
                [req_id] => 4
                [description] => 
            )

    )

)。

echo pr($ this-> Change-> invalidFields()); 出力を以下に示します。

Array
(
[0] => Array
    (
        [description] => Please enter a description of the change
    )

[1] => Array
    (
        [description] => Please enter a description of the change
    )

[2] => Array
    (
        [description] => Please enter a description of the change
    )

[description] => Please enter a description of the change
)

つまり、表示用のエラーメッセージが生成されていますが、実際にはビューに表示されません。理由がわかりません。

'view'コードからの抜粋を以下に示します。

<?php echo $form->input('Change.'.$i.'.description', 
array('value' => $cn['Change'][$i]['description'],
    'label' => $engReq['Req']['description'])); ?>  

エラーメッセージが表示されない理由を誰かが知っていますか?

4

2 に答える 2

1

私はhasManyモデル(フォームに数値でインデックスが付けられたフィールドがある)で同じ問題を経験し、私のために働く検証ソリューションを思いつきました。

クイックアンサー:実際にデータを保存する前に、次のようにデータを個別に検証しました('validate' =>'only'に注意してください):

if($this->ModelName->saveAll($this->data, array('validate' => 'only'))) {
  // proceed to save...
}

このようにすると、検証に失敗した入力フィールドのすぐ下に、モデルの検証エラーメッセージがフォームに表示されました(検証エラーを表示する通常のCakeの方法)。


注: saveAll()を使用して実際にデータを保存することはできませんでした(理由はすぐに説明します)。saveAll()を使用して実際にデータを保存できれば、(notice'validate' =>'first')を使用して保存したのと同時に検証を取得できたはずです。

if($this->ModelName->saveAll($this->data, array('validate' => 'first'))) 

ただし、トランザクションを使用して一度に複数のモデルを保存する必要があり、一部のモデルが他のモデルに直接関連していないため、saveAll()を使用して実際にデータを保存することはできませんでした。saveAll()は、呼び出されたモデルと、それに直接関連するモデルのみを保存します。Cakeは現在ネストされたトランザクションをサポートしておらず、saveAll()は1つのトランザクションを自動的に使用するため、モデルでsave()を使用し、トランザクションを手動で開始および終了する必要がありました。ただし、これにより、 "$ this-> ModelName-> save($ this-> data、array('validate' =>'first'を使用して保存した場合でも、hasManyアイテムのフォームの検証メッセージが失われました。 )」。


詳細な説明:この問題は、フォームで数値インデックス付きフィールドを使用することに関連しているようです。例えば:

$this->Form->input("ModelName.0.field_name");

このインデックス付けスキームは、フォーム内のhasManyアイテムを処理する適切な方法のようですが、検証メッセージはこのフォーム入力への道を見つけることができません。私のビューが実際に検証エラーにアクセスしたことに気付くのは興味深いことです。これは、次を使用してビューで確認できます(これらの行に数値インデックスがないことに注意してください)。

if($this->Form->isFieldError("ModelName.field_name")) {
  echo $this->Form->error("ModelName.field_name");
}

'$ this-> Form-> input( "ModelName.0.field_name")'の後にこれらの行を配置すると、入力フィールドと同じdivではなく、検証メッセージがページに挿入されました(したがって、挿入されませんでした)。理想的に見える)。

'$ this-> Form-> input( "ModelName.0.field_name")'でその検証メッセージを使用するようにCakeに指示する方法がわかりませんでした。そのため、前述の「validate」=>「only」メソッドを使用しました。これは私にとってはうまく機能しています。

于 2011-08-09T17:22:00.800 に答える
0

すべきではない

var $validate = array(
  'description' => array(
    'notEmpty' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a description of the change'
    )
  )
);

于 2011-06-10T15:33:55.843 に答える