我正在使用 CodeIgniter 的表单助手和表单验证库来构建我的表单。我无法使下拉菜单“粘性”,也无法找到适当的验证规则。
这就是我填充下拉列表的方式:
foreach($events as $event){
$options[$event->event_title] = $event->event_title;
}
$firstItem = '<option>Please select one...</option>';
echo form_dropdown('events', $options, '', $firstItem);
这是根据数据库中存储的事件构建选项。该表单看起来不错并且正确填充了所有字段。
但是,当我提交表单时,下拉列表没有保留所选的值?另外,我应该如何验证它,我想将其设为必需,但我也想确保我不除了下拉列表中的第一个选项“请选择一个...”
提前致谢。
干杯, 天然气
您是在视图中执行此操作吗?我将向您展示我已经处理了这个问题,但这一切都发生在控制器中:
// 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() 函数采用一个数组,其设置如下: $键=> $值 在我的例子中,键是国家/地区 ID,值是国家/地区名称。我的国家/地区数组开头有一对“0”=>“NONE”,因此用户无法选择一个。如果我想像您的情况一样要求这样做,我可以将其设置为“-1”=>“请选择...”,并且它不会验证,因为-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 设置为数据库中当前的值或您选择的默认值。
在你的行中:
echo form_dropdown('events', $options, '', $firstItem);
只要做到:
echo form_dropdown('events', $options, set_value('events'), $firstItem);
就我个人而言,我真的很喜欢在视图中构建表单,而不是将演示文稿混合到控制器中。但那只是我的个人意见。我知道如果列表很大,则必须预加载数据,但我认为您实际上不需要仅为下拉列表构建整个表单。我遇到了同样的问题,实际上做了一些文档挖掘以找出一个好的解决方案。
验证选择选项
我所做的就是在控制器类中提供一个自定义方法,如下所示
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 进行下拉验证的一个非常直接的解决方案。
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');
然后验证返回正常的“必需”消息
使用 spry 验证 javascript 进行 JavaScript 验证