* @link http://www.yiiframework.com/ * @copyright 2008-2013 Yii Software LLC * @license http://www.yiiframework.com/license/ */ Yii::import('zii.widgets.grid.CGridColumn'); /** * CCheckBoxColumn represents a grid view column of checkboxes. * * CCheckBoxColumn supports no checking (read-only), single check and multiple checking. * The mode is determined according to {@link selectableRows}. When in multiple checking mode, the header cell will display * an additional checkbox, clicking on which will check or uncheck all of the checkboxes in the data cells. * The header cell can be customized by {@link headerTemplate}. * * Additionally selecting a checkbox can select a grid view row (depending on {@link CGridView::selectableRows} value) if * {@link selectableRows} is null (default). * * By default, the checkboxes rendered in data cells will have the values that are the same as * the key values of the data model. One may change this by setting either {@link name} or * {@link value}. * * @author Qiang Xue * @package zii.widgets.grid * @since 1.1 */ class CCheckBoxColumn extends CGridColumn { /** * @var string the attribute name of the data model. The corresponding attribute value will be rendered * in each data cell as the checkbox value. Note that if {@link value} is specified, this property will be ignored. * @see value */ public $name; /** * @var string a PHP expression that will be evaluated for every data cell and whose result will be rendered * in each data cell as the checkbox value. In this expression, you can use the following variables: * * The PHP expression will be evaluated using {@link evaluateExpression}. * * A PHP expression can be any PHP code that has a value. To learn more about what an expression is, * please refer to the {@link http://www.php.net/manual/en/language.expressions.php php manual}. */ public $value; /** * @var string a PHP expression that will be evaluated for every data cell and whose result will * determine if checkbox for each data cell is checked. In this expression, you can use the following variables: * * The PHP expression will be evaluated using {@link evaluateExpression}. * * A PHP expression can be any PHP code that has a value. To learn more about what an expression is, * please refer to the {@link http://www.php.net/manual/en/language.expressions.php php manual}. * @since 1.1.4 */ public $checked; /** * @var string a PHP expression that will be evaluated for every data cell and whose result will * determine if checkbox for each data cell is disabled. In this expression, you can use the following variables: * * The PHP expression will be evaluated using {@link evaluateExpression}. * * A PHP expression can be any PHP code that has a value. To learn more about what an expression is, * please refer to the {@link http://www.php.net/manual/en/language.expressions.php php manual}. * * Note that expression result will overwrite value set with checkBoxHtmlOptions['disabled']. * @since 1.1.13 */ public $disabled; /** * @var array the HTML options for the data cell tags. */ public $htmlOptions=array('class'=>'checkbox-column'); /** * @var array the HTML options for the header cell tag. */ public $headerHtmlOptions=array('class'=>'checkbox-column'); /** * @var array the HTML options for the footer cell tag. */ public $footerHtmlOptions=array('class'=>'checkbox-column'); /** * @var array the HTML options for the checkboxes. */ public $checkBoxHtmlOptions=array(); /** * @var integer the number of rows that can be checked. * Possible values: * * You may also call the JavaScript function $(gridID).yiiGridView('getChecked', columnID) * to retrieve the key values of the checked rows. * @since 1.1.6 */ public $selectableRows=null; /** * @var string the template to be used to control the layout of the header cell. * The token "{item}" is recognized and it will be replaced with a "check all" checkbox. * By default if in multiple checking mode, the header cell will display an additional checkbox, * clicking on which will check or uncheck all of the checkboxes in the data cells. * See {@link selectableRows} for more details. * @since 1.1.11 */ public $headerTemplate='{item}'; /** * Initializes the column. * This method registers necessary client script for the checkbox column. */ public function init() { if(isset($this->checkBoxHtmlOptions['name'])) $name=$this->checkBoxHtmlOptions['name']; else { $name=$this->id; if(substr($name,-2)!=='[]') $name.='[]'; $this->checkBoxHtmlOptions['name']=$name; } $name=strtr($name,array('['=>"\\[",']'=>"\\]")); if($this->selectableRows===null) { if(isset($this->checkBoxHtmlOptions['class'])) $this->checkBoxHtmlOptions['class'].=' select-on-check'; else $this->checkBoxHtmlOptions['class']='select-on-check'; return; } $cball=$cbcode=''; if($this->selectableRows==0) { //.. read only $cbcode="return false;"; } elseif($this->selectableRows==1) { //.. only one can be checked, uncheck all other $cbcode="jQuery(\"input:not(#\"+this.id+\")[name='$name']\").prop('checked',false);"; } elseif(strpos($this->headerTemplate,'{item}')!==false) { //.. process check/uncheck all $cball=<<id}_all',function() { var checked=this.checked; jQuery("input[name='$name']:enabled").each(function() {this.checked=checked;}); }); CBALL; $cbcode="jQuery('#{$this->id}_all').prop('checked', jQuery(\"input[name='$name']\").length==jQuery(\"input[name='$name']:checked\").length);"; } if($cbcode!=='') { $js=$cball; $js.=<<getClientScript()->registerScript(__CLASS__.'#'.$this->id,$js); } } /** * Renders the header cell content. * This method will render a checkbox in the header when {@link selectableRows} is greater than 1 * or in case {@link selectableRows} is null when {@link CGridView::selectableRows} is greater than 1. */ protected function renderHeaderCellContent() { if(trim($this->headerTemplate)==='') { echo $this->grid->blankDisplay; return; } $item = ''; if($this->selectableRows===null && $this->grid->selectableRows>1) $item = CHtml::checkBox($this->id.'_all',false,array('class'=>'select-on-check-all')); elseif($this->selectableRows>1) $item = CHtml::checkBox($this->id.'_all',false); else { ob_start(); parent::renderHeaderCellContent(); $item = ob_get_clean(); } echo strtr($this->headerTemplate,array( '{item}'=>$item, )); } /** * Renders the data cell content. * This method renders a checkbox in the data cell. * @param integer $row the row number (zero-based) * @param mixed $data the data associated with the row */ protected function renderDataCellContent($row,$data) { if($this->value!==null) $value=$this->evaluateExpression($this->value,array('data'=>$data,'row'=>$row)); elseif($this->name!==null) $value=CHtml::value($data,$this->name); else $value=$this->grid->dataProvider->keys[$row]; $checked = false; if($this->checked!==null) $checked=$this->evaluateExpression($this->checked,array('data'=>$data,'row'=>$row)); $options=$this->checkBoxHtmlOptions; if($this->disabled!==null) $options['disabled']=$this->evaluateExpression($this->disabled,array('data'=>$data,'row'=>$row)); $name=$options['name']; unset($options['name']); $options['value']=$value; $options['id']=$this->id.'_'.$row; echo CHtml::checkBox($name,$checked,$options); } }