我有一个数据提供程序,可以生成如下内容:
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]。而不是那个零,我想要像迭代器这样的东西。在这种情况下,它会向我显示列中该属性的内容。
这可能吗?
答案 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);
},
),
),
));