2013-07-31 72 views
1

首先,我是CodeIgniter和MVC的新成员。codeigniter CMS表单验证

我正在创建一个CMS,并且不会决定采用哪条路线,我有两个应用程序(前端/ CMS),或者只是将管理员创建为控制器。我选择了一个应用程序并通过Controller创建管理员。

这样做我已经遇到了表单验证的问题,如果它不验证我不能加载表单我必须重定向,这意味着它不会重新填充未验证的字段。我在第三个URI段中使用变量来确定是否显示插入新记录的表单,用于编辑记录的填充表单或所有记录的表格列表。

表单发送到/管理/视频/保存

function videos() 
{ 
    if (!$this->tank_auth->is_logged_in()) { 
     redirect('/auth/login/'); 
    } else { 

     $this->load->model('videos_model'); 

     $data['section'] = "Videos"; 
     $data['area'] = "Videos"; 
     $data['mode'] = $this->uri->segment(3, 'create'); 
     $data['user_id'] = $this->tank_auth->get_user_id(); 
     $data['username'] = $this->tank_auth->get_username(); 

     if ($data['mode'] == 'edit') { 

      $data['ID']  = $this->uri->segment(4); 
      $data['videos'] = $this->videos_model->get_videos($data['ID']); 

     } elseif ($data['mode'] == 'list') { 

      if ($this->uri->segment(4)) { 
       $data['filter'] = $this->uri->segment(4); 

       $data['videos'] = $this->videos_model->get_filtered_videos($data['filter']); 
      } else { 
       $data['videos'] = $this->videos_model->get_filtered_videos(); 
      } 
     } elseif ($data['mode'] == 'save') { 
      $this->load->helper('form'); 
      $this->load->library('form_validation'); 

      $this->form_validation->set_rules('videoTitle', 'Title', 'required'); 
      $this->form_validation->set_rules('Code', 'Youtube Code', 'required'); 

      if ($this->form_validation->run() === FALSE) { 
       redirect('/admin/videos'); 
      } else { 
       $this->videos_model->set_videos(); 
       redirect('/admin/videos/list'); 
      } 
     } 

     if ($data['mode'] != "create" && empty($data['videos'])) { 
      show_404(); 
     } 



     $this->load->view('admin/templates/head', $data); 
     $this->load->view('admin/templates/body_navbar', $data); 
     $this->load->view('admin/videos', $data); 
     $this->load->view('admin/templates/footer', $data); 
    } 
} 

我是不是设置有关这个错误的方式,我应该用两个应用程序文件夹或有/ 3个控制器,用于编辑/插入观看所有。或者有我的当前设置的解决方案?

回答

0

我继续用我的一个应用程序文件夹和整个管理作为控制器。

我已经解决了我的表单验证和重新填充问题,方法是继续重定向回表单,但将表单字段和错误存储在会话中。

我摧毁了一次查看的会话中的错误数据,但保持其他信息完好无损,允许用户导航回来,信息将保持不变。一旦表格被正确验证并且存储在数据库中的信息将破坏会话数据。

function videos() 
{ 
    if (!$this->tank_auth->is_logged_in()) { 
     redirect('/auth/login/'); 
    } else { 

     $this->load->model('videos_model'); 

     $data['section'] = "Videos"; 
     $data['area'] = "Videos"; 
     $data['mode'] = $this->uri->segment(3, 'create'); 
     $data['user_id'] = $this->tank_auth->get_user_id(); 
     $data['username'] = $this->tank_auth->get_username(); 

     if ($this->session->userdata('videoTitle')) 
      $data['videoTitle'] = $this->session->userdata('videoTitle'); 
     if ($this->session->userdata('Code')) 
      $data['Code'] = $this->session->userdata('Code'); 
     if ($this->session->userdata('videoTitle')) 
      $data['description'] = $this->session->userdata('description'); 
     if ($this->session->userdata('errors')){ 
      $data['errors'] = $this->session->userdata('errors'); 
      $this->session->unset_userdata('errors'); 
     } 

     if ($data['mode'] == 'edit') { 

      $data['ID']  = $this->uri->segment(4); 
      $video_data = $this->videos_model->get_videos($data['ID']); 
      $data['videoTitle'] = $video_data['videoTitle']; 
      $data['Code'] = $video_data['blipCode']; 
      $data['description'] = $video_data['description']; 

     } elseif ($data['mode'] == 'list') { 

      if ($this->uri->segment(4)) { 
       $data['filter'] = $this->uri->segment(4); 

       $data['videos'] = $this->videos_model->get_filtered_videos($data['filter']); 
      } else { 
       $data['videos'] = $this->videos_model->get_filtered_videos(); 
      } 
     } elseif ($data['mode'] == 'save') { 
      $this->load->helper('form'); 
      $this->load->library('form_validation'); 

      $this->form_validation->set_rules('videoTitle', 'Title', 'required'); 
      $this->form_validation->set_rules('Code', 'Youtube Code', 'required'); 


      if ($this->form_validation->run() === FALSE) { 
       $formdata = array(
        'videoTitle' => $this->input->post('videoTitle'), 
        'Code' => $this->input->post('Code'), 
        'description' => $this->input->post('description'), 
        'errors' => validation_errors() 
       ); 
       $this->session->set_userdata($formdata); 
       redirect('/admin/videos'); 
      } else { 
       $this->videos_model->set_videos(); 
       $this->session->unset_userdata('videoTitle'); 
       $this->session->unset_userdata('Code'); 
       $this->session->unset_userdata('description'); 
       redirect('/admin/videos/list'); 
      } 
     } 

     $this->load->view('admin/templates/head', $data); 
     $this->load->view('admin/templates/body_navbar', $data); 
     $this->load->view('admin/videos', $data); 
     $this->load->view('admin/templates/footer', $data); 
    } 
} 
0

我个人还没有使用过CodeIgniter的表单助手和验证库,所以请原谅我的无知,但是有没有什么特别的理由让你没有这样做,因为AJAX的帖子呢?

我是设置有关这个错误的方式,我应该用两个应用 文件夹或有3个控制器,用于编辑/插入/查看所有。或者是 那里有解决我目前的设置?

为什么3个控制器?您可以拥有一个具有多种功能的控制器。老实说,我建议只在表单上做一个简单的AJAX帖子,并返回一些JSON数据,无论验证是否通过 - 无需重定向。

喜欢的东西:

// AJAX

function validateForm() { 
    $.post('route/to/controller', {"apple": appleValue, "peach": peachValue}, function(data) { 

    json = $.parseJSON(data); 

     if (json.success) 
      alert('Great!'); 
     else 
      alert('Nope!'); 
}); 

//控制器

function validateForm() 
{ 
    $data['success'] = ...validation checks... 

    echo json_encode($data); 
} 
+0

一旦表单处理完毕,它将把它们带到所有记录的列表视图中,并将它们插入顶部。由于这涉及一个页面加载和codeigniter进行表单验证,我没有看到需要使用Ajax使其复杂化。感谢您的建议。你说没有必要使用三个控制器,那么我如何设置控制器将如何完成? – Philwn

+1

采取了点。如果你愿意的话,你可能有3个控制器,但我只想指出它不是必需的。我将创建一个名为admin的单个控制器,并在其中创建3个(或多个你需要的)函数,videoView(),videoEdit()和videoSave()。例如,我将我的控制器建立在每节模型上;仪表板,管理员,帖子,帐户等,但您可以随心所欲。 – snh