设为首页收藏本站

PHPIN.NET

 找回密码
 立即注册
查看: 1341|回复: 0

[基础应用] Yii2中checkboxList(复选框)的使用(实例教程、源码分析)

[复制链接]

374

主题

381

帖子

2558

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2558
发表于 2015-8-2 22:37:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
checkboxList用来生成多个复选框,函数定义为:
  1. 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表单,函数格式为:
    1. function ($index, $label, $name, $checked, $value)
    复制代码
    checkboxList函数源码为:
    1.     public static function checkboxList($name, $selection = null, $items = [], $options = [])
    2.     {
    3.             //检查name是否以[]为后缀
    4.         if (substr($name, -2) !== '[]') {
    5.             $name .= '[]';
    6.         }

    7.         //回调函数
    8.         $formatter = isset($options['item']) ? $options['item'] : null;
    9.         //在生成每个checkbox的时候的选项
    10.         $itemOptions = isset($options['itemOptions']) ? $options['itemOptions'] : [];
    11.         //每个checkbox中的label是否需要编码
    12.         $encode = !isset($options['encode']) || $options['encode'];
    13.         $lines = [];
    14.         $index = 0;
    15.         foreach ($items as $value => $label) {
    16.                 //设置当前的checkbox是否选中,$selection可为字符串或者数组
    17.             $checked = $selection !== null &&
    18.                 (!is_array($selection) && !strcmp($value, $selection)
    19.                     || is_array($selection) && in_array($value, $selection));
    20.             if ($formatter !== null) {
    21.                     //如果设置了item回调函数,则使用回调函数的结果作为html表单
    22.                 $lines[] = call_user_func($formatter, $index, $label, $name, $checked, $value);
    23.             } else {
    24.                     //否则使用checkbox函数来生成checkbox表单
    25.                 $lines[] = static::checkbox($name, $checked, array_merge($itemOptions, [
    26.                     'value' => $value,
    27.                     'label' => $encode ? static::encode($label) : $label,
    28.                 ]));
    29.             }
    30.             $index++;
    31.         }

    32.         //如果设置了unselect,则生成一个hidden类型的input。当没有选择checkbox的时候,这个将作为默认值返回
    33.         if (isset($options['unselect'])) {
    34.             // add a hidden field so that if the list box has no option being selected, it still submits a value
    35.             $name2 = substr($name, -2) === '[]' ? substr($name, 0, -2) : $name;
    36.             $hidden = static::hiddenInput($name2, $options['unselect']);
    37.         } else {
    38.             $hidden = '';
    39.         }
    40.         
    41.         //每个checkbox表单html之间的分隔符
    42.         $separator = isset($options['separator']) ? $options['separator'] : "\n";

    43.         //所有的checkbox的外层容器标签
    44.         $tag = isset($options['tag']) ? $options['tag'] : 'div';
    45.         unset($options['tag'], $options['unselect'], $options['encode'], $options['separator'], $options['item'], $options['itemOptions']);

    46.         return $hidden . static::tag($tag, implode($separator, $lines), $options);
    47.     }
    复制代码


其他:
设置默认选定一个或多个初始值?比如
  1. <?= $form->field($model, 'hobby')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球']) ?>
复制代码

Controller中直接对$model->hobby设置值就可以了:
$model->hobby=‘1’ 或者 $model->hobby=['0','2']
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图  

GMT+8, 2016-12-10 20:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表