将动态css类添加到CGridView中的每个行/单元格

plu*_*ium 4 gridview yii

我是一名学生并致力于我的实际项目.它是一个Web应用程序,可跟踪关键字的谷歌排名并将其显示为表格.现在我想为每一行设置绿色,如果当前排名优于前一个,如果排名下降则为红色等.如何在Yii中使用CGridView实现此功能?目前我有以下解决方案.在ControllerClass中我有一个功能

public function getCssClass($data)
{
    $cssClass;

    if('($data->current_pos>$data->prev_pos) || ($data->current_pos===null && $data->prev_pos!==null)')
    {
        $cssClass='rdown';
    }
    elseif('$data->current_pos<$data->prev_pos')
    {
        $cssClass='rup';
    }
    else
    {
        $cssClass='requal';
    }

    return $cssClass;
}
Run Code Online (Sandbox Code Playgroud)

在视图中,我在'rowCssClassExpression'中调用此函数:

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'keyword-grid',
'dataProvider'=>$keywordDataProvider,
'rowCssClassExpression' => $this->getCssClass($data),
'columns'=>array(
    'keyword_name',
    array(
        'name'=>'current_pos',
        'htmlOptions'=>array('style'=>'text-align: center'),
    ),
    array(
        'name'=>'prev_pos',
        'htmlOptions'=>array('style'=>'text-align: center'),
    ),
    array(
        'name'=>'top_pos',
        'htmlOptions'=>array('style'=>'text-align: center'),
    ),
    'url',
    array(
        'class'=>'CButtonColumn',
        'template'=>'{view}{delete}',
        'viewButtonUrl'=>'Yii::app()->createUrl("/keyword/view", array("id"=>$data->id))',
        'deleteButtonUrl'=>'Yii::app()->createUrl("/keyword/delete", array("id"=>$data->id))',
    ),
),
'nullDisplay'=>'-',
)); ?>
Run Code Online (Sandbox Code Playgroud)

这是我的表:

关键字当前上一个

关键字1 7 7

关键字2 8 10

关键字3 26 20

但是html结果是每一行都得到了类'rdown'.我找不到我的错误:-(如果有人可以提供帮助并指出我正确的方向,我会非常感激.

Ezz*_*zze 5

'($data->current_pos>$data->prev_pos) || ($data->current_pos===null && $data->prev_pos!==null)'在你的方法中是一个字符串,它始终是true.这rdown就是返回的原因.你为什么'用来包裹这个条件?

还请注意,rowCssClassExpression是一个PHP表达式,所以可能你的方法的结果应该用引号括起来:

'rowCssClassExpression' => '"' . $this->getCssClass($data) . '"',
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于模型的实例$data是在rowCssClassExpression(并为网格的每一行进行评估)中定义的,而不是在视图的上下文中,因此这也不会起作用.

作为解决方案,您可以创建getCssClass模型的方法.然后你的表达式将如下所示:

'rowCssClassExpression' => '$data->getCssClass()',
Run Code Online (Sandbox Code Playgroud)

要指定每个特定小区的CSS类,你也可以看看cssClassExpressionCGridColumn类.