类 yii\grid\GridView
GridView 小部件用于以表格形式显示数据。
基本用法如下所示
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'name',
'created_at:datetime',
// ...
],
]) ?>
表格的列配置使用 yii\grid\Column 类,这些类通过 $columns 配置。
表格视图的外观可以通过大量属性进行自定义。
有关 GridView 的更多详细信息和使用信息,请参阅 数据小部件指南文章。
公共属性
公共方法
受保护的方法
方法 | 描述 | 定义 |
---|---|---|
createDataColumn() | 根据格式为 "attribute:format:label" 的字符串创建 yii\grid\DataColumn 对象。 | yii\grid\GridView |
getClientOptions() | 返回网格视图 JS 小部件的选项。 | yii\grid\GridView |
guessColumns() | 如果 $columns 未显式指定,此函数尝试从给定数据中推断要显示的列。 | yii\grid\GridView |
initColumns() | 创建列对象并初始化它们。 | yii\grid\GridView |
事件
事件 | 类型 | 描述 | 定义 |
---|---|---|---|
EVENT_AFTER_RUN | yii\base\WidgetEvent | 在执行小部件后立即触发的事件。(从版本 2.0.11 开始可用) | yii\base\Widget |
EVENT_BEFORE_RUN | yii\base\WidgetEvent | 在执行小部件之前立即触发的事件。(从版本 2.0.11 开始可用) | yii\base\Widget |
EVENT_INIT | yii\base\Event | 通过 init() 初始化小部件时触发的事件。(从版本 2.0.11 开始可用) | yii\base\Widget |
常量
常量 | 值 | 描述 | 定义 |
---|---|---|---|
FILTER_POS_BODY | 'body' | yii\grid\GridView | |
FILTER_POS_FOOTER | 'footer' | yii\grid\GridView | |
FILTER_POS_HEADER | 'header' | yii\grid\GridView |
属性详细信息
在渲染每个数据模型 AFTER 之后调用的匿名函数。它应该具有与 $rowOptions 相似的签名。该函数的返回值将直接渲染。
在渲染每个数据模型 BEFORE 之前调用的匿名函数。它应该具有与 $rowOptions 相似的签名。该函数的返回值将直接渲染。
网格列配置。每个数组元素代表一个特定网格列的配置。例如,
[
['class' => SerialColumn::class],
[
'class' => DataColumn::class, // this line is optional
'attribute' => 'name',
'format' => 'text',
'label' => 'Name',
],
['class' => CheckboxColumn::class],
]
如果列是 yii\grid\DataColumn 类,则可以省略 "class" 元素。
作为快捷方式格式,可以使用字符串来指定仅包含 attribute、format 和/或 label 选项的数据列配置:"attribute:format:label"
。例如,上面的 "name" 列也可以指定为:"name:text:Name"
。 "format" 和 "label" 都是可选的。如果缺失,它们将采用默认值。
使用快捷方式格式,简单情况下的列配置如下所示
[
'id',
'amount:currency:Total Amount',
'created_at:datetime',
]
使用具有活动记录的 $dataProvider 时,您还可以显示来自相关记录的值,例如 author
关系的 name
属性
// shortcut syntax
'author.name',
// full syntax
[
'attribute' => 'author.name',
// ...
]
如果在配置数据列时未显式指定类名,则默认数据列类。默认为 'yii\grid\DataColumn'。
当单元格内容为空时,HTML 显示。此属性用于渲染没有定义内容的单元格,例如空的页脚或过滤器单元格。
注意,如果数据项为 null
,这不会被 yii\grid\DataColumn 使用。在这种情况下,nullDisplay 属性 $formatter 将用于指示空数据值。
渲染每个过滤器错误消息的选项。这主要用于 yii\helpers\Html::error() 在每个过滤器输入字段旁边渲染错误消息时。
渲染过滤器错误摘要的选项。有关如何指定选项的更多详细信息,请参阅 yii\helpers\Html::errorSummary()。
另请参阅 renderErrors()。
用于保存用户输入的过滤数据的模型。当此属性被设置时,GridView 将启用基于列的过滤。默认情况下,每个数据列将在顶部显示一个文本字段,用户可以在其中填写以过滤数据。
请注意,为了显示用于过滤的输入字段,列必须设置其 yii\grid\DataColumn::$attribute 属性,并且属性应在 $filterModel 的当前场景中处于活动状态,或者设置 yii\grid\DataColumn::$filter 作为输入字段的 HTML 代码。
当此属性未设置(null)时,过滤功能将被禁用。
是否在失去焦点时应用过滤器。留下一个通过 yiiGridView JS 管理过滤器的能力。
过滤器是否应该显示在 GridView 中。有效值包括
- FILTER_POS_HEADER: 过滤器将显示在每个列标题单元格的顶部。
- FILTER_POS_BODY: 过滤器将显示在每个列标题单元格的正下方。
- FILTER_POS_FOOTER: 过滤器将显示在每个列页脚单元格的下方。
过滤器行元素的 HTML 属性。
有关属性如何呈现的详细信息,请参见 yii\helpers\Html::renderTagAttributes()。
用于返回过滤结果的 URL。 yii\helpers\Url::to() 将被调用来规范化 URL。如果未设置,将使用当前控制器操作。当用户对任何过滤器输入进行更改时,当前过滤输入将作为 GET 参数附加到此 URL。
用于将模型属性值格式化为可显示文本的格式化程序。这可以是 yii\i18n\Formatter 的实例,也可以是用于创建 yii\i18n\Formatter 实例的配置数组。如果此属性未设置,将使用 "formatter" 应用程序组件。
表格表头的 HTML 属性。
有关属性如何呈现的详细信息,请参见 yii\helpers\Html::renderTagAttributes()。
确定 GridView 的不同部分如何组织的布局。以下标记将被替换为相应的节内容
{summary}
: 摘要部分。参见 renderSummary()。{errors}
: 过滤器模型错误摘要。参见 renderErrors()。{items}
: 列表项。参见 renderItems()。{sorter}
: 排序器。参见 renderSorter()。{pager}
: 分页器。参见 renderPager()。
GridView 容器标签的 HTML 属性。 "tag" 元素指定容器元素的标签名称,默认为 "div"。
有关属性如何呈现的详细信息,请参见 yii\helpers\Html::renderTagAttributes()。
表格主体行的 HTML 属性。这可以是一个数组,指定所有主体行的公共 HTML 属性,也可以是一个匿名函数,返回 HTML 属性的数组。匿名函数将为 $dataProvider 返回的每个数据模型调用一次。它应该具有以下签名
function ($model, $key, $index, $grid)
$model
: 当前正在渲染的数据模型$key
: 与当前数据模型关联的键值$index
: 数据模型在 $dataProvider 返回的模型数组中的零基索引$grid
: GridView 对象
有关属性如何呈现的详细信息,请参见 yii\helpers\Html::renderTagAttributes()。
表格元素的 HTML 属性。
有关属性如何呈现的详细信息,请参见 yii\helpers\Html::renderTagAttributes()。
方法详情
定义于: yii\base\Component::__call()
调用不是类方法的命名方法。
此方法将检查是否有任何附加的行为具有命名方法,如果可用,将执行它。
不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用。
public mixed __call ( $name, $params ) | ||
$name | string |
方法名称 |
$params | array |
方法参数 |
return | mixed |
方法返回值 |
---|---|---|
throws | yii\base\UnknownMethodException |
当调用未知方法时 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定义于: yii\base\BaseObject::__construct()
构造函数。
默认实现做了两件事
- 使用给定的配置
$config
初始化对象。 - 调用 init().
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是一个配置数组,如这里的
$config
。 - 在构造函数的末尾调用父实现。
public void __construct ( $config = [] ) | ||
$config | array |
将用于初始化对象属性的名称-值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义于: yii\base\Component::__get()
返回组件属性的值。
此方法将按以下顺序检查并相应地执行
- 由 getter 定义的属性:返回 getter 的结果
- 行为的属性:返回行为属性的值
不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行 $value = $component->property;
时会隐式调用。
另见 __set().
public mixed __get ( $name ) | ||
$name | string |
属性名称 |
return | mixed |
属性值或行为属性的值 |
---|---|---|
throws | yii\base\UnknownPropertyException |
如果属性未定义 |
throws | yii\base\InvalidCallException |
如果属性是只写的。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__isset()
检查属性是否已设置,即已定义且不为空。
此方法将按以下顺序检查并相应地执行
- 由 setter 定义的属性:返回属性是否已设置
- 行为的属性:返回属性是否已设置
- 对于不存在的属性返回
false
不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行 isset($component->property)
时会隐式调用。
public boolean __isset ( $name ) | ||
$name | string |
属性名称或事件名称 |
return | boolean |
命名属性是否已设置 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定义于: yii\base\Component::__set()
设置组件属性的值。
此方法将按以下顺序检查并相应地执行
- 通过 setter 方法定义的属性:设置属性值
- 事件,格式为 "on xyz":将处理程序附加到事件 "xyz"
- 行为,格式为 "as xyz":附加名为 "xyz" 的行为
- 行为的属性:设置行为的属性值
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $component->property = $value;
时会隐式调用。
另请参阅 __get().
public void __set ( $name, $value ) | ||
$name | string |
属性名称或事件名称 |
$value | mixed |
属性值 |
throws | yii\base\UnknownPropertyException |
如果属性未定义 |
---|---|---|
throws | yii\base\InvalidCallException |
如果属性是只读的。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__unset()
将组件属性设置为 null。
此方法将按以下顺序检查并相应地执行
- 通过 setter 方法定义的属性:将属性值设置为 null
- 行为的属性:将属性值设置为 null
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($component->property)
时会隐式调用。
public void __unset ( $name ) | ||
$name | string |
属性名称 |
throws | yii\base\InvalidCallException |
如果属性是只读的。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Widget::afterRun()
此方法在执行小部件后立即调用。
此方法将触发 EVENT_AFTER_RUN 事件。方法的返回值将用作小部件返回值。
如果你重写此方法,你的代码应该像下面这样
public function afterRun($result)
{
$result = parent::afterRun($result);
// your custom code here
return $result;
}
public mixed afterRun ( $result ) | ||
$result | mixed |
小部件返回结果。 |
return | mixed |
处理后的部件结果。 |
---|
public function afterRun($result)
{
$event = new WidgetEvent();
$event->result = $result;
$this->trigger(self::EVENT_AFTER_RUN, $event);
return $event->result;
}
定义于: yii\base\Component::attachBehavior()
将行为附加到此组件。
此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。
另请参阅 detachBehavior().
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | string |
行为的名称。 |
$behavior | string|array|yii\base\Behavior |
行为配置。它可以是以下之一:
|
return | yii\base\Behavior |
行为对象 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定义于: yii\base\Component::attachBehaviors()
将行为列表附加到组件。
每个行为都由其名称索引,并且应该是一个 yii\base\Behavior 对象,一个指定行为类的字符串,或一个用于创建行为的配置数组。
另请参阅 attachBehavior().
public void attachBehaviors ( $behaviors ) | ||
$behaviors | array |
要附加到组件的行为列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
定义于: yii\base\Widget::beforeRun()
此方法在执行小部件之前立即调用。
此方法将触发 EVENT_BEFORE_RUN 事件。方法的返回值将决定小部件是否应该继续运行。
重写此方法时,请确保调用父实现,如下所示
public function beforeRun()
{
if (!parent::beforeRun()) {
return false;
}
// your custom code here
return true; // or false to not run the widget
}
public boolean beforeRun ( ) | ||
return | boolean |
小部件是否应该继续执行。 |
---|
public function beforeRun()
{
$event = new WidgetEvent();
$this->trigger(self::EVENT_BEFORE_RUN, $event);
return $event->isValid;
}
启动小部件。
此方法创建调用类的实例。它将把配置应用于创建的实例。稍后应该调用匹配的 end() 调用。由于某些小部件可能使用输出缓冲,因此应该在同一个视图中调用 end() 调用,以避免破坏输出缓冲的嵌套。
另请参阅 end().
public static static begin ( $config = [] ) | ||
$config | array |
将用于初始化对象属性的名称-值对 |
return | yii\base\Widget |
新创建的小部件实例 |
---|
public static function begin($config = [])
{
$config['class'] = get_called_class();
/* @var $widget Widget */
$widget = Yii::createObject($config);
self::$stack[] = $widget;
return $widget;
}
定义于: yii\base\Component::behaviors()
返回此组件应该表现为的行为列表。
子类可以重写此方法来指定它们想要表现的行为。
此方法的返回值应该是一个行为对象或配置的数组,由行为名称索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组:
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
注意,行为类必须扩展自 yii\base\Behavior。行为可以使用名称或匿名附加。当使用名称作为数组键时,使用此名称,行为稍后可以使用 getBehavior() 检索,或使用 detachBehavior() 分离。匿名行为无法检索或分离。
在此方法中声明的行为将自动附加到组件(按需)。
public array behaviors ( ) | ||
return | array |
行为配置。 |
---|
public function behaviors()
{
return [];
}
定义于: yii\base\Component::canGetProperty()
返回一个值,指示是否可以读取属性。
如果可以读取属性:
- 类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 类具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可读属性(当
$checkBehaviors
为 true 时)。
另请参阅 canSetProperty().
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::canSetProperty()
返回一个值,指示是否可以设置属性。
如果属性可以被写入,则满足以下条件:
- 该类具有与指定名称关联的 setter 方法(在本例中,属性名称不区分大小写);
- 类具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可写属性(当
$checkBehaviors
为 true 时)。
另请参见 canGetProperty().
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否可以被写入 |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名。
public static string className ( ) | ||
return | string |
该类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
根据格式为 "attribute:format:label" 的字符串创建 yii\grid\DataColumn 对象。
protected yii\grid\DataColumn createDataColumn ( $text ) | ||
$text | string |
列规格字符串 |
return | yii\grid\DataColumn |
列实例 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果列规格无效 |
protected function createDataColumn($text)
{
if (!preg_match('/^([^:]+)(:(\w*))?(:(.*))?$/', $text, $matches)) {
throw new InvalidConfigException('The column must be specified in the format of "attribute", "attribute:format" or "attribute:format:label"');
}
return Yii::createObject([
'class' => $this->dataColumnClass ?: DataColumn::className(),
'grid' => $this,
'attribute' => $matches[1],
'format' => isset($matches[3]) ? $matches[3] : 'text',
'label' => isset($matches[5]) ? $matches[5] : null,
]);
}
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
行为的名称。 |
return | yii\base\Behavior|null |
已分离的行为。如果行为不存在,则为 null。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定义于: yii\base\Component::detachBehaviors()
从组件中分离所有行为。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
public static static end ( ) | ||
return | yii\base\Widget |
结束的小部件实例。 |
---|---|---|
throws | yii\base\InvalidCallException |
public static function end()
{
if (!empty(self::$stack)) {
$widget = array_pop(self::$stack);
$calledClass = get_called_class();
if (Yii::$container->has($calledClass) && isset(Yii::$container->getDefinitions()[$calledClass]['class'])) {
$calledClass = Yii::$container->getDefinitions()[$calledClass]['class'];
}
if (get_class($widget) === $calledClass) {
/* @var $widget Widget */
if ($widget->beforeRun()) {
$result = $widget->run();
$result = $widget->afterRun($result);
echo $result;
}
return $widget;
}
throw new InvalidCallException('Expecting end() of ' . get_class($widget) . ', found ' . get_called_class());
}
throw new InvalidCallException('Unexpected ' . get_called_class() . '::end() call. A matching begin() is not found.');
}
定义于: yii\base\Component::ensureBehaviors()
确保在 behaviors() 中声明的行为附加到此组件。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
定义于: yii\base\Component::getBehavior()
返回命名行为对象。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | string |
行为名称 |
return | yii\base\Behavior|null |
行为对象,如果行为不存在,则为 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定义于: yii\base\Component::getBehaviors()
返回附加到此组件的所有行为。
public yii\base\Behavior[] getBehaviors ( ) | ||
return | yii\base\Behavior[] |
附加到该组件的行为列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
返回网格视图 JS 小部件的选项。
protected array getClientOptions ( ) | ||
return | array |
选项 |
---|
protected function getClientOptions()
{
$filterUrl = isset($this->filterUrl) ? $this->filterUrl : Yii::$app->request->url;
$id = $this->filterRowOptions['id'];
$filterSelector = "#$id input, #$id select";
if (isset($this->filterSelector)) {
$filterSelector .= ', ' . $this->filterSelector;
}
return [
'filterUrl' => Url::to($filterUrl),
'filterSelector' => $filterSelector,
];
}
返回小部件的 ID。
public string|null getId ( $autoGenerate = true ) | ||
$autoGenerate | boolean |
如果之前没有设置 ID,是否生成 ID |
return | string|null |
部件的 ID。 |
---|
public function getId($autoGenerate = true)
{
if ($autoGenerate && $this->_id === null) {
$this->_id = static::$autoIdPrefix . static::$counter++;
}
return $this->_id;
}
定义于: yii\base\Widget::getView()
返回可用于渲染视图或视图文件的视图对象。
render() 和 renderFile() 方法将使用此视图对象来实现实际的视图渲染。如果未设置,它将默认为“view”应用程序组件。
public yii\web\View getView ( ) | ||
return | yii\web\View |
可用于渲染视图或视图文件的视图对象。 |
---|
public function getView()
{
if ($this->_view === null) {
$this->_view = Yii::$app->getView();
}
return $this->_view;
}
public string getViewPath ( ) | ||
return | string |
包含此小部件视图文件的目录。 |
---|
public function getViewPath()
{
$class = new ReflectionClass($this);
return dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'views';
}
如果 $columns 未显式指定,此函数尝试从给定数据中推断要显示的列。
protected void guessColumns ( ) |
protected function guessColumns()
{
$models = $this->dataProvider->getModels();
$model = reset($models);
if (is_array($model) || is_object($model)) {
foreach ($model as $name => $value) {
if ($value === null || is_scalar($value) || is_callable([$value, '__toString'])) {
$this->columns[] = (string) $name;
}
}
}
}
定义于: yii\base\Component::hasEventHandlers()
返回一个值,指示是否将任何处理程序附加到命名事件。
public boolean hasEventHandlers ( $name ) | ||
$name | string |
事件名称 |
return | boolean |
是否为此事件绑定了任何处理器。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定义于: yii\base\Component::hasMethod()
返回一个值,指示是否定义了方法。
如果定义了方法,则
- 类具有指定名称的方法
- 附加的行为具有给定名称的方法(当
$checkBehaviors
为真时)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkBehaviors | boolean |
是否将行为的方法视为此组件的方法 |
return | boolean |
方法是否已定义 |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::hasProperty()
返回一个值,指示是否为此组件定义了属性。
如果定义了属性,则
- 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
- 类具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的属性(当
$checkBehaviors
为真时)。
另请参阅
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
初始化网格视图。
此方法将初始化必需的属性值并实例化 $columns 对象。
public void init ( ) |
public function init()
{
parent::init();
if ($this->formatter === null) {
$this->formatter = Yii::$app->getFormatter();
} elseif (is_array($this->formatter)) {
$this->formatter = Yii::createObject($this->formatter);
}
if (!$this->formatter instanceof Formatter) {
throw new InvalidConfigException('The "formatter" property must be either a Format object or a configuration array.');
}
if (!isset($this->filterRowOptions['id'])) {
$this->filterRowOptions['id'] = $this->options['id'] . '-filters';
}
$this->initColumns();
}
创建列对象并初始化它们。
protected void initColumns ( ) |
protected function initColumns()
{
if (empty($this->columns)) {
$this->guessColumns();
}
foreach ($this->columns as $i => $column) {
if (is_string($column)) {
$column = $this->createDataColumn($column);
} else {
$column = Yii::createObject(array_merge([
'class' => $this->dataColumnClass ?: DataColumn::className(),
'grid' => $this,
], $column));
}
if (!$column->visible) {
unset($this->columns[$i]);
continue;
}
$this->columns[$i] = $column;
}
}
定义于: yii\base\Component::off()
从该组件中分离现有的事件处理程序。
此方法与 on() 相反。
注意:如果为事件名称传递了通配符模式,则仅使用此通配符注册的处理器将被删除,而使用与该通配符匹配的简单名称注册的处理器将保留。
另请参阅 on()。
public boolean off ( $name, $handler = null ) | ||
$name | string |
事件名称 |
$handler | callable|null |
要删除的事件处理器。如果为空,则将删除附加到命名事件的所有处理器。 |
return | boolean |
如果找到并分离了处理器 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
将事件处理程序附加到事件。
事件处理器必须是有效的 PHP 回调。以下是一些示例
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
事件处理器必须使用以下签名定义,
function ($event)
其中 $event
是一个 yii\base\Event 对象,其中包含与事件关联的参数。
从 2.0.14 开始,您可以将事件名称指定为通配符模式
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
另请参阅 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | string |
事件名称 |
$handler | callable |
事件处理器 |
$data | mixed |
触发事件时传递给事件处理器的數據。当调用事件处理器时,可以通过 yii\base\Event::$data 访问此數據。 |
$append | boolean |
是否将新的事件处理器附加到现有处理器列表的末尾。如果为假,则新的处理器将被插入到现有处理器列表的开头。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
定义于: yii\base\Widget::render()
渲染视图。
要渲染的视图可以以下列格式之一指定
- 路径别名(例如 "@app/views/site/index");
- 应用程序内的绝对路径(例如 "//site/index"):视图名称以双斜杠开头。实际的视图文件将在应用程序的 视图路径 下查找。
- 模块内的绝对路径(例如 "/site/index"):视图名称以单个斜杠开头。实际的视图文件将在当前活动模块的 视图路径 下查找。
- 相对路径(例如 "index"):实际的视图文件将在 $viewPath 下查找。
如果视图名称不包含文件扩展名,它将使用默认扩展名 .php
。
public string render ( $view, $params = [] ) | ||
$view | string |
视图名称。 |
$params | array |
应在视图中提供的参数(名称-值对)。 |
return | string |
渲染结果。 |
---|---|---|
throws | yii\base\InvalidArgumentException |
如果视图文件不存在。 |
public function render($view, $params = [])
{
return $this->getView()->render($view, $params, $this);
}
渲染标题元素。
public boolean|string renderCaption ( ) | ||
return | boolean|string |
渲染的标题元素或 |
---|
public function renderCaption()
{
if (!empty($this->caption)) {
return Html::tag('caption', $this->caption, $this->captionOptions);
}
return false;
}
渲染列组 HTML。
public boolean|string renderColumnGroup ( ) | ||
return | boolean|string |
列组 HTML 或 |
---|
public function renderColumnGroup()
{
foreach ($this->columns as $column) {
/* @var $column Column */
if (!empty($column->options)) {
$cols = [];
foreach ($this->columns as $col) {
$cols[] = Html::tag('col', '', $col->options);
}
return Html::tag('colgroup', implode("\n", $cols));
}
}
return false;
}
public string renderEmpty ( ) | ||
return | string |
渲染结果 |
---|
public function renderEmpty()
{
if ($this->emptyText === false) {
return '';
}
$options = $this->emptyTextOptions;
$tag = ArrayHelper::remove($options, 'tag', 'div');
return Html::tag($tag, $this->emptyText, $options);
}
渲染过滤器模型的验证器错误。
public string renderErrors ( ) | ||
return | string |
渲染结果。 |
---|
public function renderErrors()
{
if ($this->filterModel instanceof Model && $this->filterModel->hasErrors()) {
return Html::errorSummary($this->filterModel, $this->filterErrorSummaryOptions);
}
return '';
}
定义于: yii\base\Widget::renderFile()
渲染视图文件。
public string renderFile ( $file, $params = [] ) | ||
$file | string |
要渲染的视图文件。这可以是文件路径或 路径别名. |
$params | array |
应在视图中提供的参数(名称-值对)。 |
return | string |
渲染结果。 |
---|---|---|
throws | yii\base\InvalidArgumentException |
如果视图文件不存在。 |
public function renderFile($file, $params = [])
{
return $this->getView()->renderFile($file, $params, $this);
}
渲染过滤器。
public string renderFilters ( ) | ||
return | string |
渲染结果。 |
---|
public function renderFilters()
{
if ($this->filterModel !== null) {
$cells = [];
foreach ($this->columns as $column) {
/* @var $column Column */
$cells[] = $column->renderFilterCell();
}
return Html::tag('tr', implode('', $cells), $this->filterRowOptions);
}
return '';
}
渲染网格视图的数据模型。
public string renderItems ( ) | ||
return | string |
表格的 HTML 代码 |
---|
public function renderItems()
{
$caption = $this->renderCaption();
$columnGroup = $this->renderColumnGroup();
$tableHeader = $this->showHeader ? $this->renderTableHeader() : false;
$tableBody = $this->renderTableBody();
$tableFooter = false;
$tableFooterAfterBody = false;
if ($this->showFooter) {
if ($this->placeFooterAfterBody) {
$tableFooterAfterBody = $this->renderTableFooter();
} else {
$tableFooter = $this->renderTableFooter();
}
}
$content = array_filter([
$caption,
$columnGroup,
$tableHeader,
$tableFooter,
$tableBody,
$tableFooterAfterBody,
]);
return Html::tag('table', implode("\n", $content), $this->tableOptions);
}
定义于: yii\widgets\BaseListView::renderPager()
渲染分页器。
public string renderPager ( ) | ||
return | string |
渲染结果 |
---|
public function renderPager()
{
$pagination = $this->dataProvider->getPagination();
if ($pagination === false || $this->dataProvider->getCount() <= 0) {
return '';
}
/* @var $class LinkPager */
$pager = $this->pager;
$class = ArrayHelper::remove($pager, 'class', LinkPager::className());
$pager['pagination'] = $pagination;
$pager['view'] = $this->getView();
return $class::widget($pager);
}
渲染指定名称的部分。
如果命名部分不受支持,则将返回 false。
public string|boolean renderSection ( $name ) | ||
$name | string |
部分名称,例如, |
return | string|boolean |
部分的渲染结果,或者如果命名部分不受支持,则为 false。 |
---|
public function renderSection($name)
{
switch ($name) {
case '{errors}':
return $this->renderErrors();
default:
return parent::renderSection($name);
}
}
定义于: yii\widgets\BaseListView::renderSorter()
渲染排序器。
public string renderSorter ( ) | ||
return | string |
渲染结果 |
---|
public function renderSorter()
{
$sort = $this->dataProvider->getSort();
if ($sort === false || empty($sort->attributes) || $this->dataProvider->getCount() <= 0) {
return '';
}
/* @var $class LinkSorter */
$sorter = $this->sorter;
$class = ArrayHelper::remove($sorter, 'class', LinkSorter::className());
$sorter['sort'] = $sort;
$sorter['view'] = $this->getView();
return $class::widget($sorter);
}
定义于: yii\widgets\BaseListView::renderSummary()
渲染摘要文本。
public void renderSummary ( ) |
public function renderSummary()
{
$count = $this->dataProvider->getCount();
if ($count <= 0) {
return '';
}
$summaryOptions = $this->summaryOptions;
$tag = ArrayHelper::remove($summaryOptions, 'tag', 'div');
if (($pagination = $this->dataProvider->getPagination()) !== false) {
$totalCount = $this->dataProvider->getTotalCount();
$begin = $pagination->getPage() * $pagination->pageSize + 1;
$end = $begin + $count - 1;
if ($begin > $end) {
$begin = $end;
}
$page = $pagination->getPage() + 1;
$pageCount = $pagination->pageCount;
if (($summaryContent = $this->summary) === null) {
return Html::tag($tag, Yii::t('yii', 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.', [
'begin' => $begin,
'end' => $end,
'count' => $count,
'totalCount' => $totalCount,
'page' => $page,
'pageCount' => $pageCount,
]), $summaryOptions);
}
} else {
$begin = $page = $pageCount = 1;
$end = $totalCount = $count;
if (($summaryContent = $this->summary) === null) {
return Html::tag($tag, Yii::t('yii', 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.', [
'begin' => $begin,
'end' => $end,
'count' => $count,
'totalCount' => $totalCount,
'page' => $page,
'pageCount' => $pageCount,
]), $summaryOptions);
}
}
if ($summaryContent === '') {
return '';
}
return Html::tag($tag, Yii::$app->getI18n()->format($summaryContent, [
'begin' => $begin,
'end' => $end,
'count' => $count,
'totalCount' => $totalCount,
'page' => $page,
'pageCount' => $pageCount,
], Yii::$app->language), $summaryOptions);
}
渲染表格主体。
public string renderTableBody ( ) | ||
return | string |
渲染结果。 |
---|
public function renderTableBody()
{
$models = array_values($this->dataProvider->getModels());
$keys = $this->dataProvider->getKeys();
$rows = [];
foreach ($models as $index => $model) {
$key = $keys[$index];
if ($this->beforeRow !== null) {
$row = call_user_func($this->beforeRow, $model, $key, $index, $this);
if (!empty($row)) {
$rows[] = $row;
}
}
$rows[] = $this->renderTableRow($model, $key, $index);
if ($this->afterRow !== null) {
$row = call_user_func($this->afterRow, $model, $key, $index, $this);
if (!empty($row)) {
$rows[] = $row;
}
}
}
if (empty($rows) && $this->emptyText !== false) {
$colspan = count($this->columns);
return "<tbody>\n<tr><td colspan=\"$colspan\">" . $this->renderEmpty() . "</td></tr>\n</tbody>";
}
return "<tbody>\n" . implode("\n", $rows) . "\n</tbody>";
}
渲染表格标题。
public string renderTableHeader ( ) | ||
return | string |
渲染结果。 |
---|
public function renderTableHeader()
{
$cells = [];
foreach ($this->columns as $column) {
/* @var $column Column */
$cells[] = $column->renderHeaderCell();
}
$content = Html::tag('tr', implode('', $cells), $this->headerRowOptions);
if ($this->filterPosition === self::FILTER_POS_HEADER) {
$content = $this->renderFilters() . $content;
} elseif ($this->filterPosition === self::FILTER_POS_BODY) {
$content .= $this->renderFilters();
}
return "<thead>\n" . $content . "\n</thead>";
}
使用给定的数据模型和键渲染表格行。
public string renderTableRow ( $model, $key, $index ) | ||
$model | mixed |
要渲染的数据模型 |
$key | mixed |
与数据模型关联的键 |
$index | integer |
数据模型在 $dataProvider 返回的模型数组中的从零开始的索引。 |
return | string |
渲染结果 |
---|
public function renderTableRow($model, $key, $index)
{
$cells = [];
/* @var $column Column */
foreach ($this->columns as $column) {
$cells[] = $column->renderDataCell($model, $key, $index);
}
if ($this->rowOptions instanceof Closure) {
$options = call_user_func($this->rowOptions, $model, $key, $index, $this);
} else {
$options = $this->rowOptions;
}
$options['data-key'] = is_array($key) ? json_encode($key) : (string) $key;
return Html::tag('tr', implode('', $cells), $options);
}
运行小部件。
public void run ( ) |
public function run()
{
$view = $this->getView();
GridViewAsset::register($view);
$id = $this->options['id'];
$options = Json::htmlEncode(array_merge($this->getClientOptions(), ['filterOnFocusOut' => $this->filterOnFocusOut]));
$view->registerJs("jQuery('#$id').yiiGridView($options);");
parent::run();
}
设置小部件的 ID。
public void setId ( $value ) | ||
$value | string |
小部件的 ID。 |
public function setId($value)
{
$this->_id = $value;
}
定义于: yii\base\Widget::setView()
设置此小部件要使用的视图对象。
public void setView ( $view ) | ||
$view | yii\base\View |
可用于渲染视图或视图文件的视图对象。 |
public function setView($view)
{
$this->_view = $view;
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | string |
事件名称 |
$event | yii\base\Event|null |
事件实例。如果未设置,将创建一个默认的 yii\base\Event 对象。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
public static string widget ( $config = [] ) | ||
$config | array |
将用于初始化对象属性的名称-值对 |
return | string |
小部件的渲染结果。 |
---|---|---|
throws | 异常 |
public static function widget($config = [])
{
ob_start();
ob_implicit_flush(false);
try {
/* @var $widget Widget */
$config['class'] = get_called_class();
$widget = Yii::createObject($config);
$out = '';
if ($widget->beforeRun()) {
$result = $widget->run();
$out = $widget->afterRun($result);
}
} catch (\Exception $e) {
// close the output buffer opened above if it has not been closed already
if (ob_get_level() > 0) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
// close the output buffer opened above if it has not been closed already
if (ob_get_level() > 0) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean() . $out;
}
注册 或者 登录 发表评论。