Purpose
I thought I would share my experience trying to setup a database driven CMenu system. Hopefully this will help some people put together a database driven CMenu.
Here are the tables I created for the menu.
Menu & Menugroups
CREATE TABLE IF NOT EXISTS `menugroups` ( `id` int(11) NOT NULL AUTO_INCREMENT, `group_name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; CREATE TABLE IF NOT EXISTS `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `label` varchar(128) NOT NULL, `view_page` varchar(128) NOT NULL, `url` varchar(128) NOT NULL, `options` varchar(255) NOT NULL, `urloptions` varchar(255) NOT NULL, `description` text NOT NULL, `status` int(11) NOT NULL, `position` int(11) NOT NULL, `menu_group_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
In the layout file for my site I added the following funtion/code: (/protected/views/layouts/main.php)
function getMenuItems($id=null) { $results = Yii::app()->getDb()->createCommand(); $results->select('*')->from('menu'); $results->where('menu_group_id='.$id); $results->order('position ASC'); $results = $results->queryAll(); $items = array(); $addid = ""; $permissions = 1; foreach($results AS $result) { if(yii::app()->user->id){ /*This code helps to hide the login menu when logged in. Under options for login I set "IsGuest"*/ if(Yii::app()->user->isGuest<>1 & $result['options']<>'IsGuest') { $permissions = 1; } else { $permissions = 0; } if($result['urloptions']==1) { //I use this code to apply id to the URL this can be modified to suit your needs $addid = array($result['url'],'id'=>yii::app()->user->user_id); } else { $addid = array($result['url']); } } else { $addid = array($result['url']); } $items[] = array( 'label' => $result['label'], 'url' => $addid, 'visible' => $permissions, ); } return $items; } /*Checking if user has logged in and what group he is a member of. This will only work if you set the users group of your logged in user in your UserIdentity.php (authenticate function.) I do this because it is easier to assign menus to those groups. */ if(yii::app()->user->id) { $group_id = yii::app()->user->group_id; } else { $group_id = 4; }
Note this code must be added to UserIdentity.php under the authenticate function just after $this->errorCode=self::ERROR_NONE; This is because I am using user groups to help establish menu permissions.
$this->setState('group_id', $user->group_id);
Now call the widget
$this->widget('zii.widgets.CMenu',array( 'id'=>'mynav', 'items'=>getMenuItems($group_id), ));