0

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

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]。我想要一个迭代器之类的东西,而不是那个零。在这种情况下,它会在一列中显示该属性的内容。

这可能吗?

4

1 回答 1

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);
      },
    ),
  ),
));
于 2013-01-05T07:37:44.143 回答