在 CodeIgniter 中验证表单下拉列表

Posted

技术标签:

【中文标题】在 CodeIgniter 中验证表单下拉列表【英文标题】:Validating form dropdown in CodeIgniter 【发布时间】:2011-01-27 09:18:28 【问题描述】:

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

这就是我填充下拉列表的方式:

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

$firstItem = '<option>Please select one...</option>';
echo form_dropdown('events', $options, '', $firstItem);

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

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

提前致谢。

干杯, 天然气

【问题讨论】:

【参考方案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');

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

【讨论】:

万岁!这里的技巧是将数组键设置为空字符串,以便值验证为空。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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 进行下拉验证的一个非常简单的解决方案。

【讨论】:

同意。更喜欢在普通网站中使用我的 html。有时助手会限制实验和代码整洁。【参考方案4】:

在你行:

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

做到这一点:

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

【讨论】:

重要提示:要让 set_value() 在使用表单验证库时起作用,该字段(本例中为“事件”)必须是验证规则的一部分。【参考方案5】:

您是在视图中执行此操作吗?我会告诉你我已经处理了这个,但这一切都发生在控制器中:

// 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 => $value 在我的例子中,键是国家 ID,值是国家名称。我在国家/地区数组的开头有一对 '0' => 'NONE',所以用户不能选择一个。如果我想像您的情况一样要求这样做,我可以将其设置为 '-1' => 'Please select...' 并且它不会验证,因为 -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 设置为数据库中当前的值,或者您选择的默认值。

【讨论】:

太好了 - 效果很好。你会认为会有更好的方法吗?另外,您有什么想法可以让下拉菜单变得“粘性”吗? 您的意思是,如果表单已提交但其他内容未验证,并且您希望下拉列表具有相同的选定值? 是的,我就是这个意思。回复:验证 - CI 似乎有很好的基本输入验证文档,但对于下拉列表来说没有那么多。另外,我原以为会有很大比例的下拉列表是从数据库值中填充的,所以 set_select() 会迎合它,似乎不是? 我在回答中添加了更多内容,以防您错过。基本上我所做的是检查是否有有效的 POST 值来设置,如果没有,则从数据库中提取某些内容,否则设置默认值。

以上是关于在 CodeIgniter 中验证表单下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 在表单编辑中未显示数组时制作下拉菜单

在 CodeIgniter 中从数据库中获取下拉列表

在 Codeigniter 中填充动态下拉列表

Codeigniter 上的动态相关下拉列表国家和州

验证下拉项在具有相同 id 的下拉字段列表中不会出现多次

.NET Web 表单下拉列表和日期时间选择器需要 HTML 5 验证