2012-07-24 32 views
9

我正在開發Codeigniter中的CMS,一個主要部分是用於創建和編輯帖子的窗體。Codeigniter:用於添加和編輯帖子的一個視圖

我一直計劃使用相同的視圖文件,因爲所有的元素都是共享的。唯一的區別是創建時窗體是空白的,編輯時它是填充的。這是正確的路嗎?

我在想每個方法都有,所以post/create和post/edit($ id)。

在後控制器我有這樣的所有形式的數據(錯誤)的創建方法:

$this->data['item_title'] = array(
    'name' => 'item_title', 
    'id' => 'item_title', 
    'type' => 'text', 
    'value' => $this->form_validation->set_value('item_title'), 
); 

我想只是改變值保存數據庫值,而不是SET_VALUE的( ),所以像這樣:

public function edit($id) { 

$post_data = $this->post_model->get_post_data($id) 

     $this->data['item_title'] = array(
     'name' => 'item_title', 
     'id' => 'item_title', 
     'type' => 'text', 
     'value' => $post_data['post_title'], 
    ); 
} 

我在正確的軌道上還是有更好的方法來解決這個問題?我應該只使用2個視圖嗎?

回答

7

我使用由新的編輯控制器操作共享的部分_form.php。在這兩個行動我有相同的驗證,所以我將這些移動到控制器的構造函數,然後對於每個輸入,我只是使用三元運算符,說如果提供現有值$title然後填充<input>值使用它,否則使用codeigniter set_value()幫手填充驗證值。

<input type="text" name="title" value="<?php echo isset($title) ? set_value("title", $title) : set_value("title"); ?>" /> 
+0

編輯帖子並返回錯誤表單驗證時不起作用。 – Hossein 2015-06-23 09:32:15

+0

'」/>' – Hossein 2015-06-23 09:33:35

2

我通常使用一個視圖和一些變量。字段的值可以從服務器的數據中設置,也可以留空。根據是否提供數據,我更改表單將使用的操作,因爲它可能正在添加或編輯。

這應該是最有效的方法,因爲它使用的可重用性:)

一個簡單的例子的想法

<form action="<?php echo !$data ? "admin/add" : "admin/edit" ?> method="post"> 
    <input type="text name="test" value="<?php echo $data['test'] ? $data['test'] : "" ?>" /> 
</form> 
1

我不是在笨(在CakePHP的更好),但在親MVC的核心是一個動作有一個觀點。

你沒有理由把它放在一個視圖中。 :)

+1

ruby​​ on rails,腳手架代碼生成有兩個不同名稱的視圖,但內部它們使用一個包含相同形式的部分。 這是不要重複你自己(DRY)的原則。如果你看看添加和編輯視圖,你會發現很多代碼被複制,尤其是當它們變得更復雜時。 – 2017-12-14 16:52:24

0

這當然是可能的,因爲我一直這樣做。

通常情況下,我會:

行動

function edit($PageID = -1) 
{ 
    $Page = new stdClass(); 
    if($PageID === -1) 
    { 
     $Page->Title = $Page->Description = $Page->Keywords = ''; 
     $Page->PageID = -1; 
    } 
    else 
    { 
     $this->load->model('page_model'); 
     $Page = $this->page_model->GetByPageID($PageID); 
     if(empty($Page)) 
     { 
      show_404(); 
      return; 
     } 
    } 
    if($this->input->post('Save', true) !== false) 
    { 
     // perform validation 
     if($PageID === -1) 
     { 
      // insert 
     } 
     else 
     { 
      // update 
     } 
    } 
    $data = array 
    (
     'Page' => $Page 
    ); 
    $this->load->view('edit_page', $data); 
} 

查看

<?= form_open(); ?> 
    <fieldset> 
     <label for="title">Title: </label> 
     <input type="text" name="title" id="title" value="<?= Form::Get('title', $Page->Title); ?>" /> 
     <br /> 
     <label for="description">Description: </label> 
     <input type="text" name="description" id="description" value="<?= Form::Get('description', $Page->Description); ?>" /> 
     <br /> 
     <label for="keywords">Keywords: </label> 
     <input type="text" name="keywords" id="keywords" value="<?= Form::Get('keywords', $Page->Keywords); ?>" /> 
     <br /> 
     <input type="submit" name="Save" value="Save" /> 
    </fieldset> 
</form> 

編輯

對不起,我應該提到,Form::Get不是CodeIgniter函數,而是我創建的一個函數。簡而言之,它需要讀取您需要閱讀的Post值的路徑。如果它不存在,即你沒有發佈,那麼它將只顯示第二個參數的值。

如果我可以爲你挖出代碼,我會發布它。

相關問題