0

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

$this->id = CHtml::link($this->id, array('/admin/auditTrail/view', 'id' => $this->id));

然而,这会改变每一次出现的id值——它在列表中、在详细信息页面中,甚至在面包屑中,这当然是不愿意的。如何决定在不同视图中使用哪种格式?例如,在面包屑中,view.php我只想要原始值,但在列表 ( admin.php) 中我想使用 html 链接,如下所示:

    'columns'=>array(
    array(
        'name' => 'id',
        'type' => 'html',
    ),

在单独的说明中 - 这是 MVC 方面的好方法,我的意思是改变模型中的显示?不应该是仅用于数据库操作的模型吗?

4

1 回答 1

0

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

让视图进行转换

不要在模型中做任何事情。当视图想要显示可点击的锚点而不是裸露的 id 时,它应该自己生成 URL。这有点快速和肮脏(它将 URL 生成的逻辑放在视图中,这并不理想)但它很简单,如果您只需要在一个或两个地方执行它,它就可以很好地工作。

将 URL 公开为单独的属性

在模型中放置一个计算的只读属性:

public function getAuditTrailUrl()
{
    return Yii::app()->createUrl('/admin/auditTrail/view',
                                 array('id' => $this->id));
}

然后,您可以auditTrailUrl在任何视图中使用该属性。这种方法的好处是 URL 生成对视图是不透明的,因此很容易修改。

您可以使用此语法轻松呈现来自这些 URL 的链接CDataGrid

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

根据文档,上述定义$data指的是网格中的每个模型。

于 2013-08-06T07:47:48.620 回答