2011-10-21 2 views
0

私は、関連付けられたいくつかのレイヤーからいくつかのモデルから情報を収集するフォームを持っています。そのため、個々に個別に保存しなければならず、エラーが発生した場合は、エラーメッセージを表示できるようにビューに戻って報告する必要があります。シーケンシャルセーブのために、私は、すべてのエラーが正しく表示されていないと思うし、私はisFieldError()メソッドがエラーの存在をキャッチしていることを知っています。ビューからの無効なフィールドへのアクセス

エラーをチェックするためにビューレベルでこのデータにどのようにアクセスできますか? 3つのモデルすべてを検証して、すべてのエラーを同時に表示することができます。また、手動のデータ構造を作成してテストすることも避けてください。アクセス可能なネイティブのケーキの機能性/データはありますか?これは、従来のインスタンスでは使用できない完全なカスタムソリューションではありませんか?

# Controller snippet 
if($this->Proposal->Requestor->saveField('phone_number', $this->data['Requestor']['phone_number']) && $this->Proposal->Requestor->Building->saveAll($this->data)) { 
    # Save off the proposal and message record. 
    exit('saved'); 
}  
else { 
    $this->Session->setFlash('We can\'t send your quote just yet. Please correct the errors below.', null, null, 'error'); 
    # At this point, I may have 2 or more models with validation errors to display 
} 

# Snippet from an element loaded into the view 
# $model = Requestor, but the condition evaluates to false 
<?php if($this->Form->isFieldError($model . '.phone_number')): ?> 
    <?php echo $this->Form->error($model . '.phone_number') ?> 
<?php endif; ?> 

ありがとうございます。

答えて

0

これはオープンソースソフトウェアの魔法です。ソースコードを少し掘り下げてみると、最終的に$validationErrorsという名前のビュー変数から読み取ることがわかりました($this->Form->isFieldError)。私の独立したセーブを行うとき、私はちょうど私のコントローラのアクションで同じ名前でローカル変数に書き込み、それを手動で設定します。したがって、従来とは異なるプロセスが従来の結果にマッピングされ、ビューコードはカスタム構造を認識する必要はありません。

# Compile our validation errors from each separate 
$validationErrors = array(); 
if(!$this->Proposal->Requestor->validates(array('fieldList' => array_keys($this->data['Requestor'])))) { 
    $validationErrors['Requestor'] = $this->Proposal->Requestor->validationErrors; 
} 
if(!$this->Proposal->Requestor->Building->saveAll($this->data)) { 
    $validationErrors = Set::merge($validationErrors, $this->Proposal->Requestor->Building->validationErrors); 
} 

if(empty($validationErrors)) { 
    # TODO: perform any post-save actions 
} 
else { 
    # Write the complete list of validation errors to the view 
    $this->set(compact('validationErrors')); 
} 

これを行うより良い方法がある場合は、私に知らせてください。今のところ、少なくとも、これは正しいことをしているようです。