我正在使用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次观看吗?
答案 0 :(得分: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"); ?>" />
答案 1 :(得分: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>
答案 2 :(得分:1)
我不是CodeIgniter的专家(在CakePHP上更好),但MVC的核心是一个动作有一个视图。
您没有理由将其放在一个视图中。 :)
答案 3 :(得分: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值的路径。如果它不存在,即你没有发布,那么它只会显示第二个参数的值。
如果我可以为你挖出代码,我会发布它。