PHP Codeigniter:将动态表单数据传递到视图,而不必在验证错误时从数据库中重新提取
我正在使用PHP Codeigniter制作一个基本的注册页面 在注册页面上,我要求用户从类别选择中进行选择(通过PHP Codeigniter:将动态表单数据传递到视图,而不必在验证错误时从数据库中重新提取,php,mysql,codeigniter,caching,Php,Mysql,Codeigniter,Caching,我正在使用PHP Codeigniter制作一个基本的注册页面 在注册页面上,我要求用户从类别选择中进行选择(通过html元素)。这些类别存储在MySQL数据库的列表中 我当前的方法是,当用户调用函数加载页面时,从数据库中获取该列表,然后将其显示给他们。但是,如果用户输入的数据不正确,并且页面必须重新加载验证错误,则保存列表中数据的变量似乎已清除,并且我必须在重新显示页面之前从数据库中重新提取列表数据 我相信文档中有一些关于如何将这个变量设置为永久可用的内容,但是再次查看时,我没有找到它 有人能
html元素)。这些类别存储在MySQL数据库的列表中
我当前的方法是,当用户调用函数加载页面时,从数据库中获取该列表,然后将其显示给他们。但是,如果用户输入的数据不正确,并且页面必须重新加载验证错误,则保存列表中数据的变量似乎已清除,并且我必须在重新显示页面之前从数据库中重新提取列表数据
我相信文档中有一些关于如何将这个变量设置为永久可用的内容,但是再次查看时,我没有找到它
有人能给我指一下正确的方向吗?在我看来,每次都需要重新提取这些数据是很愚蠢的(我知道人们不会经常输入错误的信息,但在一些情况下这会派上用场)
注意:这不是关于记住用户选择的问题。例如,您只需要将其设置为默认值
<input type="text" name="username" value="<?php isset($_POST['username']) echo $username;?>" />
此示例用于使用ci表单帮助器的选择下拉列表
(我正在修改另一个表单,希望它都是正确的)
代码行是:
form_dropdown('category',$categoryarray,set_value('category',$defaultcategory),$dropclass).form_error('category');
形式错误(“类别”);最后用于显示验证错误消息
即使有一个默认值——如果表单未通过表单中另一个字段的验证——这也会“记住”用户选择的内容
编辑
好的,有好消息也有坏消息。
坏消息-如果类别来自数据库,那么您需要再次获取它们。
好消息-CI会记住用户从下拉列表中选择的类别
如果在模型中创建category数组,那么坏消息其实没什么大不了的。然后,只需向验证中添加一行代码
// In the Model
function makedropdown() {
// get your category list
$cats = $this->getAllCategories() ;
$categoryarray = array();
// make the array
foreach ( $cats->result() as $row ) {
$categoryarray[$row->category] = $row->category ; }
return $categoryarray ;
}
有人填写了表单,我们运行验证,验证失败。在控制器中:
if ( $this->form_validation->run($formrules) == FALSE ) {
// get the categoryarray
$data['categoryarray'] = $this->categorymodel->makedropdown() ;
// load form again
$this->load->view( 'myform', $data ); }
因此,即使我们再次从db获取类别以动态填充选择列表,CI仍然会记住用户第一次创建表单时的选择
那么下拉列表的默认类别呢?如果它不会改变,那么可以将其设置为配置。如果类别值来自数据库并且可以更改,则可以在模型中创建默认类别
编辑2
天哪,我总是这样做,所以为什么我没有想到这一点。所以,是的,这是另一个原因,使一个具体的方法来显示您的看法
function _showCategoryForm(){
// get the categoryarray
$data['categoryarray'] = $this->categorymodel->makedropdown() ;
// anything else thats needed for the view
// load form view
$this->load->view( 'myform', $data ); }
现在,我们没有任何重复的代码,如果需要的话,可以使用错误消息自定义验证失败
// since i'm grinding on this - the validation should happen in a model
// and that method returns true or false
if ( $this->somemodel->validateCategoryForm() == FALSE ) {
// custom obnoxious error message
$this->formerrormessage = "What part of required is eluding you?" ;
$this->_showCategoryForm() ; }
这要好得多,因为如果表单的需求发生更改,那么更改只会发生在一个地方。我还添加了一个下划线,以提醒我们所有人私有方法是一种很好的做法。表单验证应该在一个由控制器调用的模型中单独进行 那么$this->fuzzyfuzzy
会保持它的状态吗,即使在调用控制器的构造函数之后?这就是我所调用的模型,您询问的是$categoryarray-我认为如果存在验证错误,ci将重新填充select下拉列表,但是-请尝试并让我们知道。我认为这就是ci文档的不足之处。很少有人提到使用它们的函数时会发生什么。我已经实现了您所说的,但是似乎每次调用构造函数都会创建一个新的构造函数实例。我在构造函数中放了一些代码来表示这一点,并在用户通过URI从浏览器调用的每个方法调用后打印出来。这意味着每次都会调用$This->load->model(fuzzyfuzzy)
。当然,构造函数肯定会再次被调用。如果您需要在继续之前检查凭证,这实际上是一件非常非常好的事情。但是表单验证将采用与表单初始显示完全不同的方法。我只是不确定下拉值是否会保留。现在你让我好奇,所以如果你不发布,我会自己测试它。好的,我的实现和你上面的一样。用户重新加载页面后,您设置的任何模型状态都会重置,因此下拉列表值将不会保留(因此,是的,您需要在调用验证方法后重新获取列表)。我不认为有办法解决这个问题,除非像你说的那样将这些值设置为配置。
// since i'm grinding on this - the validation should happen in a model
// and that method returns true or false
if ( $this->somemodel->validateCategoryForm() == FALSE ) {
// custom obnoxious error message
$this->formerrormessage = "What part of required is eluding you?" ;
$this->_showCategoryForm() ; }