Footer em um GridView

Ahe Galera,

Estou uma dificuldade em relação ao footer de um grid, tenho um grid que trabalha com valores onde no footer nas duas ultimas colunas eu gostaria de colocar o total.

Entao gostaria de saber como eu posso esta fazendo e personalizando este footer com estas duas colunas com os totais.

Desde ja agradeço.

Edson,

Vou postar um exemplo de um Carrinho de Compra que eu fiz, que tem somatória dos produtos no ‘footer’ do CGridView.

[size="4"]model/Carrinho.php[/size]




public function summaryTotal($session) {

        

        $carrinhos = Carrinho::model()->findAll(array('condition' => "sessao = '{$session}'"));

        foreach ($carrinhos as $carrinho) {


            $produto = Produto::model()->findByPk($carrinho->codproduto);

            $valor = $produto->valor * $carrinho->quant;


            if ($produto->desconto <> '0.00') {

                $desconto = ($produto->desconto / 100) * $produto->valor;

                $valor = $valor - $desconto;

            }

            $valorTotal += $valor;

        }

        

        $table = '<table border="0" width="100%" cellspacing="10" cellpadding="0" class="valorTotal">

                    <tr>

                        <td nowrap="nowrap" align="right" style="text-align: right" class="tdMarrom"><h2>Total</h2></td>

                        <td nowrap="nowrap" width="100" style="text-align: right" class="tdMarrom"><h2>R$ '.number_format($valorTotal, 2, ',', '.').'</h2></td>

                        <td width="1%" class="tdMarrom">&nbsp;</td>

                    </tr>

                </table>';

        if(Yii::app()->controller->action->id <> 'finalizar'){

            if(count(Carrinho::model()->findAll(array('condition'=>'sessao = :sessao','params'=>array(':sessao'=>$session)))) > 0){

                $table .= '<br /><div align="right">

                            <a href="'.Yii::app()->createUrl('sacola/finalizar').'"><img src="'.Yii::app()->baseUrl.'/images/bt-finalizar.jpg" class="marginBottom30px"></a>

                            </div>';

            }

        } else {

            $table .= CHtml::beginForm(Yii::app()->createUrl('sacola/gerarpedido'), 'post');

            $table .= '<table border="0" width="100%" cellspacing="10" cellpadding="0" class="valorTotal">

                        <tr>

                            <td nowrap="nowrap" align="right" style="text-align: right" class="tdMarrom"><h2>Forma de pagamento</h2></td>

                            <td nowrap="nowrap" width="185" style="text-align: right; vertical-align: middle;">'.CHtml::dropDownList('codformapagamento', '', CHtml::listData(Formapagamento::model()->findAll(array('condition' => 'liberar = :liberar', 'params' => array(':liberar' => 1))), 'codformapagamento', 'titulo'), array('class' => 'form185px-Select', 'style' => 'margin:0;', 'empty' => 'Selecione')).'</td>

                            <td width="1%" class="tdMarrom">&nbsp;</td>

                        </tr>

                    </table><br>';

            $table .= '<div align="right">

                    <a href="'.Yii::app()->createUrl('sacola').'"><img src="'.Yii::app()->baseUrl.'/images/bt-voltar.jpg" class="marginBottom30px"></a>

                    <button type="submit"><img src="'.Yii::app()->baseUrl.'/images/bt-comprar.jpg" class="marginBottom30px" /></button>

                    </div>';

            $table .= CHtml::endForm();

        }

        return $table;

    }



[size="4"]CGridView[/size]


$this->widget('zii.widgets.grid.CGridView', array(

    ...

    'summaryText' => Carrinho::model()->summaryTotal($session),

    ...

));

Ahi Newerton Blz

Deixa ver se eu entendi o footer pode ser personalizado atraves do sumaryText, esta é a unica formar. Sei que isso que vc me passou acho que ja resolve o meu problema mais gostaria de saber se existe outra forma so para agregar conhecimento?

Valew Brodi

Você pode personalizar o footer de cada coluna através do atributo "footer"

Ex:




                array(

                    'name'=>'valor',

                    'footer'=>'Conteúdo do Footer da Coluna Valor Aqui!',

                ),



Para o cálculo do total eu criei uma classe baseada neste wiki aqui

Keeping a running total in a CGridView

Só que o que é mostrado neste wiki mostra o total acumulado por linha e não o total geral no footer.

Para mostrar no footer fiz a seguinte alteração




Yii::import('zii.widgets.grid.CDataColumn');

 

class TotalFooterColumn extends CDataColumn {

 

    private $_total = 0;

 

    public function renderDataCellContent($row, $data) { // $row number is ignored

        echo $data->{$this->attribute}

 

        $this->_total += $data->{$this->attribute};

 

        $this->footer = $this->_total;

    }

}



Mudei de CGridColumn para CDataColumn para que assim eu pudesse utilizar o atributo $this->footer e tb usei o $data->{$this->attribute} para que esta classe possa ser utilizada em qualquer coluna sem ter que ficar alterando o código.

Depois basta formatar a coluna do CGridView assim:




                array(

                    'name'=>'valor',

                    'class'=>'TotalFooterColumn',

                    'attribute'=>'valor',

                ),



Legal eu nao sabia que tinha esta possiblidade de tratar os dados do grid

Valew mesmo

Amigos,

É possível colocar um footer como um subtotal do produtos por exemplo? Se não há como posso fazer isto??

Sds,