Php 避免验证表单';codeigniter中的s下降

Php 避免验证表单';codeigniter中的s下降,php,forms,validation,codeigniter,drop-down-menu,Php,Forms,Validation,Codeigniter,Drop Down Menu,我有这个搜索功能: public static function search_form() { $form = new Form('search_form'); $form->field('keyword', 'text', array ( 'min_length' => 4, 'max_length' => 15, 'alphanumeric' => lang('alphan

我有这个搜索功能:

public static function search_form()
{
    $form = new Form('search_form');

    $form->field('keyword', 'text', array
    (
        'min_length'    =>  4,
        'max_length'    =>  15,
        'alphanumeric'  =>  lang('alphanumeric')
    )); 
    $form->field('category', 'select', array
    (
        'cat1'  =>  'Category 1',
        'cat2'  =>  'Category 2',
        'cat3'  =>  'Category 3'

    ), $value);

    if($data = $form->validate())
    {           
        header('Location: '.WEB.sprintf('search/'.$data['keyword'].'/'.$data['category']));
    }

    return $form;
}
以及可选的验证,可以很好地处理输入,但不能处理下拉列表:

// Validate
public function validate()
{
    $this->script();

    if(!$this->submitted)
    {
        return false;
    }

    $this->valid = true;

    foreach($this->fields as $field)
    {
        $value = $this->request[$field[0]];

        if(isset($field[2]['optional']) && $field[2]['optional'])
        {
            if($value == '') continue;
        }

        foreach($field[2] as $validator=>$data)
        {
            if($validator == 'optional') continue;

            $custom = !method_exists($this, $validator);

            if((!$custom && !$this->$validator($value, $data)) || ($custom && !$this->custom($data, $value)))
            {
                $this->valid = false;

                $this->errors[$field[0]] = $this->error_message($field[0], $validator, $data);

                break;
            }
        }
    }

    return $this->valid?$this->request:false;
}
在文本输入中添加可选参数时,该参数起作用,但在选择输入中不起作用:

    $form->field('category', 'select', array
    (
        'optional'      =>  true,
  .................
它在HTML中转换为值 以下是选择的案例:

        # Input
        switch($field[1])
        {
            case 'text':
            case 'password':
                if($this->submitted)
                {
                    echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'" value="'.htmlentities(utf8_decode($this->request[$field[0]]), ENT_QUOTES).'"/>';
                } else
                {
                    echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'"'.(isset($field[3])?' value="'.$field[3].'"':'').'/>';
                }
                break;
            case 'textarea':
                echo '<textarea type="text" id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">';
                echo '</textarea>';
                break;
            case 'select':
                echo '<select id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">';

                foreach($field[2] as $key=>$value)
                {
                    echo '<option value="'.$key.'"';

                    if($this->submitted && $this->request[$field[0]] == $key)
                    {
                        echo ' selected="selected"';
                    } elseif(isset($field[3]) && $field[3] == $key)
                    {
                        echo ' selected="selected"';
                    }

                    echo '>'.$value.'</option>';
                }

                echo '</select>';
                break;
        }
#输入
开关($field[1])
{
案例“文本”:
案例“密码”:
如果($this->submitted)
{
回声';
}否则
{
回声';
}
打破
案例“textarea”:
回声';
回声';
打破
案例“选择”:
回声';
foreach($key=>$value的字段[2]为$key)
{
回显“.$value.”;
}
回声';
打破
}
问题是,我第一次输入(关键字)需要验证器,但下拉列表不需要,而且似乎我必须验证这两个字段,这是我不想要的。有没有办法绕过第二次验证

编辑:事实上,我不知道为什么下拉列表没有通过验证,我只是在尝试提交表单时得到了“错误类别”


问题已解决:

验证函数实际上试图验证第二个字段($field[2]),并查找['optional']值,但找不到它,因为我的第二个字段实际上是categories数组。 为了解决这个问题,我在第二个位置添加了一个新数组,其中包含“optional=true”,并将实际数组移动到第三个位置。 验证当时还可以,但选项值没有显示,所以我不得不更改:

   foreach($field[2] as $key=>$value)
            {
                echo '<option value="'.$key.'"'; ...
foreach($field[2]作为$key=>$value)
{

echo'问题已解决:

验证函数实际上是在尝试验证第二个字段($field[2])并查找['可选的']值,但找不到它,因为我的第二个字段实际上是categories数组。为了解决这个问题,我在第二个位置添加了一个新数组,其中包含“optional=true”并将实际数组移动到第三个位置

验证当时还可以,但选项值没有显示,所以我不得不更改:

   foreach($field[2] as $key=>$value)
        {
            echo '<option value="'.$key.'"'; ...
foreach($field[2]作为$key=>$value)
{

echo“有点让人困惑。您如何使验证成为可选的?通过添加
'optional'=>true,
,例如:
$form->field('password','password',array('optional'=>true,'confirm'=>true,'minu length'=>6));
存在范围问题,我可能已经找到了解决方案。我很快会告诉您