You are viewing revision #2 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version or see the changes made in this revision.
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
~~~
[sql]
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)
```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.
```php
$this->setState('group_id', $user->group_id);
```
Now call the widget
```php
$this->widget('zii.widgets.CMenu',array(
'id'=>'mynav',
'items'=>getMenuItems($group_id),
));
```
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.