我在CodeIgniter中制作某种博客 博客的一个关键方面是创建和更新帖子。
我想重复使用我用来创建帖子的视图来更新它。
为此,我想将帖子数据传递给表单。
发生验证错误时,表单应显示传递给它的数据,而不是参数数据。
所以我想将数据传递给表单,但在发布后,set_value
方法必须覆盖参数。
到目前为止,我有这个表格来创建一个帖子 如前所述,我想调整此表单,以便我可以重复使用它来更新帖子。
<h2><?php echo $title; ?></h2>
<?php
echo form_open('posts/' . $function);
echo form_fieldset();
echo '<legend>' . $title . '</legend>';
echo form_hidden('id', (isset($id) ? $id : '0'));
echo form_input('title', set_value('title', 'Title'), 'size="50"');
echo '<input type="date" name="date" id="date" value="' .
form_prep(set_value('date', date('Y-m-d'))) .
'" />';
echo form_textarea('content', set_value('content', ''));
echo form_input('category', set_value('category', 'Category'), 'size="50"');
echo form_input('keywords', set_value('keywords', 'Keywords'), 'size="50"');
echo form_submit('submit', 'Submit');
echo '<input type="reset" name="clear" value="Clear" />';
echo form_fieldset_close();
echo form_close();
?>
$function
应该包含创建或更新。
$title
创建帖子或更新帖子,不会影响表单功能。
我已经为帖子ID添加了一个隐藏字段,用于更新帖子。
我想过使用发送到视图的参数并使用isset
检查它们是否存在,从而在创建或更新帖子之间产生差异。但这会与set_value
发生冲突。
我不太确定是否可以将数据发布到表单中以及后果是什么。
答案 0 :(得分:1)
解决此问题的一种方法是在加载视图之前用$_POST
数组填充值。
$_POST['title'] = $old_retrieved_title;
$_POST['content'] = $old_retrieved_content;
$_POST['category'] = $old_retrieved_category;
$_POST['keywords'] = $old_retrieved_keywords;
$this->load->view(...);
这将允许set_value()
查看先前从数据库中输入和检索的值(或其他)。 CodeIgniter函数set_value()
旨在重建&#34;重建&#34; POST操作后的表单,其中提交不符合某些要求(通常为空/错字段)。在这种情况下,为了对用户友好,希望将字段值设置为&#34; old&#34;刚刚提交的字段值。为了做到这一点,该函数在$_POST
中查找以检索字段的这些值(假设您以通常的方式使用它)。
(关于性能:我所建议的任何开销都是非常微不足道的,并且由于操作是网络交易的明显部分,因此在实践中任何影响都不太可能是可测量的。)
答案 1 :(得分:1)
虽然您可以将$ _POST的每个值设置为正确的值,但如果您不使用某些变量,则可能会产生开销。一种更有效的方式是:
$_POST['category'] = (isset($_POST['category'])?"my_catehory":"default_category");
现在请记住,如果您要访问总共60个变量中的二十个,三十个等,那么填充整个$_POST
变量会更有效。
将会话中的变量存储为合理的解决方案吗?它将消除不得不怀疑每次是否填充$_POST
的工作。
最后,如果你必须填充:
function populate_post_vars() {
$_POST['one'] = $old_retrieved_one;
$_POST['two'] = $old_retrieved_two;
if (!isset($POST['three']) $POST['three'] = '3';
// I think you get the idea.
}
populate_post_vars();
$this->load->view(...); /*Credit to @Dwayne Towell for some minor code hints*/
答案 2 :(得分:0)
这是我用于保持验证错误发生时,表单显示传递给它的数据,而不是参数数据。在set_value()方法中设置发布值。
echo form_input('title', set_value('title', this->input->post('title') );
答案 3 :(得分:0)
我做了和你一样的事情,并使用提交和编辑视图来做同样的事情,这就是我解决它的方法。
function get_value($backup, $post_name) {
$CI = &get_instance();
if ($CI->input->server('REQUEST_METHOD') === 'POST') {
return $CI->input->post($post_name);
}
if ($backup === null) {
return "";
}
return $backup;
}
并且
function get_value_from_object($object, $field, $post_name) {
$CI = &get_instance();
if ($CI->input->server('REQUEST_METHOD') === 'POST') {
return set_value($post_name);
}
if ($object === null) {
return "";
}
return $object->$field;
}
根据我使用的价值/论坛的类型,如果我的表单代表并反对,通常会使用后者。
如下所示: -
<input type="text name="persons_name" value="<?php echo get_value_from_object($person, 'name', 'person_name'); ?>">
在创建页面上,$ person将为null,因此它将首先尝试从POST中获取它,如果它不是一个帖子请求(I.E表单提交没有失败);然后它会返回一个空字符串。
否则它将尝试取名为&#39; name&#39;来自$ person,所以$ person-&gt; name
编辑:所有这些功能都在我为表单操作创建的帮助器中