我应该使用 set_value() 在 CodeIgniter 中重新填充表单吗

Posted

技术标签:

【中文标题】我应该使用 set_value() 在 CodeIgniter 中重新填充表单吗【英文标题】:Should I use set_value() to repopulate a form in CodeIgniter 【发布时间】:2014-02-09 13:31:22 【问题描述】:

我的问题是我是否应该使用 set_value() 来重新填充表单。这么说可能看起来很奇怪,但是我正在创建一个共享控制器功能和视图,可用于添加新记录或编辑现有记录。这样做似乎很有意义,因为功能非常相似。

因此,如果我们调用现有记录进行编辑,我会这样做:

$data['fields'] = $this->customer_model->get_customer($id);

如果提交表单以保存记录,或者如果我们是第一次添加记录,如果用户出错,表单可能会重新加载,因此我填充 $data['fields'] this取而代之的是:

$data['fields'] = array(
    'company' => $this->input->post('company') ?: '',
    'website' => $this->input->post('website') ?: '',
    'credit_limit' => $this->input->post('credit_limit') ?: ''
);

我的表单元素如下所示:

<input type="text" name="company" value="<?php echo set_value('company', $fields['company']); ?>"  />

但我认为它可能看起来像这样:

<input type="text" name="company" value="<?php echo escape_html($fields['company']); ?>"  />

由于表单数据可能来自用户输入(添加或保存时)或来自数据库(检索要编辑的记录时),我不能完全依赖 post()set_value() 而没有第二个参数。此外,set_value() 的第二个参数将始终存在(在此示例中为$fields['company']),因为它是从一开始就初始化的,这就是我想直接使用它的原因。

这种方法有问题吗?

【问题讨论】:

我不认为这种方法有问题,我在我的大多数项目中都使用相同的方法......我也不知道是否有任何“规则”反对它...... . 使用 set_value() 表单辅助函数的唯一好处是 simplify setting the value 已经提交的值,以便重新显示它 就个人而言,我更喜欢使用表单助手 set_value(),因为您想使用相同的表单来添加新记录和编辑现有记录。另外,当提交的值仍然会通过服务器端的codeIgniter form_validation()预设规则传递时,使用escape_html()确实没有什么大的理由。 【参考方案1】:

是的,你应该这样做。

 set_value() is used to re-populate a form has failed validation. 
  There is no additional filtering on it,  so it faster.

 But, I prefer some times to use $this->input->post() for the secure.

【讨论】:

【参考方案2】:

该方法是正确的,如 CodeIgniter 文档中所述。实际上,您不需要在 set_value 中包含第二个参数。

set_value 定义:

string set_value(string $field = '', string $default = '')

//$field: If there is a submitted field with this name, its value is returned.
//$default: If there is no matching submitted field, this value is returned.

【讨论】:

【参考方案3】:

如果您想在表单验证返回 FALSE 时填充表单字段或插入数据以进行编辑操作,我建议您使用以下助手:

用法

<input type="text" name="last_name" value="<?=vset_value('last_name','',$rs);?>">

说明

$rs 这是用于记录的 $db 数据(如果您要发送它以查看)。为了安全起见,请在您的控制器中添加$this-&gt;data['rs'] = false;。如果 $rs 设置为真,助手会从中获取结果并显示它。否则它会显示密钥是否存在于$_POST 中。如果两者都不存在,则显示默认值。

助手

/**
 * vayes_helper::vset_value
 *
 * Retains state of INPUT text after Form Validation
 *
 * @access  public
 * @param string  name of INPUT tag
 * @param string  default value for INPUT tag
 * @param mixed   DB Result (array or object)
 * @return  string
 */
if(!function_exists('vset_value')) 
  function vset_value ($name_of_input,$default_state='',$db_result_array='') 
    $CI = &get_instance();
    $render_state = $default_state;
    if($CI->input->post()) 
      $render_state = $CI->input->post($name_of_input);
     else 
      if(is_object($db_result_array) && isset($db_result_array->$name_of_input)) 
        $render_state = (isset($db_result_array->$name_of_input)) ? $db_result_array->$name_of_input : $default_state;
       else if($db_result_array != '' && array_key_exists($name_of_input,$db_result_array)) 
        $render_state = (isset($db_result_array[$name_of_input])) ? $db_result_array[$name_of_input] : $default_state;
      
    
    return $render_state;
  

如果你喜欢这种方式,请告诉我。我可以提供更多的表单输入类型,如选择、复选框等。

【讨论】:

以上是关于我应该使用 set_value() 在 CodeIgniter 中重新填充表单吗的主要内容,如果未能解决你的问题,请参考以下文章

php codeigniter - 表单助手 - 如何在无线电输入上实现 set_value

codeigniter 覆盖表单助手中的 set_value 函数,使用 MY_helper 在获取时重新填充字段,同时发布

使用 set_value 的 Textarea 未填充 Codeigniter

为啥从主线程调用时,`std::promise::set_value` 会抛出错误?

std::promise::set_value() 和 std::future::wait() 是不是提供内存围栏?

Theano set_value 用于强制转换的共享变量