2013-10-28 3 views
0

Хотелось бы помочь. У меня есть страница с полным сообщением, а ниже - небольшая форма для добавления комментариев. Ури страницы сообщения: site/posts/1, поэтому он находится в контроллере сообщений, а действие формы - form_open(site_url('comments/add/'.$post->post_id)).CodeIgniter - добавление комментариев к сообщению

Это моя функция 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); не дает подтверждения для проверки ошибок проверки в моем представлении сообщения, иначе вставьте комментарий и перенаправьте на ту же страницу (сайт/сообщения/1).

Проблема в том, что когда я нажимаю submit, действие формы идет в комментариях/добавлении/1, как и ожидалось, но не делает ничего подобного выше.

Любые идеи, как я могу исправить это?

EDIT Я сделал небольшое изменение кода без «запутывающей» функции 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; 
} 
+0

где ваша 'функция validate()'? –

+0

Да, эта функция выполняет проверку. Он находится внутри MY_Model. Смотрите: https://github.com/jamierumbelow/codeigniter-base-model/blob/master/core/MY_Model.php – Lykos

+0

Когда вы отправляете форму, она заходила в 'if ($ this-> form_validation-> run() == true) {...} 'statement? – anvoz

ответ

0

Вам нужно далеко прохождения validation_errors() обратно в Posts контроллера. В тот момент, когда вы выполняете перенаправление в своей add (когда проверка не выполняется), вы теряете ошибки проверки.

Я бы рассмотреть вопрос об использовании flashdata (http://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; 

Может быть, не идеально, но надеюсь, что это поможет ...

+0

Правда!При перенаправлении validation_errors() теряются, поэтому я думаю, что лучший способ - сохранить их в session flashdata и вернуть их обратно. Однако, если есть другой лучший способ, я был бы благодарен, если вы или кто-то другой опубликуете его. Благодаря! – Lykos

+0

Как я могу сохранить значения столбца для каждого поля, если проверка не выполнена? Могу ли я также использовать (с ошибками проверки) что-то вроде этого: $ this-> session-> flashdata ('post_values', $ this-> input-> post()) ?? – Lykos

+0

Да. Именно это !! Таким образом, вы получите ответы на любые возникшие ошибки, а также данные POST. Опять ... может быть не идеально, но делает работу !! –

 Смежные вопросы

  • Нет связанных вопросов^_^