在检查CodeIgniter中的post值之前检查参数是否已设置

时间:2014-06-23 00:32:44

标签: php forms codeigniter validation

我在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发生冲突。 我不太确定是否可以将数据发布到表单中以及后果是什么。

4 个答案:

答案 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

编辑:所有这些功能都在我为表单操作创建的帮助器中