【问题标题】:Add dynamic css class to every row/cell in CGridView将动态 css 类添加到 CGridView 中的每一行/单元格
【发布时间】:2012-10-22 10:32:26
【问题描述】:

我是一名学生,正在从事我的实际项目。它是一个网络应用程序,它跟踪谷歌关键词的排名并将它们显示为一个表格。现在我想把每一行都涂成绿色,如果当前排名比以前好,红色如果排名下降等等。我如何在 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;
}

在视图中,我将这个函数称为“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'=>'-',
)); ?>

这是我的桌子:

关键字当前上一个

关键字1 7 7

关键字2 8 10

关键字3 26 20

但是 html 结果是每一行都获得了类“rdown”。我找不到我的错误:-(如果有人可以帮助我并指出正确的方向,我将不胜感激。

【问题讨论】:

    标签: gridview yii


    【解决方案1】:

    您方法中的'($data-&gt;current_pos&gt;$data-&gt;prev_pos) || ($data-&gt;current_pos===null &amp;&amp; $data-&gt;prev_pos!==null)' 是一个字符串,它始终是true。这就是返回 rdown 的原因。为什么要用' 包装条件?

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

    'rowCssClassExpression' => '"' . $this->getCssClass($data) . '"',
    

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

    作为一种解决方案,您可以创建 getCssClass 作为模型的方法。那么你的表达式将如下所示:

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

    要为每个特定单元格指定 CSS 类,您还可以查看 cssClassExpressionCGridColumn 类。

    【讨论】:

    • 谢谢 Ezze。还是行不通。我将条件用引号括起来,因为如果我不使用引号,我将得不到任何价值。但你仍然是对的。有这样的条件是没有意义的。
    • 在我的 getCssClass() 我试过: $current_pos=$data->current_pos;并返回 gettype($current_pos)。结果为空。 $current_pos='$data->current_pos';在我的 html 中返回正确的值作为类名:7、8、26。但问题是,在浏览器中显示之前,函数本身中的 $current_pos 是一个包含“$data->current_pos”的字符串。所以我不能在我的 if 条件下使用它。当我尝试将 var 转换为 int 时,转换的结果始终为 0。另外,如果我使用 intval()。如何将 '$data->current_pos' 的值作为 int 值,以便在我的条件下正确使用它们?
    • 我仍然认为将rowCssClassExpression 指定为$this-&gt;getCssClass($data) 是错误的,因为$data 是仅在rowCssClassExpression 中定义的模型实例,它是CGridView 的字符串属性。在您的情况下,您调用 $this-&gt;getCssClass($data) 传递未定义的 $data 并且此调用的结果被视为确定 CSS 类的 PHP 表达式(但不是 CSS 类本身)。
    • 所以设置行类的正确方法可能是:'rowCssClassExpression' =&gt; '$this-&gt;getCssClass($data)'。但在这个表达式的上下文中,$this 是一个 CGridView 实例,但不是控制器。这就是为什么我建议您将 getCssClass 方法移动到您的模型 ('rowCssClassExpression' =&gt; '$data-&gt;getCssClass()') 并像往常一样使用 $this-&gt; 引用在方法中访问此模型的属性。 '$data-&gt;getCssClass()' 将被评估为 PHP 表达式,然后将调用模型的方法 getCssClass(),此调用的字符串结果将成为您行的 CSS 类。
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多