2012-07-24 11 views
9

私はCodeigniterのCMSで作業しており、1つの主要な部分は投稿の作成と編集のためのフォームです。Codeigniter:投稿の追加と編集のための1つのビュー

私はすべての要素が共有されているので、両方のビューファイルを同じにすることを計画しています。唯一の違いは、フォームが作成時に空白になり、編集時にフォームに入力されることです。これは正しい方法ですか?

私はそれぞれのためにメソッドを持つことを考えていましたので、投稿/作成し、投稿/編集($ 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が提供されているかどうかを示す3者演算子を使用し、<input>値を入力します。そうでない場合は、codeigniter set_value()ヘルパー検証値を入力します。

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

投稿を編集して偽のフォーム検証を返したときはうまくいきません。 – Hossein

+0

' "/>' – Hossein

2

私は通常、いくつかの変数を含む1つのビューを使用します。フィールドの値は、サーバーからのデータから設定することも、空白のままにすることもできます。データが提供されているかどうかに応じて、フォームが追加または編集される可能性があるため、フォームが使用するアクションを変更します。

それは再利用のアイデアを使用していますので、これは最も効率的な方法でなければなりません:)

簡単な例

<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

私はCodeIgniterの(CakePHPの時より良い)でなく、中のプロではありませんよMVCの中心は、1つのアクションが1つのビューを持つということです。

1つのビューに表示する理由はありません。 :)

+1

で生成された足場コードには、2つの異なる名前のビューがありますが、内部的には同じフォームを含む部分が使用されます。 これはDont Repeat Yourself(DRY)原則です。ビューの追加と編集を見ると、かなり複雑なコードが複写されていることがわかります。 –

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値へのパスが必要です。存在しない場合、つまり投稿していない場合は、2番目のパラメータの値が表示されます。

コードを掘り出すことができれば、投稿します。

関連する問題