set_select()辅助函数不起作用

时间:2014-02-12 09:59:03

标签: php html codeigniter select

我使用了以下代码,

<select class="form-control selection" name="currency">
                        <option value="">select currency</option>
                            <option value="AED"<?php echo set_select('currency', 'AED'); ?> >AED</option>
                            <option value="SAR"<?php echo set_select('currency', 'SAR'); ?> >SAR</option>
                            <option value="MAD"<?php echo set_select('currency', 'MAD'); ?> >MAD</option>
                            <option value="TRY"<?php echo set_select('currency', 'TRY'); ?> >TRY</option>
                        </select>

但不幸的是,在表单验证失败后,它没有显示选定的值。为什么这个基本的set_select()方法不起作用?我已经在其他一些领域中使用过这个并且一切正常

4 个答案:

答案 0 :(得分:8)

在使用set_value()set_select()set_checkbox()set_radio()之前,即使不需要/验证,您也必须将这些字段传递给验证。

答案 1 :(得分:2)

TL; DR

使用CodeIgnIter set_*表单辅助函数时,只有两种情况

  1. 未加载Form_validation库。
  2. 验证对象已实例化(您正在使用Form_validation库)。
  3. 为了使用set_*辅助函数,不必必须使用表单验证库,但是如果您正在使用验证库,必须至少为该字段设置验证规则

    长答案(set_ * Anatomy)

    以下适用于所有set_*表单帮助程序函数。但我会尝试描述set_select()的工作原理:

    语法: set_select($field = '', $value = '', $default = FALSE)

    1。不使用表单验证

    当您使用set_select()函数时,CodeIgniter会将_get_validation_object()函数用于look for the validation object

    _get_validation_object()会返回objectFALSE(如果尚未加载验证)。

    当它返回FALSE时,set_select()函数搜索$_POST变量以在数组中找到指定的field名称,并在以下by checking function argouments中找到例如$value$default,它确定是返回selected="selected"属性/值还是空字符串''

    因此,它可以在不使用表单验证库的情况下工作。

    2。使用表单验证时

    但是如果之前加载了验证库,则set_select()函数will pass the arguments加载到Form_validation::set_select()方法,并返回结果。

    Form_validation类中,有一个名为_field_data的私有属性,它是一个包含所有字段名称/值的数组(您设置的那些他们的验证规则)。

    Form_validation::set_select()方法检查field数组中是否存在_field_data,并在失败时返回字符串。

    _field_data数组is populated by验证set_rules()方法。

    因此,如果您使用的是验证库,则必须至少为field设置一个验证规则,以使set_select()表单帮助程序功能正常工作。

    这就是为什么你无法让它发挥作用。

    我希望这个答案有助于更好地理解set_*函数。

答案 2 :(得分:1)

试试这个:

修改表单助手中的set_select函数:

if (count($_POST) === 0)
{
    return ' selected="selected"';
} 

if (count($_POST) === 0)
{
    if ($default)
    {
        return ' selected="selected"';
    }
    else
    {
        return '';
    }
} 

答案 3 :(得分:1)

正如他们所说,只有在验证这些字段时,codeigniter set select才有效。如果不需要那些字段,则不需要重新填充