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

将动态css类添加到CGridView中的每一行/单元格,gridview,yii,Gridview,Yii,我是一名学生,正在从事我的实践项目。它是一个web应用程序,跟踪谷歌关键词排名,并以表格形式显示。现在我想把每一行都涂成绿色,如果当前排名比前一行好,如果排名下降,则涂成红色,等等。我如何用CGridView在Yii中实现这一点?目前我有以下解决方案。在ControllerClass中,我有一个函数 public function getCssClass($data) { $cssClass; if('($data->current_pos>$data->pr

我是一名学生,正在从事我的实践项目。它是一个web应用程序,跟踪谷歌关键词排名,并以表格形式显示。现在我想把每一行都涂成绿色,如果当前排名比前一行好,如果排名下降,则涂成红色,等等。我如何用CGridView在Yii中实现这一点?目前我有以下解决方案。在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;
}
公共函数getCssClass($data)
{
$cssClass;
如果(“($data->current_pos>$data->prev_pos)| |($data->current_pos==null&&$data->prev_pos!==null)”)
{
$cssClass='rdown';
}
elseif(“$data->current\u posprev\u pos”)
{
$cssClass='rup';
}
其他的
{
$cssClass='requal';
}
返回$cssClass;
}
在视图中,我将此函数称为“rowcsslassexpression”:

<?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'=>'-',
)); ?>
'($data->current_pos>$data->prev_pos)| |($data->current_pos==null&&$data->prev_pos!==null)
方法中的($data->current_pos==null)
是一个字符串,它总是
true
。这就是返回
rdown
的原因。为什么要使用
来包装条件

还请注意,这是一个PHP表达式,因此您的方法的结果可能应该用引号括起来:

'rowCssClassExpression' => '"' . $this->getCssClass($data) . '"',
不幸的是,由于模型的实例
$data
是在
行csclassexpression
中定义的(并针对网格的每一行进行计算),而不是在视图的上下文中定义的,因此这将不起作用

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

'rowCssClassExpression' => '$data->getCssClass()',

要为每个特定单元格指定CSS类,您还可以查看
CGridColumn
class.

Thx Ezze。仍然不起作用。我将条件用引号括起来,因为如果我不使用引号,就不会得到任何值。但你仍然是对的。在我的getCssClass()中,我尝试了:$current\u pos=$data->current\u pos;并返回gettype($current\u pos)。结果为空$当前位置=“$data->当前位置”;在我的html中以类名的形式返回正确的值:7、8、26。但问题是,在浏览器中显示$current\u pos之前,函数本身中有一个包含“$data->current\u pos”的字符串。所以我不能在我的if条件下使用它。当我尝试将var转换为int时,转换的结果总是0。如果我使用intval()。如何将“$data->current_pos”的值作为int值获取,以便在我的条件下正确使用它们?我仍然认为将
rowcsslassexpression
指定为
$this->getCssClass($data)
是错误的,因为
$data
是仅在
rowcsslasexpression
中定义的模型实例,它是
CGridView
的字符串属性。在您的例子中,调用
$this->getCssClass($data)
传递未定义的
$data
,此调用的结果被视为确定CSS类的PHP表达式(但不是CSS类本身)。因此设置行类的正确方法可能是:
'rowcsslassexpression'=>“$this->getCssClass($data)
。但是在这个表达式的上下文中,
$this
是一个
CGridView
实例,而不是控制器。这就是为什么我建议您将
getCssClass
方法移动到您的模型(
'rowcsslassexpression'=>“$data->getCssClass()”
)中,并像往常一样使用
$this->
引用在方法中访问此模型的属性<代码>“$data->getCssClass()”将作为PHP表达式计算,然后将调用模型的方法
getCssClass()
,此调用的字符串结果将成为行的CSS类。