我使用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);
这是根据存储在数据库中的事件构建选项。表单看起来很好,并正确填充所有字段。
但是,当我提交表格时,下拉列表没有保留所选的值?此外,我应该如何验证它,我想让它成为必需但我也想确保除了下拉列表中的第一个选项'请选择一个......'
提前致谢。
干杯, 达伽兹
答案 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)
遇到同样的问题并设法解决它:
如果您需要特定代码我可以提供帮助