Yii2中checkboxList(复选框)的使用(实例教程、源码分析)
checkboxList用来生成多个复选框,函数定义为:public static function checkboxList($name, $selection = null, $items = [], $options = [])下面我们一一说明其中的参数及使用$name——设置checkbox的name
字符串,这个用来设置生成的每个checkbox的name值,因为是生成多个checkbox,所以$name的值要以[]结尾,如果没有的话在函数内部会自动加上[]
$selection——设置checkbox是否选中
字符串或者数组,这个用来设置哪些checkbox为选中状态,值为checkbox中的value;如果需要多个checkbox选中那么就用数组的形式来传递多个值,如['a','b','c']
$items——设置多个checkbox的数据源
数组,这个用来生成各个checkbox的数据源,其中键作为checkbox的value,值作为checkbox的label
$options
数组,这个比较复杂,里面的参数比较多,其中有几个固定的参数:
[*]tag:字符串,设置生成的所有的checkbox的容器标签,默认为div
[*]unselect:字符串,当checkbox都没有选择的时候的默认值。如果设置这个,会自动生成一个以name(不带[])为名称的hidden类型的input,这个input的值就为unselect
[*]encode:布尔值,设置每个checkbox的label是否需要编码,默认为true
[*]separator:字符串,生成的每个checkbox html代码之间的连接字符串,默认为 \n,也就是说默认生成的checkbox都是一行一个。
[*]itemOptions:数组,生成每个checkbox的参数选项。这个在单独介绍checkbox函数的时候说明
[*]item:回调函数,在循环生成每个checkbox表单的时候,会调用这个函数。如果设置了则使用返回值作为checkbox的表单,否则使用static::checkbox函数来生成每个checkbox表单,函数格式为:function ($index, $label, $name, $checked, $value)checkboxList函数源码为: public static function checkboxList($name, $selection = null, $items = [], $options = [])
{
//检查name是否以[]为后缀
if (substr($name, -2) !== '[]') {
$name .= '[]';
}
//回调函数
$formatter = isset($options['item']) ? $options['item'] : null;
//在生成每个checkbox的时候的选项
$itemOptions = isset($options['itemOptions']) ? $options['itemOptions'] : [];
//每个checkbox中的label是否需要编码
$encode = !isset($options['encode']) || $options['encode'];
$lines = [];
$index = 0;
foreach ($items as $value => $label) {
//设置当前的checkbox是否选中,$selection可为字符串或者数组
$checked = $selection !== null &&
(!is_array($selection) && !strcmp($value, $selection)
|| is_array($selection) && in_array($value, $selection));
if ($formatter !== null) {
//如果设置了item回调函数,则使用回调函数的结果作为html表单
$lines[] = call_user_func($formatter, $index, $label, $name, $checked, $value);
} else {
//否则使用checkbox函数来生成checkbox表单
$lines[] = static::checkbox($name, $checked, array_merge($itemOptions, [
'value' => $value,
'label' => $encode ? static::encode($label) : $label,
]));
}
$index++;
}
//如果设置了unselect,则生成一个hidden类型的input。当没有选择checkbox的时候,这个将作为默认值返回
if (isset($options['unselect'])) {
// add a hidden field so that if the list box has no option being selected, it still submits a value
$name2 = substr($name, -2) === '[]' ? substr($name, 0, -2) : $name;
$hidden = static::hiddenInput($name2, $options['unselect']);
} else {
$hidden = '';
}
//每个checkbox表单html之间的分隔符
$separator = isset($options['separator']) ? $options['separator'] : "\n";
//所有的checkbox的外层容器标签
$tag = isset($options['tag']) ? $options['tag'] : 'div';
unset($options['tag'], $options['unselect'], $options['encode'], $options['separator'], $options['item'], $options['itemOptions']);
return $hidden . static::tag($tag, implode($separator, $lines), $options);
}
其他:
设置默认选定一个或多个初始值?比如<?= $form->field($model, 'hobby')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球']) ?>
Controller中直接对$model->hobby设置值就可以了:
$model->hobby=‘1’ 或者 $model->hobby=['0','2']
页:
[1]