Yii 1.1: Database Driven CMenu

4 followers

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),
             ));

Be the first person to leave a comment

Please to leave your comment.

Write new article
  • Written by: Preacher
  • Updated by: CeBe
  • Category: Tutorials
  • Yii Version: 1.1
  • Votes: No votes yet
  • Viewed: 3,307 times
  • Created on: Jan 23, 2014
  • Last updated: Apr 14, 2014