Problema Carraydataprovider

Obtengo el siguiente error (una excepción):

CException

Propiedad "CArrayDataProvider"."idImeter" no se encuentra definida.

Por más vueltas que le doy no consigo solucionarlo, a ver si alguien me puede echar una manita.

El código es el siguiente.

Controlador:




public function actionIndex()

	{


            $model = new Zonas;

            // Lo que ve el administrador

            if (Yii::app()->getModule('user')->isAdmin()) {

                // Si hay alarmas recientes las mostramos

                $datos = Alarmas::model()->ultimasAlarmas(Yii::app()->user->id);

                //if (!$datos === false) {

                if($datos) {

                    //print "Alarmas";

                    $dataProvider = new CArrayDataProvider($datos);

                    //if (isset($dataProvider))

                        //print "<pre>";

                        //print_r($dataProvider);

                        //print "</pre>";

                        $this->render('/alarmas/popup',array('model'=>$model,'dataProvider'=>$dataProvider));

                }

                // En caso contrario mostramos las zonas

                else {

                    $dataProvider=new CActiveDataProvider('Zonas');

                    //echo "yee aqui";

                    //yii::app()->end();

                    $this->render('/zonas/index',array('dataProvider'=>$dataProvider,));

                }


            }

            else {        

.....



Vista:




<?php

//ob_start();

$this->beginWidget('zii.widgets.jui.CJuiDialog', array(

    'id'=>'alarmas',

    'themeUrl' => Yii::app()->theme->baseUrl.'/css/',

    'options'=>array(

        'title'=>'Alarmas',

        'autoOpen'=>true,

        'modal'=>true,

        'resizable'=>false,

        'top' => '50px',

        'width'=>'700',

        'height'=>'auto',

        'close'=>'js:function(event, ui){ location.href = "'. Yii::app()->createUrl('zonas/cerrarPopup',array('id'=>Yii::app()->user->id)) .'" }'

    ),

));

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

                'id'=>'alarmas-grid',

                //'cssFile'=>'css/screen.css',

                'dataProvider'=>$dataProvider,

                //'filter'=>$model,

                'columns'=>array(

                    array(

                        'header'=>'Zona',

                        'name' => 'idImeter.idEnsal.idZona.nombre',

                    ),

                    array(

                        'header'=>'Zonaz',

                        'name' => 'idImeter.idEnsal.idZona.id',

                    ),

                    array(

                        'header'=>'Sector',

                        'name' => 'idImeter.idEnsal.nombre',

                    ),

                    array(

                        'header'=>'Fecha',

                        'name' => 'fecha',

                    ),

                    array(

                        'header'=>'Caudal',

                        'name' => 'caudal',

                    ),

                    array(

                        'header'=>'% excedido',

                        'name' => 'prcjSuperado',

                    ),

                    array(

                        'class'=>'CButtonColumn',

                        'template'=>'{view}',

                        'buttons'=>array(

                            'update'=>array(

                                'url' => Yii::app()->createUrl("/zonas/view",array('id'=>idImeter.idEnsal.idZona.id)),

                            ),

                        ),  

                    ),

                ),

            )); 


$this->endWidget('zii.widgets.jui.CJuiDialog'); 

?>        



Modelo:




public function ultimasAlarmas($id) {

            

            // Obtenemos la ultima vez que el usuario ha leido las alarmas

            $criteria = new CDbCriteria();

            $criteria->compare('id_usuario',(int)$id);

            $fecha = UsuariosAlarmas::model()->find($criteria);

            

            // Obtenemos las entradas/salidas con alarma configurara y los parámetros de la alarma

            $criteria = new CDbCriteria;

            $criteria->select = array('t.id_ensal','(t.valor + ((t.porcentaje*t.valor)/100)) AS valor', 't.tipo');

            $alarms = Alarmas::model()->findAll($criteria);

            

            // Recorremos los resultados

            foreach ($alarms as $alarm) {

                $idEnsal = $alarm->id_ensal;

                $consumoAlarma = $alarm->valor;

                $tipoAlarma = $alarm->tipo;

                

                // Comprobamos si hay formula, para calcular la alarma haciendo los calculos oportunos

                $criteria = new CDbCriteria();

                $criteria->select = array('t.formula');

                $criteria->compare('id', (int)$idEnsal);

                $formula = Ensal::model()->find($criteria);

                $formula = $formula->formula;

               

                

                $criteria = new CDbCriteria();

                //if (empty($formula)) {

                    $criteria->select = array('t.id','MIN(t.caudal) as caudal','t.fecha','t.HLectura');

                    //echo "No hay formula<br />";

                //}

                $criteria->together = true;

                $criteria->group = 't.fecha';

                $criteria->with=array(

                'idImeter'=>array(

                    'joinType' => 'INNER JOIN',

                    'with' => array(

                        'idEnsal' => array(

                            'joinType' => 'INNER JOIN',

                            'select' => array('id','nombre'),

                            'with' => array(

                                'idZona' => array(

                                    'joinType' => 'INNER JOIN',  

                                    'select' => array('nombre', 'id')

                                )

                            )

                        )

                    )

                )); 

                

                if (!empty($formula)) {

                    Yii::import('application.controllers.EnsalController');

                    $criteria->compare('t.id_formula', (string)implode(EnsalController::extraerIdsFormula($formula))); 

                }    

                else {

                    $criteria->compare('idImeter.id_ensal', (int)$idEnsal);

                }

                //echo $consumoAlarma;

                // Entrada salida que estamos recorriendo

                //$criteria->compare('idEnsal.id', (int)$idEnsal);

                // Consumos que superen alarma

                //$criteria->compare('t.caudal', ' >= ' . $consumoAlarma);

                $criteria->having = "caudal >= ".(double)$consumoAlarma;

                if (isset($fecha->fecha)) {

                    //$fecha = $fecha->fecha;

                    $criteria->compare('t.fecha', ' > '. (string)$fecha->fecha);

                }

                // En caso de ser alarma nocturna

                if ($tipoAlarma == 1) {

                    // Obtenemos el horario nocturno configurado en la bd

                    $HInicioNoche = GConfig::model()->find(array('select'=>array('HInicioNoche')));

                    $HInicioNoche = $HInicioNoche->HInicioNoche;

                

                    $HFinNoche = GConfig::model()->find(array('select'=>array('HFinNoche')));

                    $HFinNoche = $HFinNoche->HFinNoche;

                    

                    $criteria->addBetweenCondition('t.HLectura', (string)$HInicioNoche, (string)$HFinNoche);

                    

                }

                $datos = Datos::model()->findAll($criteria);


                foreach ($datos as $dato) {

                    // Redondeamos el porcentaje ??

                    $prcjSuperado = round(($dato->caudal * 100) / $consumoAlarma) - 100;

                    $dato->prcjSuperado = $prcjSuperado;

                    //if (isset($dato->idImeter->idEnsal->idZona->id))

                        $dato->id_zona = $dato->idImeter->idEnsal->idZona->id;

                        //print $dato->zona;

                    //else 

                       //$dato->zona = '';  

                    

                    $res[] = $dato;

                    //print $dato->idImeter->idEnsal->idZona->id;

                    //print $dato->idImeter->idEnsal->idZona->id;

                    //print "<pre>";

                    //print_r($res);

                    //print "</pre>";

                }            

            }

            //return $res;

            return (isset($res)) ? $res : false ;

        }



Donde esta dando la excepción? si tienes las la linea mejor!, por cierto se te olvido poner la vista lol, y creo que allí es donde esta el problema

Ya esta puesta la vista que se me pasó y la excepción la aquí:




'url' => Yii::app()->createUrl("/zonas/view",array('id'=>idImeter.idEnsal.idZona.id)),



Quizás me equivoco, pero me parece que esa linea debería ser:




'url' => 'Yii::app()->createUrl("/zonas/view",array("id"=>idImeter.idEnsal.idZona.id))',



No así tampoco funciona :S

Todavía no asocio el error con esa linea pero vamos por parte a ver.

Mauricio tiene razón y el valor de URL tiene que ser un literal, lo único es que en url no puedes usar la notación por puntos como lo hacer en columns, en su lugar utiliza -> ejemplo




'url' => 'Yii::app()->createUrl("/zonas/view",array("id"=>$data->idImeter->idEnsal->idZona->id))',



donde $data es el objeto que contiene el valor de cada fila, ojo siempre va a ser $data así que no lo cambies.

Por otro lado no entiendo que estas definiendo el url del boton "update" pero en la declaración tienes este botón oculto!




 'template'=>'{view}',



Ya esta solucionado con la nomenclatura que me has mencionado y lo de "update" era una pequeña aclaración. Gracias a todo@s.