problema con Cmenu al intentar hacerlo dinamico con SQL

buenos dias!

estoy intentando hacer que el menu me cargue dinamicamente en funcion de una tabla en SQL

la situacion que tengo es la siguiente:


CREATE TABLE IF NOT EXISTS `tbl_content` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `varname` varchar(50) COLLATE utf8_spanish_ci NOT NULL,

  `titulo` varchar(255) COLLATE utf8_spanish_ci NOT NULL,

  `ruta` varchar(255) COLLATE utf8_spanish_ci NOT NULL,

  `permisos` int(3) NOT NULL,

  `showmenu` int(1) NOT NULL,

  `padre` int(11) NOT NULL,

  `content` text COLLATE utf8_spanish_ci NOT NULL,

  PRIMARY KEY (`id`)

)

ActiveMenu.php


<?php




Yii::import('zii.widgets.CMenu', true);


class ActiveMenu extends CMenu

{

    public function init()

    {

        // Here we define query conditions.

        $criteria = new CDbCriteria;

        $criteria->condition = '`showmenu` = 1';

        //$criteria->order = '`position` ASC';


        $items = Content::model()->findAll($criteria);


        foreach ($items as $item)

            $this->items[] = array('label'=>$item->titulo, 'url'=>$item->ruta);

    }

}

el main.php


<div id="mainmenu">

		<?php 

			


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

			'items'=>array(

				array('label'=>'Home', 'url'=>array('/site/index')),

				//define si es visible con usuario registrado

				array('label'=>'Contenido privado', 'url'=>array('/site/page', 'view'=>'about'),'visible'=>!Yii::app()->user->isGuest),

				array('label'=>'Contact', 'url'=>array('/site/contact')),	


				//array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),

				//array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)

				

				array('url'=>Yii::app()->getModule('user')->loginUrl, 'label'=>Yii::app()->getModule('user')->t("Login"), 'visible'=>Yii::app()->user->isGuest),

				array('url'=>Yii::app()->getModule('user')->registrationUrl, 'label'=>Yii::app()->getModule('user')->t("Register"), 'visible'=>Yii::app()->user->isGuest),

				array('url'=>Yii::app()->getModule('user')->profileUrl, 'label'=>Yii::app()->getModule('user')->t("Profile"), 'visible'=>!Yii::app()->user->isGuest),

				array('url'=>Yii::app()->getModule('user')->logoutUrl, 'label'=>Yii::app()->getModule('user')->t("Logout").' ('.Yii::app()->user->name.')', 'visible'=>!Yii::app()->user->isGuest)

				

			),

		)); 


		


		

		//para realizar la llamada $this->widget('application.components.ActiveMenu') sin "items" .

		$this->widget('application.components.ActiveMenu');




		?>

	</div><!-- mainmenu -->

y el error que lanza:


PHP notice


Undefined index: active


/var/www/yii/framework/zii/widgets/CMenu.php(190)


178      * Recursively renders the menu items.

179      * @param array $items the menu items to be rendered recursively

180      */

181     protected function renderMenuRecursive($items)

182     {

183         $count=0;

184         $n=count($items);

185         foreach($items as $item)

186         {

187             $count++;

188             $options=isset($item['itemOptions']) ? $item['itemOptions'] : array();

189             $class=array();

190             if($item['active'] && $this->activeCssClass!='')

191                 $class[]=$this->activeCssClass;

192             if($count===1 && $this->firstItemCssClass!==null)

193                 $class[]=$this->firstItemCssClass;

194             if($count===$n && $this->lastItemCssClass!==null)

195                 $class[]=$this->lastItemCssClass;

196             if($this->itemCssClass!==null)

197                 $class[]=$this->itemCssClass;

198             if($class!==array())

199             {

200                 if(empty($options['class']))

201                     $options['class']=implode(' ',$class);

202                 else


Stack Trace

#0 	

+

 /var/www/yii/framework/zii/widgets/CMenu.php(172): CMenu->renderMenuRecursive(array(array("label" => "Noticiones", "url" => "/site/page"), array("label" => "Ofertones", "url" => "/site/page")))

#1 	

+

 /var/www/yii/framework/zii/widgets/CMenu.php(159): CMenu->renderMenu(array(array("label" => "Noticiones", "url" => "/site/page"), array("label" => "Ofertones", "url" => "/site/page")))

#2 	

+

 /var/www/yii/framework/web/CBaseController.php(174): CMenu->run() 

.............

.........

.....

..

Alguien me puede ayudar , la verdad es que ya he mirado millones de foros

y no consigo entender por que me lanza ese error

estoy completamente atascado y no se por que

muchas gracias!!!!!!

:huh: :blink:

Modifica la linea 183 de CMenu por lo siguiente:

		if(&#036;item['active'] &amp;&amp; &#036;this-&gt;activeCssClass&#33;='')








		if(isset(&#036;item['active']) &amp;&amp; &#036;item['active'] &amp;&amp; &#036;this-&gt;activeCssClass&#33;='')

También agregá un ticket en Yii Development que después lo arreglo.

Sds,

Wow!!! muchisimas gracias!!!! por la rapidez :lol:

llevo poquito tiempo con este framework (cosa de una semana) pero la verdad es que me esta gustando muchísimo…

¿¿¿como se hace eso del ticket??? soy nuevo por aquí y ando un poco perdido en el foro :huh:

muchas gracias sebas!!!!

por cierto ademas de la solucion que da sebas (que si que funciona) hay otra manera mas "limpia" que no toca el core y que desconozco de si es mejor o peor pero que funciona sin tocar el core…


<?php




Yii::import('zii.widgets.CMenu', true);


class ActiveMenu extends CMenu

{

    public function init()

    {

        // Here we define query conditions.

        $criteria = new CDbCriteria;

        $criteria->condition = '`showmenu` = 1';

        //$criteria->order = '`position` ASC';


        $items = Content::model()->findAll($criteria);


        foreach ($items as $item)

            $this->items[] = array('label'=>$item->titulo, 'url'=>$item->ruta);

        parent::init();


    }

}



es decir, añadimos parent::init(); despues del foreach.

un saludo y gracias a todos (especialmente a sebas)