Komponent :
<?php
class tabMenuComponent extends Object
{
var $controller = true;
var $user_model = 'User';
var $group_model = 'Group';
var $menu_model = 'Menu';
var $melement_model = 'Melement';
var $msubelemen_model = 'Msubelement';
var $components = array('Session');
function startup(&$controller)
{
$this->controller = $controller;
}
function init($group_id){
$menu = $this->controller->{$this->user_model}->{$this->group_model}->{$this->menu_model}->findAll(array('Menu.group_id'=>$group_id),null,null,null,null,2);
$this->Session->write('full_menu', $menu[0]);
}
function getMenu(){
return $this->Session->read('full_menu');
}
}
?>
Helper:
<?php
class tabMenuHelper extends Helper{
var $helpers = array('Html');
var $li_class_main = "activated";
var $li_class_sub = "activated_sub";
var $main_menu_container = 'tnavmenu';
var $sub_menu_container = 'tnavsubmenu';
function showMenu($menu, $sub = true){
$submenu = '';
$result = "<div id=\"" . $this->main_menu_container . "\"><ul>\n";
foreach ($menu['Melement'] as $melement){
$result.=$this->getMenuElement($melement, $submenu, $sub);
}
$result .= "</ul></div>\n";
if ($sub)
$result .= "<div id=\"". $this->sub_menu_container ."\"><ul>" . $submenu . "</ul></div>\n";
return $result;
}
function getSubmenuElement($submenu){
$result = '';
foreach ($submenu as $subelement){
if($this->getActionNameCurrentPath() == $this->getActionNameLinkPath($subelement['link'])){
$result .= '<li class="'.$this->li_class_sub .'">';
}else{
$result .= '<li>';
}
if ($subelement['img'] != ''){
$obj = $this->Html->image($subelement['img']) . '<br/>' . $subelement['name'];
}else{
$obj = $subelement['name'];
}
$result .= $this->Html->link($obj ,$subelement['link'],array('title'=>trim($subelement['name'])),false,false). "</li>\n";
}
return $result;
}
function getMenuElement($melement, &$submenu, $sub){
$result = '';
if($this->getControllerNameCurrentPath() == $this->getControllerNameLinkPath($melement['link'])){
$result .= '<li class="'.$this->li_class_main .'">';
if ($sub){
$submenu =$this->getSubmenuElement($melement['Msubelement']);
}
}else{
$result .= '<li>';
}
if ($melement['img'] != ''){
$obj = $this->Html->image($melement['img']) . '<br/>' . $melement['name'];
}else{
$obj = $melement['name'];
}
$result .= $this->Html->link($obj ,$melement['link'],array('title'=>trim($melement['name'])),false,false). "</li>\n";
return $result;
}
function getControllerNameCurrentPath(){
return $this->params['controller'];
}
function getControllerNameLinkPath($link){
$tmp = explode('/',$link);
return $tmp[1];
}
function getActionNameCurrentPath(){
return $this->param['action'];
}
function getActionNameLinkPath($link){
$tmp = explode('/',$link);
return !empty($tmp[2]) ? $tmp[2] : 'index';
}
}
?>
Kod sql dla Postgres'a
CREATE TABLE menus
(
id serial NOT NULL,
group_id integer,
CONSTRAINT pk_menus PRIMARY KEY (id),
)
CREATE TABLE melements
(
id serial NOT NULL,
menu_id integer NOT NULL,
name character varying(50),
link character varying(255),
img character varying(255),
CONSTRAINT pk_column_id PRIMARY KEY (id),
)
CREATE TABLE msubelements
(
id serial NOT NULL,
melement_id integer,
name character varying(50),
link character varying(255),
img character varying,
CONSTRAINT pk_msubelement_id PRIMARY KEY (id)
)
Dla stworzony tabel tworzymy modele a w nich dwie asocjacje:
* menu hasMany melement
* melement hasMany msubelement.
Dodajemy helper i komponent do kontrolera:
var $helpers = array('tabMenu');
var $components = array('tabMenu')
Po udanej akcji logowania, pobieramy id grupy użytkownika i odpalamy akcje komponentu.
$group_id = $this->User->field('group_id',array('username'=>$this->data['User']['username']));
$this->tabMenu->init($group_id);
Potem w layoucie, lub gdziekolwiek w widoku uruchamiamy:
echo $tabMenu->showMenu($this->controller->tabMenu->getMenu(), false);
Ostatni parametr ustawiony jako false powoduje że nie pobierane będą elementy submenu.
Ostatnio edytowany przez maciek (2008-02-24 15:59:12)