用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5966|回复: 4
收起左侧

[辅助方法 Helper] 修改ci表单辅助函数form_dropdown

  [复制链接]
发表于 2010-5-12 18:01:32 | 显示全部楼层 |阅读模式
最近在用ci开发项目,用到ci的表单辅助类,但是发现form_dropdown函数不大好使,主要有两个问题
  • 第一个$options数组在任何时候主要数组key是0,都会成为被选择的选项,这个bug在ci官网bug report有提及 http://codeigniter.com/bug_tracker/bug/12058/
  • 第二个是不支持多维数组,最多支持到第二级数组

第一个问题在bug report中有提到如何修复,这个是php in_array函数检测不严格的问题,只需要修改代码
PHP复制代码
$sel = (in_array($key, $selected)) ? ' selected="selected"' : '';
复制代码
PHP复制代码
$sel = (in_array($key, $selected, true)) ? ' selected="selected"' : '';
复制代码
就可以了,加上第三个参ture,严格坚持。
第二个问题我采取的做法是使用递归生成option:如下
修改form_helper.php文件第316行到326行,改为
PHP复制代码
 
 $offset =1;
 optgroup($val, $selected, &$offset, &$form);
//加上函数optgroup
function optgroup($s,$selected,&$offset,&$form)
{
    if(!is_array($s))
    {
        return false;
    }
    else
    {
        foreach($s as $groupKey => $groupValue)
        {
            if(is_array($groupValue))
            {
                $offset ++;////数组偏移
                optgroup($groupValue,$selected,&$offset,&$form);
                $offset --;//数组偏移量返回
            }
            else
            {
                $nbp = str_repeat(' ',$offset);//重复$offset次中文空格,显示时为子栏目形式,分隔符可以是其他的比如:├
                $form .= '<option value="'.$offset.$groupKey.'"'.$sel.'>'.$nbp.(string) $groupValue."</option>\n";
        }
        }
    }
}
 
复制代码

总的代码如下:
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))
                        {
                /*将原来的代码注解
                $form .= '<optgroup label="'.$key.'">'."\n";
 
                                foreach ($val as $optgroup_key => $optgroup_val)
                                {
                                        $sel = (in_array($optgroup_key, $selected,true)) ? ' selected="selected"' : '';
 
                                        $form .= '<option value="'.$optgroup_key.'"'.$sel.'>'.(string) $optgroup_val."</option>\n";
                                }
 
                $form .= '</optgroup>'."\n";*/

                $offset =1;
                optgroup($val, $selected, &$offset, &$form);
                        }
                        else
                        {
                                $sel = (in_array($key, $selected, true)) ? ' selected="selected"' : '';
                $disable = ($key === 'label') ? ' disabled="disabled"' : '';
 
                                $form .= '<option value="'.$key.'"'.$sel.$disable.'>'.(string) $val."</option>\n";
                        }
                }
 
                $form .= '</select>';
 
                return $form;
        }
}
 
function optgroup($s,$selected,&$offset,&$form)
{
    if(!is_array($s))
    {
        return false;
    }
    else
    {
        foreach($s as $groupKey => $groupValue)
        {
            if(is_array($groupValue))
            {
                $offset ++;
                optgroup($groupValue,$selected,&$offset,&$form);
                $offset --;
            }
            else
            {
                $nbp = str_repeat(' ',$offset);
                $sel = (in_array($groupKey, $selected,true)) ? ' selected="selected"' : '';
                $form .= '<option value="'.$offset.$groupKey.'"'.$sel.'>'.$nbp.(string) $groupValue."</option>\n";
            }
        }
    }
}
 
复制代码
PHP复制代码
 
$test = array(1,array(11,12,array(21,array(31,array(41,42,43),32,33,34),22,23),13,14),2,3,4);
echo form_dropdown('tests',$test);
 
复制代码

html
HTML复制代码
 
<select name="tests">
<option value="0">1</option>
<option value="10"> 11</option>
<option value="11"> 12</option>
<option value="20">  21</option>
<option value="30">   31</option>
<option value="40">    41</option>
<option value="41">    42</option>
<option value="42">    43</option>
<option value="32">   32</option>
<option value="33">   33</option>
<option value="34">   34</option>
<option value="22">  22</option>
<option value="23">  23</option>
<option value="13"> 13</option>
<option value="14"> 14</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
 
复制代码

最后生成如下

多级select

多级select

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2010-5-12 22:06:06 | 显示全部楼层
文章内容和格式都很好!支持这样的漂亮的文章!!
发表于 2010-5-13 09:27:35 | 显示全部楼层
支持一下,多维数组的还没用到
发表于 2011-3-16 11:19:18 | 显示全部楼层
非常感谢
发表于 2012-6-12 14:41:18 | 显示全部楼层
赞一个!

本版积分规则