Menu items dinamici

Salve!

Sto cercando di creare un sistema per avere un menu di base minimale dove i vari controllers possono aggiungere voci.

Non ho capito bene quale sia il modo migliore per creare il menu di base all’avvio dell’applicazione, vorrei avere nel layout/main.php una cosa tipo :




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

			'items' => array(

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

				array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about'))

			),

		));



e poi dai controller far aggiungere item…

Non è che mi dareste qualche idea per partire?

Che cosa intendi con "dai controller far aggiungere item". Vorresti si creassero da sole delle voci di menu in base alle action presenti nei controller?

Ciao,

Non puoi modificare quel blocco nel layout con i controller , perché il controller lavora prima del layout, quindi devi avere un widget già predisposto per essere dinamico, tipo quello che ho io:


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

			'items'=>Menu::model()->createmenu()

		));

Ho infatti un model (che in maniera originale si chiama Menu) che mi crea l’array del menu, per ora in maniera fissa, poi lo farà pescando dal db le voci a seconda dell’utente.


function createMenu() {

        //in che modulo sono?

        if(Yii::app()->input->get('r'))

      {  $req = explode('/', Yii::app()->input->get('r')); $modulobase=$req[0];}

        else if(Yii::app()->user->getstate('modulo'))$modulobase= Yii::app()->user->getstate('modulo');

        else $modulobase='contabilita';

//        $menu=array();

//        $array=array();

//        $moduli = Yii::app()->db->createCommand()->select('m.*')

//                                     ->from('{{admin_ut2moduli}} u2m')

//                                     ->leftJoin('{{admin_moduli}}  m', 'u2m.modulo=m.id')

//                                     ->where(  "m.published >= :published",

//                                        array(':published' => 1 )

//                                            )

//                                     ->queryAll();

//                             var_dump($moduli);

//                             foreach ($moduli as $modulo) {

//                             $links= Yii::app()->db->createCommand()->select('m.*')

//                                      ->from('{{admin_ut2menu}} u2m')

//                                      ->leftJoin('{{admin_menu}}  m', 'u2m.modulo=m.id')

//                                      ->queryAll();

//                             if ($links){

//                                 foreach ($links as $link){

//                                     

//                                 }

//                                 //

//                                 if ($modulobase==$modulo['nome']) {

//                                     $array[0]=$littlemenu;

//                                 } else {$array[]=$littlemenu;}

//                             }

//                             

//                             }

        $array = array();

        $menu['access']=array();

        $menu['contabilita']=array('label' => 'Contabilita', 'url' => array('/contabilita/'));

        $items['contabilita']=array(

             array('label' => 'Piano dei Conti', 'url' => array('/contabilita/conti'))

            , array('label' => 'Prima Nota', 'url' => array('/contabilita/primanota'))

            , array('label' => 'Causali Contabili', 'url' => array('/contabilita/causalicontabili'))

                );

        $menu['vendite']=array('label' => 'Vendite', 'url' => array('/vendite/'));

        $items['vendite']=array(

               array('label' => 'Fatture', 'url' => array('/vendite/fatture'))

              ,array('label' => 'Clienti', 'url' => array('/vendite/clienti'))

              ,array('label' => 'Corrispettivi', 'url' => array('/vendite/corrispettivi'))

              ,array('label' => 'Effetti', 'url' => array('/vendite/effetti'))

              ,array('label' => 'Preventivi', 'url' => array('/vendite/preventivi'))

              ,array('label' => 'Ordini', 'url' => array('/vendite/ordini'))

              ,array('label' => 'DDT', 'url' => array('/vendite/ddt'))

              ,array('label' => 'Contratti', 'url' => array('/vendite/contratti'))

              ,array('label' => 'Agenti', 'url' => array('/vendite/agenti'))

            );

        $menu['anagrafica']= array('label' => 'anagrafica', 'url' => array('/anagrafica'));

        $items['administration']=array(

               array('label' => 'Utenti', 'url' => array('/administration/utenti'))

              ,array('label' => 'Moduli', 'url' => array('/administration/moduli'))

            );

               );

        $menu['administration']=array('label' => 'Amministrazione', 'url' => array('/administration/'));

        $menu['aziende']=array('label' => 'Aziende', 'url' => array('/aziende/'));

        $items['aziende']=array(

            array('label' => 'Amministrazione', 'url' => array('/administration/'))

            );

        $array[0]=$menu[$modulobase];

        if (isset($items[$modulobase])){

        foreach ($items[$modulobase] as $value) {

            $array[]=$value;

        }

        

        }

        $i=0;

        unset($menu[$modulobase]);

        foreach ($menu as $name => $vocimenu) {

            $array[0]['items'][$i]=$vocimenu;

            if (isset($items[$name])){

                foreach ($items[$name] as $voce){ $array[0]['items'][$i]['items'][]=$voce;}

            }

            $i++;

        }

        

        $array[] = array('label' => 'Login', 'url' => array('/access/login'), 'visible' => Yii::app()->user->isGuest);

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

        return $array;

    }

Immagino tu possa fare una cosa simile,

magari aggiungendo una funzione Aggiungi_voce() che puoi richiamare dai vari controller, modificando un array del model.

poi con la funzione createmenu() usi questo array, magari aggiungendo i controlli di login e logout e dovresti essere a posto.