2013-07-31 116 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