我正在使用afterFind()
方法更改模型提供的数据,因此id
是可点击的文字,如下所示:
$this->id = CHtml::link($this->id, array('/admin/auditTrail/view', 'id' => $this->id));
然而,这会改变id
值的每一次出现 - 它在列表中,在详细页面中,甚至在面包屑中,当然不愿意。我如何决定在不同视图中使用哪种格式?例如,在breadcrumbs和view.php
中我只想要原始值,但在列表中(admin.php
)我想使用html链接,如下所示:
'columns'=>array(
array(
'name' => 'id',
'type' => 'html',
),
单独注意 - 就MVC而言这是一个很好的方法,我的意思是改变模型中的显示?不应该只是用于数据库操作的模型吗?
答案 0 :(得分:0)
不,这不是一个好方法。有许多替代方法会更好,例如:
不要在模型中做任何事情。当视图想要显示可点击锚点而不是裸ID时,它应该自己生成URL。这有点快速和肮脏(它将URL生成的逻辑放在视图中,这是不理想的)但它很容易,如果你只需要在一两个地方做它就能很好地工作。
在模型中放置一个计算出的只读属性:
public function getAuditTrailUrl()
{
return Yii::app()->createUrl('/admin/auditTrail/view',
array('id' => $this->id));
}
然后,您可以在任何视图中使用auditTrailUrl
属性。这种方法的好处是URL生成对视图不透明,因此很容易修改。
您可以使用此语法轻松地在CDataGrid
:
'columns' => array(
array(
'class' => 'CLinkColumn',
'urlExpression' => '$data->auditTrailUrl',
)
),
在上面的定义$data
中,documentation指的是网格中的每个模型。