[Resolvido] Update Do Mestre Detalhe

Boa Noite

Estou montando uma sistema de pedidos com uma tela mestre detalhe com o cabeçalho(pedido) e seus itens. Estou conseguindo visualizar na view update o pedido e os itens. Mas so esta mostrando um itens e há quatro cadastrados

meu controller





    public function actionUpdate($id)

	{

		

       

                $model=$this->loadModel($id);

                //$items=$this->actionItens();

                $items=$this->loadItems($id);

		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['sysos']))

		{

			$model->attributes=$_POST['sysos'];

			if($model->save())

				$this->redirect(array('view','ID'=>$model->ID));

		}


		$this->render('update',array(

			'model'=>$model,

                        'items'=>$items,

                ));

	}







       public function loadItems($id)

	{

                $items=itenssysos::model()->find('IDSYSOS=:IDSYSOS', array(':IDSYSOS'=> $id,));

		//$items=itenssysos::model()->findByPk($id);

		if($items===null)

			 $items = new itenssysos;

                        //throw new CHttpException(404,'The requested page does not exist.');

		return $items;

               

	}



No load Itens , se eu substituir a função find() por findAll(), que eu acho que seria a mais correta ele gera um erro mostrando o pedido, mas não mostra nenhum item

Olá, você está certo… tem que usar o findall, porque o find traz apenas 1 registro.

Exemplos:

Seleção simples:




$array_itens=Vendas02::model()->findAll('id_venda=:id_venda', array(':id_venda'=>$id ));



Seleção complexa:




			$param = $_GET['term']; 

			$criteria = new CDbCriteria;

			$criteria->condition = "nome LIKE :sterm OR sobrenome LIKE :sterm OR id LIKE :sterm";

			$criteria->params = array(":sterm"=>"%$param%");

			$criteria->limit = 20;

			$models = Cliente::model()->findAll($criteria);



No caso de:

$items=itenssysos::model()->findAll(‘IDSYSOS=:IDSYSOS’, array(’:IDSYSOS’=> $id,));

$items já é uma array? Ou tenho de criar uma variável do tipo array e fazer um form com items para preencher a nova variável?

Junior,

Ele retorna um array de objetos.

Para percorrer todos os itens faz assim:


foreach($items as $item){

    echo $item->IDSYSOS;

}

Por curiosidade, ta usando firebird?

Uso Mysql

Fazendo o que vc falou pego os dados retornados e jogo no dataprovider do TbGridView para obter uma tabela, ou o TbGridView não consegue ler o dados devolvidos pelo findall?

O que não estou conseguindo entender é que se na linha


$items=itenssysos::model()->findAll('IDSYSOS=:IDSYSOS', array(':IDSYSOS'=>$id,));

eu substituir por find() consigo retornar o registro (um único) da variável $id, mas se coloco findAll() ele gera um erro que acredito esteja no dataprovider do TbGridView. Pois todos os campos acima do TbGridView são mostrados, mas abaixo nada é mostrado.

Junior,

Para os GridView ou ListView, eu aconselho usar o CActiveDataProvider ou em último caso dependendo da necessidade o CArrayDataProvider.

Mais vou postar um modelo do CActiveDataProvider, ai você adiciona no GridView/ListVIew.




$gridDataProvider = new CActiveDataProvider('itenssysos', array(

                    'criteria' => array(

                        'condition' => 'IDSYSOS=:IDSYSOS',

                        'params' => array(':IDSYSOS'=>$id),

                    ),

                    'pagination' => array('pageSize' => 10),

                ));


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

	'dataProvider'=>$gridDataProvider,

	'template'=>"{items}",

	'columns'=>array(),

));



obrigado