【问题标题】:Check if parameter is set before checking post value in CodeIgniter在检查 CodeIgniter 中的 post 值之前检查是否设置了参数
【发布时间】:2014-08-12 23:15:17
【问题描述】:

我正在 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 应该持有 create 或 update。
$title 是 Create post 或 Update post 并且不影响表单功能。
我已经为帖子 ID 添加了一个隐藏字段,在更新帖子时使用。

我想过使用发送到视图的参数并使用isset 来检查它们的存在,从而在创建或更新帖子之间产生差异。但这会与set_value 冲突。 我不太确定是否可以将数据发布到表单以及会产生什么后果。

【问题讨论】:

  • 能否请您解释一下,parameter data 是什么意思。 ?

标签: php forms codeigniter validation


【解决方案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() 旨在在提交不满足某些要求(通常为空/错误字段)的 POST 操作后“重建”表单。在这种情况下,为了对用户友好,希望将字段值设置为刚刚提交的“旧”字段值。为了做到这一点,该函数在$_POST 中查找以检索这些字段的值(假设您以通常的方式使用它)。

(关于性能:我所建议的任何开销都非常微不足道,并且由于操作是网络事务的明确部分,因此在实践中几乎不可能测量任何影响。)

【讨论】:

  • 因为你是第一个回答的,你可以帮我解决我在另一个答案中留下的问题
  • 我扩展了我的答案。
【解决方案2】:

虽然您可以将 $_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*/

【讨论】:

  • 我目前无法测试,所以我只是问你。如果我理解正确,在更新帖子时,我会获取所有详细信息并将它们放入 $_POST。加载视图将自动加载 $_POST 并使用当前正在使用的 set_value 在正确的字段中输入值?
  • 使用 set_value() 应该会得到您想要的结果。但是,请记住,框架有开销,调用越少越好(我认为这一事实经常被忽视)。如果您能想出任何巧妙的方法来填充 $_POST 而没有风险,我会去的。如果您仍然遇到问题,我将安装 Codeigniter 并为您编写一些工作代码。
  • @JakeGould -- 感谢您的编辑;我对 Stack Overflow 还是很陌生,并且尽我所能。谢谢。 -- 诡计
【解决方案3】:

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

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

【讨论】:

  • 你能写一个简短的解释为什么这可以解决问题吗?
【解决方案4】:

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

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 中获取它,如果它不是一个发布请求(即表单提交没有失败);然后它会返回一个空字符串。

否则它将尝试从 $person 中获取属性 'name',所以 $person->name

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

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2014-05-24
    • 1970-01-01
    • 2015-08-09
    • 2021-02-02
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多