10

私は Codeigniter で CMS に取り組んでおり、主要な部分の 1 つは、投稿を作成および編集するためのフォームです。

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

それぞれのメソッドを考えていたので、post/create と post/edit($id) です。

ポストコントローラーの create メソッドには、次のようなすべてのフォームデータがあります (エラーの場合):

  $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つのビューだけを使用する必要がありますか?

4

4 に答える 4

7

_form.php新しいコントローラーアクションと編集コントローラーアクションで共有されるパーシャルを使用します。両方のアクションで同じ検証を行っているので、それらをコントローラーコンストラクターに移動し、入力ごとに、既存の値$titleが提供されているかどうかを示す3項演算子を使用し、それを使用して<input>値を入力します。それ以外の場合は、codeigniterset_value()ヘルパーを使用して入力します。検証値。

<input type="text" name="title" value="<?php echo isset($title) ? set_value("title", $title) : set_value("title"); ?>" />
于 2012-08-01T00:29:55.353 に答える
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>
于 2012-07-24T21:48:29.507 に答える
1

私は CodeIgniter のプロではありません (CakePHP の方がはるかに優れています) が、MVC の中心にあるのは、1 つのアクションに 1 つのビューがあるということです。

それを 1 つのビューに入れる理由はありません。:)

于 2012-07-24T21:49:26.220 に答える
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 番目のパラメーターの値が表示されます。

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

于 2012-07-25T08:24:46.633 に答える