Bom dia a todos,
Atualizando …
Despois de muito custo consegui atualizar a GridView com um novo DataProvider. (abaixo vou explicar como fiz)
Agora preciso de ajuda para conseguir enviar o DataProvider ativo da View -> Controller.
Já li algo sobre usar Session, mas estou com dúvidas e não sei se é bom.
Outra opção seria fazer um Foreach na View, "desconstruindo" o Array em vários campos ocultos na página. Assim eu poderia recuperá-los através do $_POST dentro do Controller.
O que é melhor fazer ? Existe outra opção ?
Abaixo segue a explicação de como atualizar uma CGridView a partir de um novo DataProviderArray, quando se clica em algum botão ajax.
Na minha View Principal, tenho um botão Adicionar Itens:
<script>
function allFine(data) {
$("#div_itens").html(data);
}
</script>
<?php $this->widget('bootstrap.widgets.TbButton', array(
'icon' => 'icon-plus',
'size' =>'medium',
'type' => 'warning',
'buttonType' => 'ajaxLink',
'url' => $this->createUrl('addItem'),
'ajaxOptions'=>array('type'=>'POST',
'success'=>'allFine',
),
)); ?>
No final desta página, tenho o comando abaixo:
<?php echo $this->renderPartial('_griditens', array('dp_itens'=>$dp_itens,)); ?>
Criei uma outra View, "_griditens.php" que contém apenas a GridView dos Itens, pois ela recebe apenas o $dp_itens.
Isso foi importante, para não ter que fazer Render de todos os Models.
Coloquei os botões "Editar" e "Excluir" para manipular os valores do mesmo jeito da Action addItens.
<div class="row-fluid" id="div_itens">
<div class="span10">
<?php
$this->widget('bootstrap.widgets.TbGridView',array(
'id'=>'itens-grid',
'template'=>"{items}",
'dataProvider'=>$dp_itens,
'type'=>'striped bordered condensed',
'columns'=>array(
array(
'name' => 'Produto',
'type' => 'raw',
'value' => 'CHtml::encode($data["produto"])'
),
array(
'name' => 'Qtde',
'type' => 'raw',
'value' => 'CHtml::encode($data["qtde"])'
),
array(
'name' => 'Valor',
'type' => 'raw',
'value' => 'CHtml::encode($data["valor"])'
),
array(
'name' => 'Desconto',
'type' => 'raw',
'value' => 'CHtml::encode($data["desconto"])'
),
array(
'name' => 'SubTotal',
'type' => 'raw',
'value' => 'CHtml::encode($data["subtotal"])'
),
array(
'htmlOptions' => array('nowrap'=>'nowrap'),
'class'=>'bootstrap.widgets.TbButtonColumn',
'template'=>'{update}{delete}',
'viewButtonUrl'=>null,
'updateButtonUrl'=>null,
'deleteButtonUrl'=>null,
'buttons'=>array(
'update' => array(
'url'=>'Yii::app()->controller->createUrl("editItem", array("id"=>$data["id"]))',
),
'delete' => array(
//'url'=>'Yii::app()->controller->createUrl("ports/delete", array("id"=>$data[id],"command"=>"delete"))',
),
),
),
),
));
?>
</div>
</div>
No meu controller, tenho a Action que é chamada:
public function actionAddItem()
{
if(!empty($_POST))
// se precisar fazer um loop em vários campos do $_POST, usar este comando
//while(list($key, $val) = each($_POST)) {
//echo $key."=".$val."<br>"; // so para ver os valores, nao é necessario
//}
// Cria um novo model limpo, da tabela itens
$model_itens_add=new Compras02;
$model_itens_add->unsetAttributes();
$produto = $_POST['searchproduto'];
$model_itens_add->id_produto = $_POST['add_id'];
$model_itens_add->qtde = $_POST['add_qtde'];
$model_itens_add->desconto = $_POST['add_desc'];
$model_itens_add->valor = $_POST['add_valor'];
////////////////////////////
// NESTE PONTO PRECISO TER O DATAPROVIDER ATUAL, PARA JUNTAR COM O NOVO REGISTRO
////////////////////////////
// Dados do GridView
$rawData=array(
array('id'=>1,
'produto'=>$produto,
'qtde'=>$model_itens_add->qtde,
'valor'=>$model_itens_add->valor,
'desconto'=>$model_itens_add->desconto,
'subtotal'=>($model_itens_add->qtde * $model_itens_add->valor) - $model_itens_add->desconto,
),
);
// Criando o novo Array para a Tabela GridView
// or using: $rawData=User::model()->findAll();
$dp_itens=new CArrayDataProvider($rawData, array(
'id'=>'id',
'sort'=>array(
'attributes'=>array(
'produto',
),
),
'pagination'=>array(
'pageSize'=>15,
),
));
// Nao é necessário, deixei aqui pra testar depois o merge de arrays
// Fazendo um Merge dos Arrays
//$data = $dp_itens->getData();
//$data[] = $model_itens_add;
//$dp_itens->setData($data);
// Devolvendo os valores para a página
$this->renderPartial('_griditens',array(
'dp_itens'=>$dp_itens,
));
}
Espero que seja útil para alguém !!!
Coloquei a tela em anexo para vocês verem como ficou. Lógico que ainda falta formatar os campos valores e etc.