admin 发表于 2015-8-2 22:37:14

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]
查看完整版本: Yii2中checkboxList(复选框)的使用(实例教程、源码分析)