123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- /**
- * CCheckBoxColumn class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @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 <qiang.xue@gmail.com>
- * @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:
- * <ul>
- * <li><code>$row</code> the row number (zero-based)</li>
- * <li><code>$data</code> the data model for the row</li>
- * <li><code>$this</code> the column object</li>
- * </ul>
- * 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:
- * <ul>
- * <li><code>$row</code> the row number (zero-based)</li>
- * <li><code>$data</code> the data model for the row</li>
- * <li><code>$this</code> the column object</li>
- * </ul>
- * 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:
- * <ul>
- * <li><code>$row</code> the row number (zero-based)</li>
- * <li><code>$data</code> the data model for the row</li>
- * <li><code>$this</code> the column object</li>
- * </ul>
- * 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 <code>checkBoxHtmlOptions['disabled']</code>.
- * @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:
- * <ul>
- * <li>0 - the state of the checkbox cannot be changed (read-only mode)</li>
- * <li>1 - only one row can be checked. Checking a checkbox has nothing to do with selecting the row</li>
- * <li>2 or more - multiple checkboxes can be checked. Checking a checkbox has nothing to do with selecting the row</li>
- * <li>null - {@link CGridView::selectableRows} is used to control how many checkboxes can be checked.
- * Checking a checkbox will also select the row.</li>
- * </ul>
- * You may also call the JavaScript function <code>$(gridID).yiiGridView('getChecked', columnID)</code>
- * 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=<<<CBALL
- jQuery(document).on('click','#{$this->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.=<<<EOD
- jQuery(document).on('click', "input[name='$name']", function() {
- $cbcode
- });
- EOD;
- Yii::app()->getClientScript()->registerScript(__CLASS__.'#'.$this->id,$js);
- }
- }
- /**
- * Returns 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.
- * @return string the header cell content.
- * @since 1.1.16
- */
- public function getHeaderCellContent()
- {
- if(trim($this->headerTemplate)==='')
- return $this->grid->blankDisplay;
- 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
- $item=parent::getHeaderCellContent();
- return strtr($this->headerTemplate,array(
- '{item}'=>$item,
- ));
- }
- /**
- * Returns the data cell content.
- * This method renders a checkbox in the data cell.
- * @param integer $row the row number (zero-based)
- * @return string the data cell content.
- * @since 1.1.16
- */
- public function getDataCellContent($row)
- {
- $data=$this->grid->dataProvider->data[$row];
- 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;
- return CHtml::checkBox($name,$checked,$options);
- }
- }
|