|
最近在用ci开发项目,用到ci的表单辅助类,但是发现form_dropdown函数不大好使,主要有两个问题
第一个问题在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
最后生成如下
多级select
|
评分
-
查看全部评分
|