1

我需要修改一个用 Codeigniter 编写的网站,但我不是专家。

我想做的一件事是修改表单中的选择控件以将ms-dropdown用于包含图片的下拉列表。

但是,我无法弄清楚如何使 Codeigniter 表单助手在每个选项中呈现除 ID 和 Value 之外的参数。在这种情况下,要使 ms-dropdown 工作,它还需要在每个选项中呈现data-image="..." 。

当前代码如下所示:

$dropdown = array(
'name'=>'MyDropDown', 
'options' => array('Op1'=>'First Option', 'Op2' =>'Second Option')
);

echo form_dropdown($dropdown['name'],$dropdown['options']);

这呈现为

<select name="MyDropDown">
<option value='Op1'>First Option</option>
<option value='Op2'>Second Option</option>
</select>

有没有办法让 Codeigniter 渲染

<select name="MyDropDown">
<option value='Op1' data-image="filepath1">First Option</option>
<option value='Op2'  data-image="filepath2">Second Option</option>
</select>
4

3 回答 3

2

你不能。您需要扩展 CI 的 Form Helper 并修改 form_dropdown 以接受其他属性,例如 ID

您将不得不扩展 helper 。

要扩展本机表单助手,您将创建一个名为 application/helpers/MY_form_helper.php的文件,并添加或覆盖函数:

如果你想覆盖function form_dropdown

只需按照您想要的方式编写函数MY_form_helper.php

这是基本功能

if ( ! function_exists('form_dropdown'))
{
    function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '')
    {
        if ( ! is_array($selected))
        {
            $selected = array($selected);
        }

        // If no selected state was submitted we will attempt to set it automatically
        if (count($selected) === 0)
        {
            // If the form name appears in the $_POST array we have a winner!
            if (isset($_POST[$name]))
            {
                $selected = array($_POST[$name]);
            }
        }

        if ($extra != '') $extra = ' '.$extra;

        $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : '';

        $form = '<select name="'.$name.'"'.$extra.$multiple.">\n";

        foreach ($options as $key => $val)
        {
            $key = (string) $key;

            if (is_array($val) && ! empty($val))
            {
                $form .= '<optgroup label="'.$key.'">'."\n";

                foreach ($val as $optgroup_key => $optgroup_val)
                {
                    $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : '';

                    $form .= '<option value="'.$optgroup_key.'"'.$sel.'>'.(string) $optgroup_val."</option>\n";
                }

                $form .= '</optgroup>'."\n";
            }
            else
            {
                $sel = (in_array($key, $selected)) ? ' selected="selected"' : '';

                $form .= '<option value="'.$key.'"'.$sel.'>'.(string) $val."</option>\n";
            }
        }

        $form .= '</select>';

        return $form;
    }
}

你必须编辑这部分,

foreach ($options as $key => $val)
{
    $key = (string) $key;

    if (is_array($val) && ! empty($val))
    {
        $form .= '<optgroup label="'.$key.'">'."\n";

        foreach ($val as $optgroup_key => $optgroup_val)
        {
            $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : '';

            $form .= '<option value="'.$optgroup_key.'"'.$sel.'>'.(string) $optgroup_val."</option>\n";
        }

        $form .= '</optgroup>'."\n";
    }
    else
    {
        $sel = (in_array($key, $selected)) ? ' selected="selected"' : '';

        $form .= '<option value="'.$key.'"'.$sel.'>'.(string) $val."</option>\n";
    }
}

如您所见,该函数仅设置选项的 value 属性,您可以编辑此代码并做您想做的事情,

试试看,如果你做不到,告诉我我会帮助你,但先试一试:)

于 2013-08-28T11:41:50.547 回答
0

考虑做这样的事情:

<script type="text/javascript">
    var filepath = <?=json_encode($dropdown['filepath'])?>;
</script>

$dropdown['filepath']将使用选项值作为键并将文件路径存储为值。然后你可以简单地访问filepath[$(this).val()]事件change

示例输出:

<script type="text/javascript">
    var filepath = { 'Op1' : 'filepath1', 'Op2' : 'filepath2' };

    $('select').bind('change', function() {
        console.log(filepath[$(this).val()]);
    });
</script>

尽管我喜欢使用data-属性,但不能忘记实现目标的其他方法。

于 2013-08-28T09:57:39.883 回答
0

如果它对任何人有帮助,我找到了使用 JQuery 的解决方法。

我创建了一个 javascript 函数,一旦页面准备好,它就会将data-image属性应用于每个选项字段,然后调用 msDropdown 函数。

function PiccifyShowDropdown(){

var Diagrams = new Array(
"/assets/images/icons/SixtyToHundredPercent.png",
"/assets/images/icons/LessThanThirtyPercent.png",
"/assets/images/icons/ThirtyToSixtyPercent.png",
"/assets/images/icons/SixtyToHundredPercent.png"
);

$("#Show > option").each(

    function()  {
        $(this).attr("data-image",Diagrams[this.index]);
                }

    );

$("#Show").msDropdown({visibleRows:2}); 


}

这似乎奏效了,所以现在我只需要有人解决与这家伙相同的问题......

于 2013-08-28T15:25:52.577 回答