我有这个搜索功能:
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;
}
问题是我需要第一个输入(关键字)的验证器,但不需要下拉列表,似乎我必须验证这两个字段,这是我不想要的。有没有办法绕过第二次验证?
编辑:实际上,我不知道为什么下拉列表没有通过验证,我只是在尝试提交表单时得到“error_category”。
问题已解决:
验证函数实际上是在尝试验证第二个字段($ field [2])并查找['optional']值,但找不到它,因为我的第二个字段实际上是categories数组。 为了解决这个问题,我刚刚在第二个位置添加了一个新数组,其中包含“optional = true”并将我的实际数组移到第三个位置。 然后验证没问题,但选项值没有显示,所以我只需要改变:
foreach($field[2] as $key=>$value)
{
echo '<option value="'.$key.'"'; ...
并用$ field替换$ field [2] [3] 然后只需将值字段(以前为$ field [3])移动到$ field [4]
答案 0 :(得分:0)
问题已解决:
验证功能实际上是在尝试验证第二个字段( $ field [2] )并查找['可选']值,但不能找到它,因为我的第二个字段实际上是类别数组。为了解决这个问题,我刚刚在第二个位置添加了一个新数组,其中包含“ optional = true ”并将我的实际数组移到第三个位置。
然后验证没问题,但选项值没有显示出来,所以我只需要改变:
foreach($field[2] as $key=>$value)
{
echo '<option value="'.$key.'"'; ...
并将 $ field [2] 替换为 $ field [3] 然后只需将值字段(以前$ field [3])移动到$ field [4]