验证CodeIgniter中的表单下拉列表

时间:2010-03-14 13:22:11

标签: forms codeigniter validation

我使用CodeIgniter的表单助手和表单验证库来构建表单。我无法将下拉列表设置为“粘性”并找到合适的验证规则。

这就是我填充drodown的方式:

foreach($events as $event){
$options[$event->event_title] = $event->event_title;
}
$firstItem = '<option>Please select one...</option>';
echo form_dropdown('events', $options, '', $firstItem);

这是根据存储在数据库中的事件构建选项。表单看起来很好,并正确填充所有字段。

但是,当我提交表格时,下拉列表没有保留所选的值?此外,我应该如何验证它,我想让它成为必需但我也想确保除了下拉列表中的第一个选项'请选择一个......'

提前致谢。

干杯, 达伽兹

5 个答案:

答案 0 :(得分:8)

你是否在视野中这样做?我会告诉你我已经处理过了,但这一切都发生在控制器中:

// first, we can set a validation rule for the input 'country' (our dropdown), in this case it is required, and must be a natural number. You can look up more rules in the CI user guide, and you can write your own functions as well and add them to the 3rd parameter here. I believe some native PHP functions can be used as well.
$this->form_validation->set_rules('country', 'Country', 'required|is_natural');

// the form is not valid! we'll enter this block whenever the form validation rules above are not met, as well as when first going to this controller-action.
if ($this->form_validation->run() == FALSE) {
    // buid your form, there's some CI functions to help with this that I'm using
    $my_form = form_open('user/edit', 'class="superform"')
        . form_fieldset()
        . '<ol>'
        . '<li>'
        . form_label('Country<br/>', 'country')
        // so here is the dropdown, matching the name given to the validation rule we've set, the second parameter takes an array, which I am grabbing from a model, the last parameter is the 'selected; value, which I am grabbing from some variable, if it's not present the first item in the dropdown will obviously be selected
        . form_dropdown('country', $this->Country_model->get_countries_dropdown(), $user->country)
 . form_error('country', ' <em>', '</em>'
        . form_submit('mysubmit', 'Save', 'class="button"')
        . '</li>'
        . '</ol>'
        . form_fieldset_close()
        . form_close()
    );
    // sending the form variable to my view, where i will simply <?=$my_form?> it
    $this->load->view('user_edit', $my_form);
} else {
    // form has validated! do something!
}

form_dropdown()函数采用如下设置的数组:     $ key =&gt; $值 我的案例中的密钥是国家/地区ID,值是国家/地区名称。我有一对'0'=&gt;在我的国家/地区阵列的开头'NONE',因此用户无法选择一个。如果我想像你的情况那样做这个,我可以把它设置为'-1'=&gt; '请选择......'并且它不会验证,因为-1不是自然数。

希望我的漫无边际的帮助!

编辑:

好的,所以在使用form_dropdown()创建下拉列表之前,您要做的是检查来自POST数组的选定值。

对于CI,您可以使用函数set_value($ input),因此在我的示例表单中,我可能会执行以下操作:

$selected = (!empty(set_value('country'))) ? set_value($country) : '';

form_dropdown('country', $this->Country_model->get_countries_dropdown(), $selected)

现在,下拉列表的选定值将设置为上一篇文章中选择的值。您可能想要检查该值以确保它有效。如果未选择任何内容,则可以将$ selected设置为当前数据库中的值,或者您选择的默认值。

答案 1 :(得分:4)

在你的行中:

echo form_dropdown('events', $options, '', $firstItem);

做到这一点:

echo form_dropdown('events', $options, set_value('events'), $firstItem);

答案 2 :(得分:4)

就个人而言,我真的很喜欢在视图中构建我的表单,而不是将表示混合到控制器中。但那只是我的个人意见。我知道如果它是一个很大的列表,我必须预先加载数据,但我认为你真的不需要为下拉列表构建整个表单。我有同样的问题,实际上做了一些文档挖掘,以找出一个很好的解决方案。

验证选择选项
我所做的就是在控制器类中提供一个看起来像这样的自定义方法

function select_validate($selectValue)
{
    // 'none' is the first option and the text says something like "-Choose one-"
    if($selectValue == 'none')
    {
        $this->form_validation->set_message('select_validate', 'Please pick one.');
        return false;
    }
    else // user picked something
    {
        return true;
    }
}

在index()中(或处理数据并加载视图的任何方法),您可以设置下拉列表的验证码。

$this->form_validation->set_rules('select', 'Select', 'callback_select_validate');

强制性,您的自定义函数前缀为“callback _”。

维护用户选择 如果您使用CI提供的内容,保留选择选项也非常简单。您只需要对选择列表中的每个选项使用set_select()函数。

因此,假设您有两个选项可以轻松下载。这就是你所做的一切。

<select name="select">
    <option value="none" <?php echo set_select('select', 'none', true);?> >- Select One -</option>
    <option value="one" <?php echo set_select('select', 'one');?> >Option one</option>
    <option value="two" <?php echo set_select('select', 'two');?> >Option two</option>
</select>

使用此功能的好处在于它预先选择了第一个“虚拟”选项,然后如果用户进行选择但未通过其他验证,则在表单发布后会保留并预先选择选择并提示用户纠正其他错误。

同样,这可能并不能满足所有人的需求,但对于使用CodeIgniter进行下拉验证,这是一个非常直接的解决方案。

答案 3 :(得分:1)

我也遇到了这个问题,在阅读了推荐的帖子后,我得到了它的工作,但我很生气,因为它返回的验证消息。但是我相信我找到了一个更好的选择:

foreach($events as $event){
    $options[$event->event_title] = $event->event_title;
}

$firstItem[''] = 'Please select one...';

// I used array merge to ensure that my firstItem was infact my first item, 
// otherwise you could just do $options[''] = 'Please select one...'. 
// Array_unshift also does not allow you to specify the [''] array key we want
$options = array_merge($firstItem, $options);

$selected_option = $this->input->post('events', TRUE) ? $this->EE->input->post('events', TRUE) : '';

echo form_dropdown('events', $options, $selected_option);

然后通过验证,你可以做到:

$this->form_validation->set_rules('events', 'Events', 'required');

然后验证返回正常的“必需”消息

答案 4 :(得分:0)

遇到同样的问题并设法解决它:

  • 使用spry验证javascript进行javascript验证
  • 表单验证类中的codeigniter回调函数

如果您需要特定代码我可以提供帮助