有GridView一个加载某个模型的数据提供者Test。
该模型有一个吸气剂:
/***
* @return string Идентификатор объекта
*/
public function getIdentifier() {
return $this->type . $this->code . $this->number;
}
如果GridView这样写:
<?= GridViewAdvanced::widget([
'dataProvider' => $testDataProvider,
'columns' => [
[
'label' => 'Идентификатор',
'value' => function($model) {
return $model->identifier;
}
],
],
]); ?>
一切都显示得很漂亮。
但是,我想使它只能通过名称访问,就好像它是数据库中的一个字段一样,并且效果相似。例子:
<?= GridViewAdvanced::widget([
'dataProvider' => $testDataProvider,
'columns' => [
'name',
'date',
'identifier' // вот тут значение моего виртуального поля
],
]); ?>
如果我只是在模型中创建public $identifier;并attributeLabels指定值,那么我只会得到一个空值。我想要一些经过计算的东西。
这可以以某种方式完成吗?如何?
如果有属性,
public $identifier;你需要稍微改变一下getter:public $identifier;但是完全删除该属性并保留您的吸气剂会更正确。然后它会自动触发对该属性的任何访问。唯一的事情是您必须指定
labelinGridView,但这可以使用简写语法来完成:attribute:format:label. 那些。在您的示例中,它看起来像这样:阅读有关列输出的更多信息 -此处。
一种方法是将
afterFind虚拟字段定义/覆盖添加到模型方法:接着