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

时间:2013-08-06 07:39:48

标签: php yii

我正在使用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而言这是一个很好的方法,我的意思是改变模型中的显示?不应该只是用于数据库操作的模型吗?

1 个答案:

答案 0 :(得分:0)

不,这不是一个好方法。有许多替代方法会更好,例如:

让视图进行转换

不要在模型中做任何事情。当视图想要显示可点击锚点而不是裸ID时,它应该自己生成URL。这有点快速和肮脏(它将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指的是网格中的每个模型。