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


How to display model data in various formats?

我正在更改我的模型在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指的是网格中的每个模型,根据文档。