This repository has been archived by the owner on Oct 8, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
68c03de
commit 16afb48
Showing
3 changed files
with
631 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
<?php | ||
|
||
namespace leandrogehlen\treegrid; | ||
|
||
use Closure; | ||
use Yii; | ||
use yii\base\Model; | ||
use yii\base\Object; | ||
use yii\data\ActiveDataProvider; | ||
use yii\db\ActiveQueryInterface; | ||
use yii\helpers\ArrayHelper; | ||
use yii\helpers\Html; | ||
use yii\helpers\Inflector; | ||
|
||
/** | ||
* Column is the base class of all [[TreeGrid]] column classes. | ||
* | ||
* @author Leandro Gehlen <[email protected]> | ||
*/ | ||
class TreeColumn extends Object { | ||
|
||
/** | ||
* @var TreeGrid the grid view object that owns this column. | ||
*/ | ||
public $grid; | ||
/** | ||
* @var string the header cell content. Note that it will not be HTML-encoded. | ||
*/ | ||
public $header; | ||
/** | ||
* @var string the footer cell content. Note that it will not be HTML-encoded. | ||
*/ | ||
public $footer; | ||
/** | ||
* @var callable This is a callable that will be used to generate the content of each cell. | ||
* The signature of the function should be the following: `function ($model, $key, $index, $column)`. | ||
* Where `$model`, `$key`, and `$index` refer to the model, key and index of the row currently being rendered | ||
* and `$column` is a reference to the [[Column]] object. | ||
*/ | ||
public $content; | ||
/** | ||
* @var boolean whether this column is visible. Defaults to true. | ||
*/ | ||
public $visible = true; | ||
/** | ||
* @var array the HTML attributes for the column group tag. | ||
* @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
*/ | ||
public $options = []; | ||
/** | ||
* @var array the HTML attributes for the header cell tag. | ||
* @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
*/ | ||
public $headerOptions = []; | ||
/** | ||
* @var array|\Closure the HTML attributes for the data cell tag. This can either be an array of | ||
* attributes or an anonymous function ([[Closure]]) that returns such an array. | ||
* The signature of the function should be the following: `function ($model, $key, $index, $column)`. | ||
* Where `$model`, `$key`, and `$index` refer to the model, key and index of the row currently being rendered | ||
* and `$column` is a reference to the [[Column]] object. | ||
* A function may be used to assign different attributes to different rows based on the data in that row. | ||
* | ||
* @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
*/ | ||
public $contentOptions = []; | ||
/** | ||
* @var array the HTML attributes for the footer cell tag. | ||
* @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
*/ | ||
public $footerOptions = []; | ||
|
||
/** | ||
* @var string the attribute name associated with this column. When neither [[content]] nor [[value]] | ||
* is specified, the value of the specified attribute will be retrieved from each data model and displayed. | ||
* | ||
* Also, if [[label]] is not specified, the label associated with the attribute will be displayed. | ||
*/ | ||
public $attribute; | ||
/** | ||
* @var string label to be displayed in the [[header|header cell]] and also to be used as the sorting | ||
* link label when sorting is enabled for this column. | ||
* If it is not set and the models provided by the GridViews data provider are instances | ||
* of [[\yii\db\ActiveRecord]], the label will be determined using [[\yii\db\ActiveRecord::getAttributeLabel()]]. | ||
* Otherwise [[\yii\helpers\Inflector::camel2words()]] will be used to get a label. | ||
*/ | ||
public $label; | ||
/** | ||
* @var boolean whether the header label should be HTML-encoded. | ||
* @see label | ||
* @since 2.0.1 | ||
*/ | ||
public $encodeLabel = true; | ||
/** | ||
* @var string|\Closure an anonymous function or a string that is used to determine the value to display in the current column. | ||
* | ||
* If this is an anonymous function, it will be called for each row and the return value will be used as the value to | ||
* display for every data model. The signature of this function should be: `function ($model, $key, $index, $column)`. | ||
* Where `$model`, `$key`, and `$index` refer to the model, key and index of the row currently being rendered | ||
* and `$column` is a reference to the [[DataColumn]] object. | ||
* | ||
* You may also set this property to a string representing the attribute name to be displayed in this column. | ||
* This can be used when the attribute to be displayed is different from the [[attribute]] that is used for | ||
* sorting and filtering. | ||
* | ||
* If this is not set, `$model[$attribute]` will be used to obtain the value, where `$attribute` is the value of [[attribute]]. | ||
*/ | ||
public $value; | ||
/** | ||
* @var string|array in which format should the value of each data model be displayed as (e.g. `"raw"`, `"text"`, `"html"`, | ||
* `['date', 'php:Y-m-d']`). Supported formats are determined by the [[GridView::formatter|formatter]] used by | ||
* the [[GridView]]. Default format is "text" which will format the value as an HTML-encoded plain text when | ||
* [[\yii\i18n\Formatter]] is used as the [[GridView::$formatter|formatter]] of the GridView. | ||
*/ | ||
public $format = 'text'; | ||
|
||
/** | ||
* Renders the header cell. | ||
*/ | ||
public function renderHeaderCell() | ||
{ | ||
return Html::tag('th', $this->renderHeaderCellContent(), $this->headerOptions); | ||
} | ||
|
||
/** | ||
* Renders the footer cell. | ||
*/ | ||
public function renderFooterCell() | ||
{ | ||
return Html::tag('td', $this->renderFooterCellContent(), $this->footerOptions); | ||
} | ||
|
||
/** | ||
* Renders a data cell. | ||
* @param mixed $model the data model being rendered | ||
* @param mixed $key the key associated with the data model | ||
* @param integer $index the zero-based index of the data item among the item array returned by [[GridView::dataProvider]]. | ||
* @return string the rendering result | ||
*/ | ||
public function renderDataCell($model, $key, $index) | ||
{ | ||
if ($this->contentOptions instanceof Closure) { | ||
$options = call_user_func($this->contentOptions, $model, $key, $index, $this); | ||
} else { | ||
$options = $this->contentOptions; | ||
} | ||
return Html::tag('td', $this->renderDataCellContent($model, $key, $index), $options); | ||
} | ||
|
||
/** | ||
* Renders the header cell content. | ||
* The default implementation simply renders [[header]]. | ||
* This method may be overridden to customize the rendering of the header cell. | ||
* @return string the rendering result | ||
*/ | ||
protected function renderHeaderCellContent() | ||
{ | ||
if ($this->header !== null || $this->label === null && $this->attribute === null) { | ||
return trim($this->header) !== '' ? $this->header : $this->grid->emptyCell; | ||
} | ||
|
||
$provider = $this->grid->dataProvider; | ||
|
||
if ($this->label === null) { | ||
if ($provider instanceof ActiveDataProvider && $provider->query instanceof ActiveQueryInterface) { | ||
/* @var $model Model */ | ||
$model = new $provider->query->modelClass; | ||
$label = $model->getAttributeLabel($this->attribute); | ||
} else { | ||
$models = $provider->getModels(); | ||
if (($model = reset($models)) instanceof Model) { | ||
/* @var $model Model */ | ||
$label = $model->getAttributeLabel($this->attribute); | ||
} else { | ||
$label = Inflector::camel2words($this->attribute); | ||
} | ||
} | ||
} else { | ||
$label = $this->label; | ||
} | ||
|
||
return $this->encodeLabel ? Html::encode($label) : $label; | ||
} | ||
|
||
/** | ||
* Renders the footer cell content. | ||
* The default implementation simply renders [[footer]]. | ||
* This method may be overridden to customize the rendering of the footer cell. | ||
* @return string the rendering result | ||
*/ | ||
protected function renderFooterCellContent() | ||
{ | ||
return trim($this->footer) !== '' ? $this->footer : $this->grid->emptyCell; | ||
} | ||
|
||
/** | ||
* Renders the data cell content. | ||
* @param mixed $model the data model | ||
* @param mixed $key the key associated with the data model | ||
* @param integer $index the zero-based index of the data model among the models array returned by [[GridView::dataProvider]]. | ||
* @return string the rendering result | ||
*/ | ||
protected function renderDataCellContent($model, $key, $index) | ||
{ | ||
if ($this->content === null) { | ||
return $this->grid->formatter->format($this->getDataCellValue($model, $key, $index), $this->format); | ||
} else { | ||
if ($this->content !== null) { | ||
return call_user_func($this->content, $model, $key, $index, $this); | ||
} else { | ||
return $this->grid->emptyCell; | ||
} | ||
} | ||
|
||
|
||
} | ||
|
||
/** | ||
* Returns the data cell value. | ||
* @param mixed $model the data model | ||
* @param mixed $key the key associated with the data model | ||
* @param integer $index the zero-based index of the data model among the models array returned by [[GridView::dataProvider]]. | ||
* @return string the data cell value | ||
*/ | ||
public function getDataCellValue($model, $key, $index) | ||
{ | ||
if ($this->value !== null) { | ||
if (is_string($this->value)) { | ||
return ArrayHelper::getValue($model, $this->value); | ||
} else { | ||
return call_user_func($this->value, $model, $key, $index, $this); | ||
} | ||
} elseif ($this->attribute !== null) { | ||
return ArrayHelper::getValue($model, $this->attribute); | ||
} | ||
return null; | ||
} | ||
|
||
|
||
} |
Oops, something went wrong.