Ajuda Com Master Detail

Pessoal,

Dando continuidade sobre o maste-detail eu segui o exemplo do Gustavo Gonçalves mas ainda estou patinando

Explicando a minha estrutura:

model Aplicacao.php

controller AplicacaoController

View create.php que chama via renderPartial _form.php onde o _form chama via renderPartial _form_detail.php

Segue a view _form.php




<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm',array(

	'id'=>'aplicacao-form',

	'enableAjaxValidation'=>true,

        'htmlOptions'=>array('class'=>'well'),

)); ?>

<p class="help-block">Campos com <span class="required">*</span> são obrigatórios.</p>


	<?php echo $form->textFieldRow($model,'descricao_apl',array('class'=>'span5','maxlength'=>255)); ?>


	<?php echo $form->textFieldRow($model,'msgdia_apl',array('class'=>'span1')); ?>


	<?php echo $form->checkBoxRow($model,'enviamsgnet_apl'); ?>


	<?php echo $form->checkBoxRow($model,'recebemsgnet_apl'); ?>


	<?php echo $form->checkBoxRow($model,'cxpostal_apl'); ?>


	<?php echo $form->checkBoxRow($model,'autentica_apl'); ?>


	<?php echo $form->textFieldRow($model,'uniresp_apl',array('class'=>'span5','maxlength'=>255)); ?>


	<?php echo $form->textFieldRow($model,'nomeresp_apl',array('class'=>'span5','maxlength'=>255)); ?>


	<?php echo $form->textFieldRow($model,'foneresp_apl',array('class'=>'span2','maxlength'=>100)); ?>


	<?php echo $form->textFieldRow($model,'emailresp_apl',array('class'=>'span5','maxlength'=>255)); ?>


	<?php //echo $form->textFieldRow($model,'solicitante_apl',array('class'=>'span5','maxlength'=>20)); ?>


	<?php //echo $form->textFieldRow($model,'autorizado_apl',array('class'=>'span5','maxlength'=>20)); ?>

<!-- FormDetail -->

        <hr>

        <fieldset>

            <legend>Servidores</legend>

        

            

         <div class="row">

             <div class="span4">

            <?php 

                echo CHtml::label('FQDN','1');

            ?>

            </div> 

            <div class="span3">

            <?php 

                echo CHtml::label('Endereço IP','1');

            ?>

            </div>  

         </div>

         <div class="row">

             <div class="span4">

            <?php 

                echo CHtml::textField('hostname_aplip', '', array('class'=>'span4'));

            ?>

            </div> 

            <div class="span3">

            <?php 

                echo CHtml::textField('ip_aplip');

            ?>

            </div>

            <div class="span1">

             <script>

                    function allFine(data) {

                            // display data returned from action

                            $("#div_itens").html(data);

                            // refresh your grid

                            //$.fn.yiiGridView.update('itens-grid');

                    }

            </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', 

                                       ),

                        

                )); ?>

            </div>

            <div class="row span8">

            

            <div class="row-fluid" id="div_itens">

            <div>

                

            <?php

            

                $aplip = new AplicacaoIp;

                $this->widget('bootstrap.widgets.TbGridView',array(

                        'id'=>'itens-grid',

                        'template'=>"{items}",  

                        'dataProvider'=>$aplip->search(),

                        'type'=>'striped bordered condensed',

                        //'ajaxUrl'=>array('ajaxCreate'),

                        'ajaxUpdate'=>true,

                        'columns'=>array(

                        array(

                                    'name' => 'Hostname',

                                    'type' => 'raw',

                                    'value' => 'CHtml::encode($data["hostname_aplip"])'

                                ),                              

                        array(

                                    'name' => 'Endereço IP',

                                    'type' => 'raw',

                                    'value' => 'CHtml::encode($data["ip_aplip"])'

                                ),                                                           

                        array(

                                'class'=>'bootstrap.widgets.TbButtonColumn',

                                'htmlOptions'=>array('style'=>'width: 50px'),

                                ),

                        ),

                )); 

                ?> 

                </div>

            </div>          

            </div>     

        </fieldset>




	<div class="form-actions">

		<?php $this->widget('bootstrap.widgets.TbButton', array(

			'buttonType'=>'submit',

			'type'=>'primary',

			'label'=>$model->isNewRecord ? 'Incluír' : 'Salvar',

		)); ?>

	</div>

<?php $this->endWidget(); ?>



Segue a view _form_detail.php




<div class="row-fluid" id="div_itens">

            <div>

                

            <?php

                $this->widget('bootstrap.widgets.TbGridView',array(

                        'id'=>'itens-grid',

                        'template'=>"{items}",  

                        'dataProvider'=>$db_itens,

                        'type'=>'striped bordered condensed',

                        'ajaxUrl'=>array('addItem'),

                        'ajaxUpdate'=>true,

                        'columns'=>array(

                        array(

                                    'name' => 'Hostname',

                                    'type' => 'raw',

                                    'value' => 'CHtml::encode($data["hostname_aplip"])'

                                ),                              

                        array(

                                    'name' => 'Endereço IP',

                                    'type' => 'raw',

                                    'value' => 'CHtml::encode($data["ip_aplip"])'

                                ),                                                           

                        array(

                                'class'=>'bootstrap.widgets.TbButtonColumn',

                                'htmlOptions'=>array('style'=>'width: 50px'),

                                ),

                        ),

                )); 

                ?> 

                </div>

            </div>   



O Controller




        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

               //}

                        

               $items = array();

               // Cria um novo model limpo, da tabela itens

               $items = new AplicacaoIp;

               

               $items->unsetAttributes();




               $items->hostname_aplip = $_REQUEST['hostname_aplip'];

               $items->ip_aplip       = $_REQUEST['ip_aplip'];

                                

               ////////////////////////////

               // NESTE PONTO PRECISO TER O DATAPROVIDER ATUAL, PARA JUNTAR COM O NOVO REGISTRO

               ////////////////////////////


                // Dados do GridView

                $rawData=array(

                        array('id'=>1, 

                                  'hostname_aplip'=>$items->hostname_aplip, 

                                  'ip_aplip'=>$items->ip_aplip, 

                                  ), 

                );

                

            // Criando o novo Array para a Tabela GridView    

            // or using: $rawData=User::model()->findAll();

            $db_itens = array();

            

            $db_itens = new CArrayDataProvider($rawData, array(

                    'id'=>'id',

                    'sort'=>array(

                       'attributes'=>array(

                           'hostname_aplip',

                       ),

                   ), 

                   'pagination'=>array(

                       'pageSize'=>15,

                    ),

            ));

            

            //print_r($db_itens);

            

            


                

                // Nao é necessário, deixei aqui pra testar depois o merge de arrays

                // Fazendo um Merge dos Arrays

                //$data = $db_itens->getData();

                //$data[] = $items;

                //$db_itens->setData($data);            


                // Devolvendo os valores para a página          

                $this->renderPartial('_form_detail',array('dataProvider'=>$db_itens));

        }



Bom o problema esta no carregamento do _form_detail.php onde o Yii retorna o erro




<h1>PHP Error [8]</h1>

<p>Undefined variable: dp_itens (/var/www/datamail/protected/controllers/AplicacaoController.php:237)</p>

<pre>#0 /var/www/datamail/protected/controllers/AplicacaoController.php(237): CWebApplication->handleError



Segue também a tela para analise

Uma obs estou usando a extensão Yii-bootstrap

Se alguém puder dar uma luz de como atualizar a CgridView

Obrigado a todos

Oi, bom dia Rodrigo.

Olhando rápido … vou dar um chute !

Parece que você está fazendo o renderPartial na action addItem com um nome de variável e no seu _form_detail está usando outro nome.

$this->renderPartial(’_form_detail’,array(’[size=“5”]dataProvider[/size]’=>$db_itens));

$this->widget(‘bootstrap.widgets.TbGridView’,array(

                    'id'=&gt;'itens-grid',


                    'template'=&gt;&quot;{items}&quot;,  


                    'dataProvider'=&gt;[b][size=&quot;5&quot;]&#036;db_itens[/size][/b],


                    'type'=&gt;'striped bordered condensed',


                    'ajaxUrl'=&gt;array('addItem'),


                    'ajaxUpdate'=&gt;true,


                    'columns'=&gt;array(

Coloque os dois do mesmo jeito que eu acho que vai dar certo.

Olá Gustavo obrigado pelas informações!

Olha de fato vc esta correto foi alterar, porém estou me deparando com esse erro




PHP notice


Trying to get property of non-object


/var/www/datamail/yii/framework/base/CComponent.php(606) : eval()'d code(1)




#1 	

–

 /var/www/datamail/protected/extensions/bootstrap/widgets/TbButtonColumn.php(60): CComponent->evaluateExpression("Yii::app()->controller->createUrl("view",array("id"=>$data->prim...", array("data" => array("id" => 1, "hostname_aplip" => "teste", "ip_aplip" => "teste"), "row" => 0))


55     {

56         if (isset($button['visible']) && !$this->evaluateExpression($button['visible'], array('row'=>$row, 'data'=>$data)))

57             return;

58 

59         $label = isset($button['label']) ? $button['label'] : $id;

60         $url = isset($button['url']) ? $this->evaluateExpression($button['url'], array('data'=>$data, 'row'=>$row)) : '#';

61         $options = isset($button['options']) ? $button['options'] : array();

62 

63         if (!isset($options['title']))

64             $options['title'] = $label;

Stack Trace


#16 	

–

 /var/www/datamail/protected/controllers/AplicacaoController.php(237): CController->renderPartial("_form_detail", array("db_itens" => CArrayDataProvider))


232                 $data = $db_itens->getData();

233                 $data[] = $items;

234                 $db_itens->setData($data);            

235 

236                 // Devolvendo os valores para a página          

237                 $this->renderPartial('_form_detail',array('db_itens'=>$db_itens));

238         }

239         

240       

241         

242 }






Ele ocorre no carregamento do _form_detail.php onde está a Grid. Executei um print_r em $db_itens e mesmo contém os dados do form.

Vc tem alguma luz?

Obrigado pela atenção

E aí brow…

O Bootstrap precisa do nowrap quando se usa botões na coluna de um grid.

Olha um exemplo:


array( 

'htmlOptions' => array('nowrap'=>'nowrap'),

'class'=>'bootstrap.widgets.TbButtonColumn'

)

http://yiibooster.clevertech.biz/widgets/grids/view/gridview.html

Abs,