0

我正在使用 PHP Codeigniter 制作一个基本的注册页面。

在注册页面上,我要求用户从一系列类别中进行选择(通过<select>html 元素)。这些类别存储在我的 MySQL 数据库中的列表中。

我当前的方法是在用户调用函数加载页面然后将其显示给他们时从数据库中获取此列表。但是,如果用户输入了不正确的数据并且页面必须重新加载验证错误,那么保存列表中数据的变量似乎被清除了,我必须在重新显示页面之前从数据库中重新获取列表数据。

我相信文档中有一些关于如何将此变量设置为永久可用的内容,但再次查看时,我没有找到它。

谁能指出我正确的方向?每次都需要重新获取这些数据对我来说似乎很愚蠢(我知道人们不会经常输入错误的信息,但这在某些情况下会派上用场)。

注意:这不是关于记住用户选择的问题。

4

2 回答 2

0

这个例子是一个使用 ci 表单助手的选择下拉列表(我正在从另一个表单修改它,所以希望它都是正确的)

the Array of select values is: $categoryarray
the drop down field name is 'category'
the default value is $defaultcategory
a css class to style (bootstrap etc): $dropclass = 'class="input-medium"';

代码行是:

  form_dropdown('category',$categoryarray,set_value('category',$defaultcategory),$dropclass).form_error('category');

form_error('category'); 最后用于显示验证错误消息,即使有默认值 - 如果表单从表单中的另一个字段验证失败 - 这将“记住”用户选择的内容。

编辑 !

好的,有好消息也有坏消息。坏消息 - 如果类别来自数据库,那么您需要再次获取它们。好消息 - CI 会记住用户从下拉列表中选择的类别。

坏消息实际上没什么大不了的 - 如果您在模型中创建类别数组。那么它只是添加到验证中的一行代码。

// 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 ); }

因此,即使我们再次从数据库中获取类别以动态填充选择列表 - 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() ;  }

这要好得多,因为如果您的表单需求发生变化 - 变化只在一个地方。我还添加了一个下划线来提醒我们所有私有方法是一种很好的做法。并且表单验证应该在一个模型中分开,由控制器调用。

于 2013-09-24T01:22:48.457 回答
0

您只需将其设置为默认值,例如

<input type="text" name="username" value="<?php isset($_POST['username']) echo $username;?>" />

这样,$_POST['username']将始终可用。

于 2013-09-24T00:03:12.827 回答