Php 如何以各种格式显示模型数据?

Php 如何以各种格式显示模型数据?,php,yii,Php,Yii,我在afterFind()方法中更改模型提供的数据,因此id是可单击的文本,如下所示: $this->id = CHtml::link($this->id, array('/admin/auditTrail/view', 'id' => $this->id)); 'columns'=>array( array( 'name' => 'id', 'type' => 'html', ), 然而,这会

我在
afterFind()
方法中更改模型提供的数据,因此
id
是可单击的文本,如下所示:

$this->id = CHtml::link($this->id, array('/admin/auditTrail/view', 'id' => $this->id));
    'columns'=>array(
    array(
        'name' => 'id',
        'type' => 'html',
    ),
然而,这会改变
id
值的每一次出现-它出现在列表中,在细节页面中,甚至在面包屑中,这当然是不愿意的。如何决定在不同视图中使用哪种格式?例如,在面包屑和
view.php
中,我只需要原始值,但在列表(
admin.php
)中,我希望使用html链接,如下所示:

$this->id = CHtml::link($this->id, array('/admin/auditTrail/view', 'id' => $this->id));
    '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生成对视图是不透明的,因此很容易修改

您可以使用此语法在
CDATA网格中轻松呈现来自这些URL的链接:

'columns' => array(
    array(
        'class'         => 'CLinkColumn',
        'urlExpression' => '$data->auditTrailUrl',
    )
),

在上面的定义中,
$data
指的是网格中的每个模型,根据。

我必须添加适当的类,如下所示:
'class'=>'CLinkColumn',
-这有意义吗,对吗?它不起作用,因为未定义属性“TbDataColumn.urlExpression”。
错误。@petiar:是的,它是正确的——忘记提到它是我的错误,对此表示抱歉。我现在编辑了答案,将其包括在内。