CGridView显示来自dataProvider的数据

时间:2013-01-04 23:13:20

标签: arrays yii dataprovider cgridview

我有一个数据提供程序,可以生成如下内容:

array(
    [0] => ParentObjects array(
         Child1Object array(...),
         Child2Object array(...),
    )
)

此数组的第一级始终为1。 我想在CGridView中显示两个孩子的内容。

$dataProvider=new CActiveDataProvider('Campanii', array(
    'criteria'=>array(
        'with'=>array('stocs','produse'),
    ),
    'pagination'=>array(
        'pageSize'=>20,
    ),
)); 
$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$dataProvider,
        'columns'=>array(
                    array('name'=>'Cod','value'=>'$data->stocs[0]->cod_produs'),
                ),
));

如您所见,列cod的值为array('name'=>'Cod','value'=>'$data->stocs[1]->cod_produs')。注意[0]。而不是那个零,我想要像迭代器这样的东西。在这种情况下,它会向我显示列中该属性的内容。

这可能吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以编写任何您想要的复杂表达式。但是,为了便于阅读,最好使用实际功能。这个例子假设PHP 5.3+,如果您的环境不支持,只需创建一个普通函数而不是匿名函数(或找到一个更好的环境)。

$this->widget('zii.widgets.grid.CGridView', array(
  'dataProvider' => $dataProvider,
  'columns' => array(
    array(
      'name' => 'Cod',

      // needed when returning HTML instead of plain text
      'type' => 'raw',

      // this function is called each time a cell needs to be rendered
      'value' => function(Companii $data) {
        $codes = array();
        foreach($data->stocs as $stoc) {
          $code = CHtml::encode($stoc->cod_produs);
          $codes []= CHtml::tag('li', array(), $code);
        }

        $codes = implode("\n", $codes);
        return CHtml::tag('ul', array(), $codes);
      },
    ),
  ),
));