2016-09-30 40 views
0

我第一次使用codeigniter。我習慣於MVC,但只有.net,而不是PHP。codeigniter - 關係表

所以,我有一個表'類別',一個表'國家',和一個表'類別 - 國家'。假設前兩個表只有'id'和'name',第三個有'country_id'和'category_id'。一個類別可以有多個國家分配給它。

我有模型,視圖和控制器都準備好創建和編輯類別。

對於編輯functionallity

型號:

function get_category_by_id($id) 
{ 
    $query = $this->db->get_where('categories',array('id'=>$id)); 
    if($query->num_rows()<=0) 
    { 
     echo 'Invalid category id';die; 
    } 
    else 
    { 
     return $query->row(); 
    } 
} 

查看:

<form class="form-horizontal" id="addcategory" action="<?php echo site_url('admin/category/updatecategory');?>" method="post"> 
    <input type="hidden" name="id" value="<?php echo $post->id;?>"/> 
    <div class="form-group"> 
     <label class="col-sm-3 col-md-3 control-label"><?php echo lang_key_admin('name');?>:</label> 
     <div class="col-sm-4 col-md-4 controls"> 
      <input type="text" name="name" value="<?php echo $post->name;?>" placeholder="<?php echo lang_key_admin('type_something');?>" class="form-control input-sm" > 
      <?php echo form_error('title'); ?> 
     </div> 
    </div> 
</form> 

控制器:

public function edit($id='') 
{ 
    $value['post'] = $this->category_model->get_category_by_id($id); 
    $data['title'] = lang_key_admin('edit_category'); 
    $data['content'] = load_admin_view('categories/editcategory_view',$value,TRUE); 
    load_admin_view('template/template_view',$data);   
} 

public function updatecategory() 
{ 
    $this->form_validation->set_rules('name', lang_key_admin('name'), 'required'); 

    if ($this->form_validation->run() == FALSE) 
    { 
     $id = $this->input->post('id'); 
     $this->editcategory($id); 
    } 
    else 
    { 
     $id = $this->input->post('id'); 

     $data     = array();   
     $data['name']   = $this->input->post('name');   

      $this->category_model->update_category($data,$id); 
      $this->session->set_flashdata('msg', '<div class="alert alert-success">'.lang_key_admin('data_updated').'</div>'); 

     redirect(site_url('admin/category/edit/'.$id));  
    } 
} 

現在我想爲該視圖添加一個選擇列表(多重選擇),以便我可以選擇要分配給該類別的哪些國家/地區,並將關係存儲在第三個表格中。我該怎麼做?我必須在列表中顯示所有國家,並能夠選擇我想要的。我也希望已經分配的國家在頁面加載時出現在列表中。

回答

1

我不會爲您編寫代碼,但會提供一些我希望對您有幫助的指導。

如果熟悉Codeigniter的Form Helper.,您的工作會更容易。特別是,要爲表單創建多選字段,請使用助手的form_multiselect()函數。

您將需要兩個模型函數來收集兩個結果集:一個獲取完整的國家列表,另一個獲取與您的第三個表中的特定類別匹配的國家/地區ID數組(我們將名稱命名爲crossref) 。第一個填充多選,第二個用於指示multiselect中當前選定的一組國家。

這些結果很容易傳遞給form_multiselect(),因爲任何表單控件的所有屬性(Bootstrap classes right?)都是如此。

處理從表單發佈的多選參數有幾種方法。這tutorial可能會有所幫助。 (向下滾動以進行多選討論。)解析所選國家後,將需要模型函數來插入或更新crossref

與回答您的問題無關,但我注意到您可能會考慮。您的模型使用echo,這可以說是從MVC最佳實踐中突破。一般來說,控制器應該是根據啓動的處理結果決定顯示的內容。所以你的模型可能應該這樣做,而不是調用echodie

function get_category_by_id($id) 
{ 
    $query = $this->db->get_where('categories',array('id'=>$id)); 
    return $query->num_rows() > 0) ? $query->row() : NULL; 
} 

如果沒有結果,這將返回NULL。然後,控制器必須檢查並作出反應模型的迴歸

public function edit($id='') 
{ 
    $category = $this->category_model->get_category_by_id($id); 
    if(isset($category)) 
    { 
     $value['post'] = $category; 
     $data['title'] = lang_key_admin('edit_category'); 
     $data['content'] = load_admin_view('categories/editcategory_view',$value,TRUE); 
     load_admin_view('template/template_view',$data); 
    } 
    else 
    { 
     //handle the error (an "error" view?) 
    } 
} 

不要使用電話時CodeIgniter的PHP函數exitdie

爲什麼?直到控制器完成執行後,框架纔會向瀏覽器輸出任何內容。調用其中任何一個函數都會使框架短路,並且在您的代碼中,echo 'Invalid category id';發送的消息將不會顯示。在控制器結束後,CI也會做一些其他的事情。

在開發期間使用exitdie可以,但不在生產站點中。

+0

感謝您的提示。他們向我展示了道路。我會盡快發佈解決方案 – Hahn86