DataColumn.php 3.96 KB
Newer Older
Qiang Xue committed
1 2 3 4 5 6 7
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

8 9
namespace yii\grid;

Qiang Xue committed
10 11 12 13 14 15 16 17 18 19 20 21 22
use yii\base\Model;
use yii\data\ActiveDataProvider;
use yii\db\ActiveQuery;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Inflector;

/**
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class DataColumn extends Column
{
23 24 25 26 27 28
	/**
	 * @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 [[header]] is not specified, the label associated with the attribute will be displayed.
	 */
Qiang Xue committed
29
	public $attribute;
30 31 32 33
	/**
	 * @var \Closure an anonymous function that returns the value to be displayed for every data model.
	 * If this is not set, `$model[$attribute]` will be used to obtain the value.
	 */
Qiang Xue committed
34
	public $value;
35 36 37
	/**
	 * @var string in which format should the value of each data model be displayed as (e.g. "text", "html").
	 * Supported formats are determined by the [[GridView::formatter|formatter]] used by the [[GridView]].
38 39
	 * Default format is "text" which will format the value as an HTML-encoded plain text when
	 * [[\yii\base\Formatter]] or [[\yii\i18n\Formatter]] is used.
40
	 */
41
	public $format = 'text';
Qiang Xue committed
42 43 44 45 46 47 48
	/**
	 * @var boolean whether to allow sorting by this column. If true and [[attribute]] is found in
	 * the sort definition of [[GridView::dataProvider]], then the header cell of this column
	 * will contain a link that may trigger the sorting when being clicked.
	 */
	public $enableSorting = true;
	/**
49 50 51 52 53 54 55
	 * @var string|array|boolean the HTML code representing a filter input (e.g. a text field, a dropdown list)
	 * that is used for this data column. This property is effective only when [[GridView::filterModel]] is set.
	 *
	 * - If this property is not set, a text field will be generated as the filter input;
	 * - If this property is an array, a dropdown list will be generated that uses this property value as
	 *   the list options.
	 * - If you don't want a filter for this data column, set this value to be false.
Qiang Xue committed
56 57 58 59 60 61 62 63 64 65 66
	 */
	public $filter;


	protected function renderHeaderCellContent()
	{
		if ($this->attribute !== null && $this->header === null) {
			$provider = $this->grid->dataProvider;
			if ($this->enableSorting && ($sort = $provider->getSort()) !== false && $sort->hasAttribute($this->attribute)) {
				return $sort->link($this->attribute);
			}
67 68 69 70
			$models = $provider->getModels();
			if (($model = reset($models)) instanceof Model) {
				/** @var Model $model */
				return $model->getAttributeLabel($this->attribute);
Qiang Xue committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
			} elseif ($provider instanceof ActiveDataProvider) {
				if ($provider->query instanceof ActiveQuery) {
					/** @var Model $model */
					$model = new $provider->query->modelClass;
					return $model->getAttributeLabel($this->attribute);
				}
			}
			return Inflector::camel2words($this->attribute);
		} else {
			return parent::renderHeaderCellContent();
		}
	}

	protected function renderFilterCellContent()
	{
		if (is_string($this->filter)) {
			return $this->filter;
		} elseif ($this->filter !== false && $this->grid->filterModel instanceof Model && $this->attribute !== null) {
			if (is_array($this->filter)) {
				return Html::activeDropDownList($this->grid->filterModel, $this->attribute, $this->filter, array('prompt' => ''));
			} else {
				return Html::activeTextInput($this->grid->filterModel, $this->attribute);
			}
		} else {
			return parent::renderFilterCellContent();
		}
	}

99
	protected function renderDataCellContent($model, $index)
Qiang Xue committed
100 101
	{
		if ($this->value !== null) {
102
			$value = call_user_func($this->value, $model, $index, $this);
Qiang Xue committed
103
		} elseif ($this->content === null && $this->attribute !== null) {
104
			$value = ArrayHelper::getValue($model, $this->attribute);
Qiang Xue committed
105
		} else {
106
			return parent::renderDataCellContent($model, $index);
Qiang Xue committed
107
		}
108
		return $this->grid->formatter->format($value, $this->format);
Qiang Xue committed
109 110
	}
}