【问题标题】:How do I use CodeIgniter's `set_value()` function when using `form_validation.php`?使用 `form_validation.php` 时如何使用 CodeIgniter 的 `set_value()` 函数?
【发布时间】:2018-04-12 03:43:22
【问题描述】:

问题:

我有一个表单我正在尝试re-populate via the CodeIgniter docs,我正在尝试在我的视图文件中使用set_value() 函数,但我收到一个错误:Message: Call to undefined function set_value()

在使用 set_rules() 函数逐字段定义验证时,我在 StackOverflow 的其他地方看到了 similar problem 的解决方案。

但是,我在config/form_validation.php 中汇总了我的所有验证,例如sets of rules。因为我的所有验证都是在规则集中定义的,所以它似乎与逐个字段定义时有所不同。

我的规则集、控制器、模型和视图方法如下。

知道为什么我的重新填充不起作用吗?

感谢任何人提供的任何见解,我是 CodeIgniter 的新手,我可能会误解事情的运作方式。


验证规则来自config/form-validation.php:

$config = array(
  'create' => array (
    array(
      'field' => 'name',
      'label' => 'product name',
      'rules' => 'trim|required|min_length[5]',
    ),
    array(
      'field' => 'description',
      'label' => 'product description',
      'rules' => 'trim|required|min_length[5]',
    ),
    array(
      'field' => 'price',
      'label' => 'product price',
      'rules' => 'trim|required|min_length[1]|less_than[100000]|decimal',
    ),
  ),
);

在我的控制器中:

  public function create()
    {
    // XSS FILTER $POST OBJECT
    $new_product = $this->input->post(null, true);

    // SEND TO MODEL
    $this->load->model("Product_model");
    $product = $this->Product_model->add_product($new_product);

    // IF VALIDATIONS RETURN FALSE, STORE ERRORS IN FLASH SESSION
    if ($product[0] === FALSE)
    {
      $this->session->set_flashdata('errors', $product[1]);
      redirect("/products/new");
    }

    // IF VALIDATION PASSES, SEND HOME
    redirect("/");
  }

在我的模型中:

 public function add_product($product)
  {

    $this->load->library("form_validation");

    if ($this->form_validation->run("create") === FALSE) 
    {

      // STORE ERRORS & SHIP BACK TO CONTROLLER:
      return array(FALSE, validation_errors());
    } 
    else 
    {
      // Success, Escape strings and insert to DB and return TRUE (or item)
    }
  }

在我的表单视图中:

(在表单上方显示返回错误的页面)

 <form action="./create" method="POST">
  <input type="text" name="name" id="name" value="<?php echo set_value('name'); ?>">
  <textarea name="description" id="description" cols="30" rows="10" value="<?php echo set_value('description'); ?>"></textarea>
  <input type="number" name="price" id="price" value="<?php echo set_value('price'); ?>">
  <input type="submit" value="Create">
</form>

【问题讨论】:

  • 验证使用模型,产品使用控制器。
  • 您在错误区域的表单验证应该在控制器上而不是在模型中。如此处所述codeigniter.com/user_guide/libraries/…
  • @Mr. ED 感谢您的回复/帮助。我已经在其他全栈中学会了将验证放入模型中......至少这是我倾向于在 JS/Python 堆栈中做事的方式,等等。我看到一些 CI 的人有这样的争论,关于验证进入控制器,但我也在 CI 中看到了在模型中完成的示例。我相信应该可以实现我想要在模型中验证的内容。我什至尝试将我的逻辑移动到控制器中(并为验证创建单个规则,而不是使用规则数组)。仍然没有运气。我可能缺少一些基本的东西......嗯
  • @Mr. ED 我确实根据 pradeep 的反馈添加了form_helper 以自动加载,所以我现在似乎可以在我的视图中访问set_value() 函数,但不幸的是数据没有填充。如果我将第二个参数设置为默认值,它将填充,但字段数据本身不会。这甚至发生在我将验证移到控制器本身时,甚至当我尝试编写单个规则而不是使用规则数组时。似乎它的设置正确,我一定遗漏了一些东西......再次感谢您的时间和帮助

标签: php codeigniter validation


【解决方案1】:

希望对您有所帮助:

在您的controllerautoload.php 中添加form_helper

在控制器中:

     public function __construct()
     {
        parent::__construct();
        $this->load->helper('form');
     }

或者在 autoload.php 中:

    $autoload['helper'] = array('form','url');

更多:https://www.codeigniter.com/userguide3/libraries/form_validation.html#re-populating-the-form

【讨论】:

  • 谢谢。我在我的自动加载中添加了form_helper,这确实纠正了错误消息(set_value() 函数现在似乎运行没有错误),但不幸的是,正确的表单值没有被传播(最终为空)。我确实尝试在set_value('foo', 'default') 中设置一个默认值作为第二个参数,并且确实出现了默认值,因此该函数正在运行。我不确定为什么我的数据没有重新填充:规则函数正在运行,我可以收到我的验证错误等。我什至尝试创建单独的规则并将逻辑放入控制器中。
  • 我将不得不退后一步,多想一想...我的意思是,事情 似乎 设置正确...如前所述,我什至尝试创建一个个人规则(而不是使用form-validation.php),但仍然无法正常工作......嗯......我确定我忽略了一些基本的东西......如果一切都失败了,我想我可以将表单数据刷新到会话中一个快速而肮脏的解决方案,但想要接受 CI 的工具。非常感谢您的回复,意义重大!
  • 更新:经过form_helper的更多探索,我现在明白了如何正确使用set_value()。不幸的是,我只是半信半疑地接受了 form_helper 并且从那时起就学会了:) 谢谢!
猜你喜欢
  • 2016-11-18
  • 2020-07-19
  • 2016-04-06
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多