【问题标题】:Codeigniter: One view for adding and editing a postCodeigniter:用于添加和编辑帖子的一个视图
【发布时间】:2012-07-24 21:42:41
【问题描述】:

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

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

我正在考虑为每个方法设置一个方法,所以 post/create 和 post/edit($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 个视图吗?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    我使用部分 _form.php 由新的和编辑控制器操作共享。在这两个动作上我都有相同的验证,所以我将它们移到控制器构造函数中,然后对于每个输入,我只使用一个三元运算符来表示是否提供了现有值 $title 然后使用它填充 <input> 值,否则使用用于填充验证值的 codeigniter set_value() 助手。

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

    【讨论】:

    • 编辑post并返回错误的表单验证时不起作用。
    • &lt;input type="text" name="title" value="&lt;?= isset($title) ? set_value("title", $title) : set_value("title") ?&gt;" /&gt;
    【解决方案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>
    

    【讨论】:

      【解决方案3】:

      我不是 CodeIgniter 的专家(在 CakePHP 方面要好得多),但 MVC 的核心是一个动作有一个视图。

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

      【讨论】:

      • 在 ruby​​ on rails 中,在生成的脚手架代码中有两个不同命名的视图,但在内部它们使用包含相同表单的部分视图。这就是不要重复自己(DRY)原则。如果您查看添加和编辑视图,您会发现很多代码被重复,尤其是当它们变得更复杂时。
      【解决方案4】:

      这当然是可能的,因为我一直这样做。

      通常,我会:

      动作

      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 值的路径。如果它不存在,即你还没有发布,那么它只会显示第二个参数的值。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-29
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        相关资源
        最近更新 更多