0

レビューフォームを作成する必要があります。2つのモデルと2つのコントローラーがあります–「Products」hasMany「Reviews」の関係を持つ製品とレビュー、レビューフォームは現在の製品ページに表示され(Productsコントローラー、「view」アクション)、このフォームは別のコントローラーを使用します(レビュー)。

また、検証エラーが表示されているこのフォームの検証が必要です。

私のProductscontrollerview.ctpには、次のものがあります。

// product page stuff...

echo $this->Form->create($model = 'Review', array('url' => '/reviews/add'));
echo $this->Form->input('name', array('label' => 'Your name:'));
echo $this->Form->input('email', array('label' => 'Your e-mail:'));
echo $this->Form->input('message', array('rows' => '6', 'label' => 'Your message:'));
echo $this->Form->hidden('product_id', array('default' => $product['Product']['id']));
echo $this->Form->end('Send');

echo $this->Session->flash();

ReviewsController->追加:

public function add() {
if ($this->request->is('post')) {
    $this->Review->save($this->request->data); 
    $this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
    }
}

どういうわけか、この恐ろしいコードは機能します。保存を確認しますが、検証エラーは表示されません。

このアクションにIfステートメントを追加した場合:

ReviewsController->追加:

public function add() {
if ($this->request->is('post')) {
    if ( $this->Review->save($this->request->data) ){ 
    $this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
    }}
}

フォームにエラーがあり、検証されなかった場合、MissingViewエラーが発生します:Missing View

Error: The view for ReviewsController::add() was not found.

私の質問は、この状況に適切に対処して、必要な機能を実現する方法です。リクエストアクションで要素を使用する必要がありますか、それともProductsControllerにレビューを追加するためにアクションを移動する必要がありますか?

4

2 に答える 2

2

問題の 1 つは、保存が成功した場合にのみリダイレクトを実行しているため、失敗した場合は Review/add.ctp がないため、ビューが見つからないというエラーが発生することです。保存が機能しているかどうかに関係なく、リダイレクトを実行して、常に製品ページに戻るようにする必要があります。

フィールドでエラーが発生しない理由は、リダイレクトを行っているためであり、エラーが失われます。アクションの別のパラメーターとしてエラーを製品コントローラーに渡すことができます。

レビューコントローラー

public function add() {
    if (!empty($this->request->data)) {
        $errors = null;
        if (!$this->Review->save($this->request->data)) {
            $errors = $this->Review->validationErrors;
        }
        // Always redirect
        $this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], 'errors' => $errors, '#' => 'reviews'));
    }
}

製品コントローラ

public function view($product_id, $errors = null) {
    if (!empty($errors)) {
        $this->Review->validationErrors = $errors;
    }
}

もちろん、すべてのコードがどのように見えるかはわかりません。これはテストされていませんが、レビューモデルの検証エラーを製品コントローラーに渡し、製品ページで再度レビューモデルに手動で割り当てるという考えです。 .

于 2012-11-22T17:14:26.303 に答える
0

add.ctpレビュー用のビューが作成されていないようです。

特別なことをする予定がなければ、条件を追加しても意味がありません。ユーザーが常に製品ビューに戻ることを望んでいますか? 検証するかどうかは問題ではありません。

条件を使用して検証されない場合、コントローラーは製品コントローラーのビュー アクションにリダイレクトせず、デフォルトで add.ctp ビューをロードします。

リダイレクトを使用してフォームに戻るだけです。

最初の追加アクションを使用します。正しいです。必要に応じて、エラー メッセージを追加できます。

public function add() {
if ($this->request->is('post')) {
    if(!$this->Review->save($this->request->data)({ 
        $this->Session->setFlash(__('There was a problem adding the product. Please try again.'));
    }
    $this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
}

リダイレクトが常に存在することに注意してください。

アクションのデフォルト ビューの代わりに「リダイレクト」を使用しているため、各入力に赤いエラー ボックスが表示されない場合があります。とにかくよくわかりません。

于 2012-11-22T14:03:04.913 に答える