Ajuda em GridView

Galera mais uma vez recorro a vocês para sanar minha dificuldade.

Tenho 2 Classes / AR / Controllers que se relacionam:

Centro de Custo [Possui muitos]=> Modulos

1189

th_56807_database_122_471lo.JPG




/* Centro de custo */

class Centrocusto extends CActiveRecord

{

	public function relations()

	{


		return array(


			'moduloses' => array(self::HAS_MANY, 'Modulos', 'cdCentroCusto'),

/* Modulos */

class Modulos extends CActiveRecord

{

	public function relations()

	{

		return array(

			'cdCentroCusto0' => array(self::BELONGS_TO, 'Centrocusto', 'cdCentroCusto'),



Eu quero exibir na página de ‘admin’ um gridView (no padrão que vem com o Yii mesmo), sendo que os campos a serem exibidos são:

Nome do centro de Custo

Id do Modulo

Nome do Modulo

Status do Modulo




/**

 * This is the model class for table "mertoolv12.centrocusto".

 *

 * The followings are the available columns in table 'mertoolv12.centrocusto':

 * @property integer $cdCentroCusto

 * @property string $nmCentroCusto


 * This is the model class for table "mertoolv12.modulos".

 *

 * The followings are the available columns in table 'mertoolv12.modulos':

 * @property integer $cdCentroCusto

 * @property integer $cdModulo

 * @property string $nmModulo

 * @property integer $cdStatus



Sendo que no controller eu tento pegar todos os modulos com seus respectivos centro de custos:




		$model=Modulos::model()->with('cdCentroCusto0')->findAll();

		if($model===null)

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

                }

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

                        'model'=>$model,

		));



O erro que a página exibe é:

Não entendi como o retorno não esta sendo um objeto, eu tentei fazer ao contrario, selecionar todos os centros de custos com seus respectivos modulos, mas ai vi que no Grid eu estaria fazendo o inverso, sendo que não quero gerenciar/exibir no grid os centros de custos e sim os modulos dele.

Att

O retorno de findAll() não é um model (active record), e sim um array com varios Active record ,e ao usar ele como model na view ( $model->search() ) da um erro

Para corrigir isso faça MyModel::model()->search() ou use uma variable diferente para guardar o valor do findAll

Eu acho que não entendi sua resposta, tentei fazer o que você me informou mas não tive sucesso, eu entendi o que você falou que um $model da forma como estou selecionando me retorna um array de objetos, mas é o correto ja que estou passando esse array para um GridView estou entendendo certo?

Para tentar contornar a situação eu inverti novamente meu raciocinio, seleciono um centro de custo (o Id dele e passado como parâmetro), e tento exibir o centro de custo com todos os seus modulos.




  $Smodel=Centrocusto::model()->with('moduloses')->findByPk((int)$id);



E no view:




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

	'id'=>'modulos-grid',

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

        'columns'=>array(

               array(

                        'name'=>'sigla',

                        'value'=>'$data->sigla',

                ),

               array(

                        'name'=>'nmCentroCusto',

                        'value'=>'$data->nmCentroCusto',

                ),

                array(

                        'name'=>'moduloses.cdModulo',

                        'value'=>'$data->moduloses->cdModulo',

                ),

    		array(

			'class'=>'CButtonColumn',

		),


            ),

));



O label do campo de modulo (moduloses.cdModulo) ele retorna normalmente, mas o valor do campo ($data->moduloses->cdModulo) esta em branco no grid .

Att

Você está certo, deveria funcionar do jeito que estava …

o erro que estava dando era porque


'value'=>'$data->moduloses->cdModulo',



moduleses nao é um objecto as vezes … tente o seguinte, algo como:





'value'=>'($data->moduloses)?$data->moduloses->cdModulo:"sem modulo"'),




que vai previnir de acessar moduloses quando este não existe