我正在更改我的模型在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而言,这是一个好方法吗?我的意思是改变模型中的显示?模型不应该只用于数据库操作吗?
不,这不是一个好方法。有许多替代方法会更好,例如:
让视图进行转换
不要在模型中做任何事情。当视图想要显示可点击的锚点而不是裸id时,它应该自己生成URL。这有点快速和肮脏(它将URL生成的逻辑放在视图中,这并不理想),但它很容易,如果您只需要在一两个地方进行,它也能很好地工作。
将URL显示为单独的属性
在模型中放置计算的只读属性:
public function getAuditTrailUrl()
{
return Yii::app()->createUrl('/admin/auditTrail/view',
array('id' => $this->id));
}
然后,您可以在任何视图中使用auditTrailUrl
属性。这种方法的好处是URL生成对视图来说是不透明的,因此很容易修改。
您可以使用此语法在CDataGrid
:中轻松呈现这些URL的链接
'columns' => array(
array(
'class' => 'CLinkColumn',
'urlExpression' => '$data->auditTrailUrl',
)
),
在上面的定义中,$data
指的是网格中的每个模型,根据文档。