0

助けてください。投稿全体と投稿の下にコメントを追加するための小さなフォームがある投稿ページがあります。投稿ページの uri は site/posts/1 なので、投稿コントローラーにあり、フォーム アクションはform_open(site_url('comments/add/'.$post->post_id))です。

これは、コメント コントローラー内の私の add() 関数です。

public function add($post_id){
    // if nothing posted redirect
    if (!$this->input->post()) {
        redirect(site_url());
    }

    // TODO: save comment in database
    $result = $this->comment_model->add($post_id);
    if ($result !== false) {
        redirect('posts/'.$post_id);
    }

    // TODO:load the view if required
}

これはコメントモデル内の add() 関数です

public function add($post_id){
    $post_data = array(
        'post_id' => $post_id, 
        'username'  => $this->input->post('username'),
        'email'     => $this->input->post('email'),
        'comment'   => $this->input->post('comment')
    );

    if ($this->validate($post_data)) {

        $this->db->insert('comments', $post_data);

        if ($this->db->affected_rows()) {
            return $this->db->insert_id();
        }
        return false;
    } else {
        return false;
    }
}

私がやろうとしているのは、 $result = $this->comment_model->add($post_id); の場合です。検証に失敗して投稿ビューに検証エラーが表示されます。それ以外の場合は、コメントを挿入して同じ投稿ページ (site/posts/1) にリダイレクトします。

問題は、フォームの送信を押したときに、期待どおりにコメント/追加/1にアクションが入ることですが、上記のことは何もしません。

どうすればこれを修正できますか??

編集 私は、「紛らわしい」validate()関数なしでコードに小さな変更を加えました。多分これはもっと役に立ちます。

コメント コントローラ:

 public function add($post_id){
    // if nothing posted redirect
    if (!$this->input->post()) {
        redirect(site_url());
    }

    // TODO: save comment in database
    $this->form_validation->set_rules($this->comment_model->rules);
  if ($this->form_validation->run() == true) {
    echo "Ok! TODO save the comment.";
   // $this->comment_model->add($post_id);
   // redirect('posts/'.$post_id);
  } else {
      echo "Validation Failed! TODO: show validation errors!";
  }

    // TODO:load the view if required
}

コメントモデル:

 public function add($post_id){
    $post_data = array(
        'post_id' => $post_id, 
        'username'  => $this->input->post('username'),
        'email'     => $this->input->post('email'),
        'comment'   => $this->input->post('comment')
    );

        $this->db->insert('comments', $post_data);

        if ($this->db->affected_rows()) {
            return $this->db->insert_id();
        }
        return false;
} 
4

1 に答える 1

0

validation_errors()コントローラーに戻す必要がありますPosts。関数でリダイレクトを実行するとadd(検証が失敗した場合)、スローされた検証エラーが失われます。

flashdatahttp://ellislab.com/codeigniter/user-guide/libraries/sessions.html)を使用して、コントローラーからコントローラーに成功/エラーメッセージをComments返すことを検討しますPosts。以下のようなもの:

コメント コントローラ:

public function add($post_id) {
    // if nothing posted redirect
    if (!$this->input->post()) {
        redirect(site_url());
    }

    // TODO: save comment in database
    $this->form_validation->set_rules($this->comment_model->rules);
    if ($this->form_validation->run() == true) {
        // Store the success message in flash data
        $this->session->set_flashdata('message', 'Ok! TODO save the comment.');
        // Redirect back to posts page
        redirect('posts/'.$post_id, 'refresh');
    } else {
        // Store the error message in flash data
        $this->session->set_flashdata('message', validation_errors());
        // Redirect back to posts page
        redirect('posts/'.$post_id, 'refresh');
    }
}

投稿コントローラー:

public function index($post_id) {
    $this->data['message'] = $this->session->flashdata('message');
    $this->load->view('posts', $this->data);
}

投稿ビュー:

echo $message;

完璧ではないかもしれませんが、お役に立てば幸いです...

于 2013-10-28T13:20:35.520 に答える