2

私は次のような状況にあります。投稿hasManyコメント

コメントは投稿に属します

/ Views / Posts / viewに、コメント付きの投稿を表示します。また、投稿ごとにコメントフォームを表示する必要があります。したがって、ビューに要素add_comment.ctpを使用する必要があります(間違っている場合は訂正してください。ただし、この質問はこちらを参照してください)。

/Views/Posts/view.ctp:

// add comments
echo $this -> element('add_comment',array('post_id' => $entry['Post']['id']), array('cache' => array('config' => 'long')));

要素:

/**
 * Element for adding comments
 *
 */
echo $this -> Form -> create('Comment', array('url' => array(
        'controller' => 'comments',
        'action' => 'add',
        $post_id
    )));
?>
    <fieldset>
        <legend><?php echo 'Add Comment'; ?></legend>
    <?php
    echo $this -> Form -> input('author_name');
    echo $this -> Form -> input('author_email', array('type' => 'email required'));
    echo $this -> Form -> input('author_website');
    //echo $this->Form->input('date_published');
    echo $this -> Form -> input('text');
    //echo $this->Form->input('is_archived');
    ?>
    </fieldset>
<?php echo $this -> Form -> end(array('label' => 'Post!')); ?>

ご覧のとおり、フォームはCommentsControllerの追加アクションに送信されます。さて、大きな問題です。追加アクションは、検証結果などのデータを実際にフォームに戻すにはどうすればよいでしょうか。つまり、フォームデータも保持する必要があるため、誰かが無効なデータを入力した場合でも、そのデータは失われません。

通常、追加アクションは/ View / Comments / addをレンダリングしますが、このビューは必要なく、定義もしていません。

これまで、コメントが保存された後、$this->redirectを使用して/Views/ Posts / viewに戻りましたが、リダイレクトは何も渡さずに/ Views / Posts/viewを呼び出すだけです。では、要素をスムーズで自動魔法のフォーム処理と組み合わせて使用​​するにはどうすればよいですか?

4

1 に答える 1

1

$this->invalidFields()送信後にリダイレクトすると、基本的に検証エラーなどをトリガーするものが失われると思います。これを回避する方法はいくつかあります...

1:フォームをリダイレクトしてビューに再度レンダリングできなかっcomments/add.ctpたため、フォームは検証エラーとともに自動的に表示されます。次に、プロセスをスムーズにするために、保存が成功して検証に合格したら、投稿にリダイレクトします(何らかの方法で投稿IDが必要です)。

2:コメント保存ロジックをコメントモデルに配置し、投稿ビューアクション(このアクションを指すようにフォームを更新)でコメントPOSTを確認し、そこで作成した保存関数を呼び出すこともできます$this->Post->Comment->saveMethodDefinedInModel($this->request->data['Post']);

3:または....オプション1を選択して、それをajaxと組み合わせることができますが、それはかなり厄介です。

于 2012-07-05T16:21:21.283 に答える