2012-06-11 6 views
1

Возможно ли создать вложенную таблицу с помощью cgridview?yii - создать вложенный cgridview

Я хотел бы иметь окончательный вывод следующего

| Transaction  | Total | 
| T-001   | $100 | 
     | Item | Price |  // here is the nested table 
     | I-1 | $50 | 
     | I-2 | $50 | 
| T-002   | $90 | 
     | Item | Price |  // here is the nested table 
     | I-3 | $90 | 

Я знаю, что вы можете сделать это с помощью пользовательского шаблона, но я хотел бы аккуратнее решение, используя виджет как CGRidView.

Благодаря

ответ

1

Я думаю, что лучший способ добиться того, что вы хотите использовать пользовательские функции в модели CActiveRecord (если у Вас есть CActiveDataprovider для сетки), и положить, что «вложенной таблицы» в обычной колонке :

| Transaction | Item | Price | Total | 
------------------------------------------ 
| T-001  | I-1 | $50 |  $100 | 
       | I-2 | $50 | 
------------------------------------------ 
| T-002  | I-3 | $90 |  $90 | 
------------------------------------------ 

в вашей модели вы, чтобы определить ПОЛУЧИТЬ функции, которые возвращают данные в формате HTML с разрывами строк (например, с помощью BR:

class Item extends CActiveRecord { 
... 
public function getIdItems() 
{ 
    $string = ''; 
    foreach($this->items as $item) { 
     if ($string != '') $string .= '<br/>'; 
     $string .= ' '.$item->textId; // 'I-3', 'I-2'... 
    } 
    return $string; 
} 
public function getPriceItems() 
{ 
    $string = ''; 
    foreach($this->items as $item) { 
     if ($string != '') $string .= '<br/>'; 
     $string .= ' '.$item->price; // $50, $90... 
    } 
    return $string; 
} 
... 
} 

И показать-е е новые столбцы в сетке:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'anotacionesGrid', 
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     'transaction', 
     'idItems:html:Item', 
     'priceItems:html:Price', 
     'total' 
    ) 
); 
2

Если вложенные таблицы внутри ячейки, то вы можете просто создать функцию в вашей модели, которая будет оказывать таблицу и вернуть содержимое. Вы можете установить третий параметр функции виджетов в true для возврата содержимого. Если вы хотите включить разбивку на страницы для вложенной таблицы, убедитесь, что вручную задали идентификатор виджета и разрешили обновление ajax.

В модели:

function getNestedTable() { 

    return Yii::app()->controller->widget(..., ..., true); 

} 

В использовании определения столбцов:

'columns' => array(
    array(
    'name' => 'nestedTable', 
    'type' => 'raw' 
) 
)