在检查CodeIgniter中的发布值之前,请检查是否设置了参数

i34xakig  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(108)

我正在CodeIgniter上写博客。
博客的一个重要方面是帖子的创建和更新。
我想重新使用我用来创建帖子的视图来更新它。
为此,我想将post数据传递给表单。
发生验证错误时,表单应该显示传递给它的数据,而不是参数数据。
所以我想把数据传递给表单,但是在发布之后,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冲突。我不太确定是否可以将数据发布到表单中,以及会有什么后果。

kiayqfof

kiayqfof1#

解决这个问题的一种方法是在加载视图之前用值填充$_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()被设计为在POST操作后“重建”表单,在该操作中提交不满足某些要求(通常是空的/错误的字段)。在这种情况下,为了对用户友好,我们希望将字段值设置为刚刚提交的“旧”字段值。为了做到这一点,函数在$_POST中查找以检索字段的这些值(假设您以通常的方式使用它)。
(With关于性能:我所建议的任何开销都是非常微不足道的,并且由于操作是网络事务的一部分,因此任何影响都不太可能在实践中被测量。)

voj3qocg

voj3qocg2#

虽然你可以将$_POST的每个值都设置为合适的值,但是如果你没有使用其中的一些变量,你可能会产生额外的开销。一个更有效的方法是:

$_POST['category'] = (isset($_POST['category'])?"my_catehory":"default_category");

现在请记住,如果要访问总共60个变量中的20个、30个等,则填充整个$_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*/
9bfwbjaz

9bfwbjaz3#

这就是我在发生验证错误时用来保存的,表单显示传递给它的数据,而不是参数数据。在set_value()方法中设置发布的值。

echo form_input('title', set_value('title', this->input->post('title') );
jjhzyzn0

jjhzyzn04#

我做了和你一样的事情,使用了提交和编辑视图,这就是我解决它的方法。

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将为空,因此如果它不是一个post请求(即表单提交还没有失败),它将首先尝试从POST中获取它;则给予一个空字符串。
否则,它将尝试从$person中获取属性'name',因此$person-〉name

EDIT:所有这些函数都在我为表单操作创建的帮助器中

eeq64g8w

eeq64g8w5#

您只能使用以下命令:

if($this->input->post('post_value_name')){
     // code here. ...
}

就是这样。

相关问题