使用CArrayDataProvider对CGridView中的日期列进行排序

时间:2012-06-26 13:43:26

标签: php yii

我在网站上使用CGridView来显示通过CArrayDataProvider提供的数据。原因是,数据在不同的表中累积,并且增加了额外的计算列。 排序和过滤通常可以正常使用此代码(...被省略的列):

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'produkt-grid',
    'dataProvider'=>new CArrayDataProvider($betroffeneProdukte, array(
            'sort' => array(
                'attributes' => array(
                    'bezeichnung',
                    'datum',
                    ...
                ),
            ),
            'pagination' => false,
        )),
    'enableSorting' => true,
        'columns'=>array(
            array(
                'name'=>'bezeichnung',
                'header'=>'Bezeichnung',
                'value'=>'$data["bezeichnung"]',
            ),
            array(
                'name'=>'datum',
                'header'=>'datum',
                'value'=>'$data["datum"]',
            ),
            ...
        ),

));

问题是日期列。它正在排序为这样的字符串(德语格式): 01.10.2012,03.08.2012,10.01.2012,15.02.2012,...

我想像这样正确地对它进行排序: 10.01.2012,15.02.2012,03.08.2012,01.10.2012,...

任何人都有我的想法?

2 个答案:

答案 0 :(得分:1)

我认为您需要从数据源向您的CArrayDataProvider发送原始日期/日期时间字符串,然后使用CGridView格式化它:

array(
    'name'=>'datum',
    'header'=>'datum',
    'value'=>'$data["datum"]',
    'type'=>'date',
),

看起来你的问题是Yii认为你的日期是一个字符串(而不是一个日期)。如果您转向为DataProvider提供日期,则排序可能会自行解决。

答案 1 :(得分:1)

感谢您指点我正确的方向。实际上,我的示例中的“datum”列是一个字符串,因为我必须使用虚拟属性在我的应用程序中正确地格式化日期。现在我使用数据库中的原始日期列,并在视图中将其格式化为:

array(
  'name'=>'datecolumn',
  'header'=>'Eingangsdatum',
  'value'=>'Yii::app()->dateFormatter->formatDateTime(strtotime($data["datecolumn"]), "medium", null)',
),

=>瞧,德语显示,正确地能够排序。