1

CakePHP 2.x で Model::saveAssociated() を使用して hasMany アソシエーションの検証エラーを表示する最も簡単な方法は何ですか?

以下は、CakePHP クックブックの例です。( http://book.cakephp.org/2.0/en/models/saving-your-data.html# Saving-related-model-data-hasone-hasmany-belongsto )

echo $this->Form->create('Company', array('action' => 'add'));
echo $this->Form->input('Company.name', array('label' => 'Company name'));
echo $this->Form->input('Company.description');
echo $this->Form->input('Company.location');

echo $this->Form->input('Account.0.name', array('label' => 'Account name'));
echo $this->Form->input('Account.0.username');
echo $this->Form->input('Account.0.email');

echo $this->Form->end('Add');

たとえば、Account.0.email の検証が失敗した場合、フォーム フィールドは自動的に無効化されないように見えます。エラーは $this->Company->Account->validationErrors にリストされていますが。

適切なフィールドを自動的に無効にして、対応する検証エラーを表示する方法はありますか?

4

1 に答える 1

0

100% 自動化されているわけではありませんが、CakePHP が提供するものを組み合わせることもできます。

まず、最新の 2.4 を使用していると仮定しています。

私が提供するソリューションには 2 つの部分があります。

a)コントローラーレベルでデータを検証します

b) ビュー レベルの FormHelper でエラー メッセージを特定します。

部分 a) の場合

このリンクを参照できますhttp://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html#validating-data-from-the-controller

そのリンクに基づいて、2つの方法を提案します。

1) 各モデル データを個別に検証できます。

例、

if ($this->Company->validates(array('fieldList' => array('name', 'location')))) {
    // valid
} else {
    // invalid
}

そして、あなたは

if ($this->Account->validates(array('fieldList' => array('email')))) {
    // valid
} else {
    // invalid
}

hasMany を使用しているため、アカウント データの異なるセットを個別に検証する必要がある可能性があります。

したがって、ループを使用する可能性が高いため、使用できます。

ループで検証していて、エラーの各セットを個別に取得したい場合は、invalidFields() を使用しないでください。代わりに validates() を使用して、validationErrors モデル プロパティにアクセスします。

2)2番目の方法はこれを使用することです

if ($this->Company->saveAll($this->request->data, array('validate' => 'only'))) {
  // validates
} else {
  // does not validate
}

これは、私が提供したリンクの下部にあります。

パート b) については、FormHelper でエラーを表示します。

http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::errorを読むことができます

于 2013-10-09T01:26:27.613 に答える