10

我正在使用 Codeigniter 开发 CMS,其中一个主要部分是用于创建和编辑帖子的表单。

由于所有元素都是共享的,因此我一直计划对两者使用相同的视图文件。唯一的区别是表单在创建时是空白的,而在编辑时是填充的。这是正确的方法吗?

我正在考虑为每个方法设置一个方法,因此发布/创建和发布/编辑($id)。

在 post 控制器的 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提供了现有值,然后<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

我通常使用一个视图,其中包含一些变量。字段的值可以从服务器的数据中设置,也可以留空。根据是否提供数据,我会更改表单将使用的操作,因为它可能正在添加或编辑。

这应该是最有效的方法,因为它使用了可重用性的思想:)

一个简单的例子

<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 的核心是一个动作有一个视图。

你没有理由把它放在一个视图中。:)

于 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 值的路径。如果它不存在,即您还没有发布,那么它将简单地显示来自第二个参数的值。

如果我可以为您挖掘代码,我会发布它。

于 2012-07-25T08:24:46.633 回答