Valdinei F. Lima
Iniciante
Karma: +0/-0
Offline
Mensagens: 24
|
 |
« : Julho 30, 2010, 12:42:12 » |
|
Pessoal, Quem viu o post http://www.extjs.com.br/forum/index.php?topic=3672.msg18730#msg18730 percebeu que apesar de útil, ainda daria para melhorar e muito o esquema do menu. Então resolvi melhorar o mesmo utilizando grupos de acesso para os menus, o que deu uma "melhoradinha" nele. A idéia é fazer com que o usuário(login) só possa acessar o menu que estiver atrelado ao grupo, e assim sendo carregado apenas o que for de sua competência, tendo ainda a possibilidade do usuário está em mais de um grupo. Para ilustrar o que eu acabei de dizer, segue o diagrama: Agora iremos criar a estrutura do Menu e popular com alguns dados para que possamos fazer alguns testes. -- -- Estrutura da tabela `Menu` --
CREATE TABLE IF NOT EXISTS `Menu` ( `idMenu` int(11) NOT NULL auto_increment, `id` varchar(40) character set utf8 default NULL, `text` varchar(70) character set utf8 default NULL, `iconCls` varchar(50) character set utf8 default NULL, `handle` varchar(200) character set utf8 default NULL, `ordem` int(3) default NULL, `pai` int(3) default NULL, PRIMARY KEY (`idMenu`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
-- -- Incluindo os dados na tabela `Menu` --
INSERT INTO `Menu` (`idMenu`, `id`, `text`, `iconCls`, `handle`, `ordem`, `pai`) VALUES (1, '', 'Administração', '', '', 0, 0), (2, '', 'Cadastrar', '', '', 0, 1), (3, '', 'Produtos', '', '', 0, 2), (4, '', 'Funcionários', '', '', 0, 2); Agora iremos criar a estrutura do Grupo e popular com alguns dados. -- -- Estrutura da tabela `Grupo` --
CREATE TABLE IF NOT EXISTS `Grupo` ( `idGrupo` int(11) NOT NULL auto_increment, `nome` varchar(45) default NULL, `descricao` longtext NOT NULL, PRIMARY KEY (`idGrupo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
-- -- Incluindo os dados na tabela `Grupo` --
INSERT INTO `Grupo` (`idGrupo`, `nome`, `descricao`) VALUES (1, 'ADMINISTRADOR', 'Administrador do Sistema'), (2, 'RH', 'Gestão de pessoas'), (3, 'ESTOQUE', 'Gerencia de movimentação de estoque'); Agora iremos criar a estrutura do Grupo_Acesso_Menu. É onde definimos quais menus estão atrelados a determinado grupo. -- -- Estrutura da tabela `Grupo_Acesso_Menu` --
CREATE TABLE IF NOT EXISTS `Grupo_Acesso_Menu` ( `idGrupo` int(11) NOT NULL, `idMenu` int(11) NOT NULL, KEY `fk_Grupo_has_Menu_Grupo1` (`idGrupo`), KEY `fk_Grupo_has_Menu_Menu1` (`idMenu`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- -- Inserindo dados na tabela `Grupo_Acesso_Menu` --
-- Aqui estamos definindo quais acesso o grupo 1(ADMINISTRADOR) terá, ou seja, todos. INSERT INTO `Grupo_Acesso_Menu` (`idGrupo`, `idMenu`) VALUES (1, 1), (1, 2), (1, 3), (1, 4);
-- Aqui estamos definindo quais acesso o grupo 2(RH) terá, ou seja, apenas no menu RH. INSERT INTO `Grupo_Acesso_Menu` (`idGrupo`, `idMenu`) VALUES (2, 1), (2, 2), (2, 4);
-- Aqui estamos definindo quais acesso o grupo 3(ESTOQUE) terá, ou seja, apenas no menu ESTOQUE. INSERT INTO `Grupo_Acesso_Menu` (`idGrupo`, `idMenu`) VALUES (3, 1), (3, 2), (3, 3);
-- -- Restrições para a tabela `Grupo_Acesso_Menu` -- ALTER TABLE `Grupo_Acesso_Menu` ADD CONSTRAINT `fk_Grupo_has_Menu_Grupo1` FOREIGN KEY (`idGrupo`) REFERENCES `Grupo` (`idGrupo`) ON DELETE NO ACTION ON UPDATE NO ACTION, ADD CONSTRAINT `fk_Grupo_has_Menu_Menu1` FOREIGN KEY (`idMenu`) REFERENCES `Menu` (`idMenu`) ON DELETE NO ACTION ON UPDATE NO ACTION; Agora vamos criar os usuários. -- -- Estrutura da tabela `Login` --
CREATE TABLE IF NOT EXISTS `Login` ( `idLogin` int(11) NOT NULL auto_increment, `usuario` varchar(45) NOT NULL, `senha` varchar(45) NOT NULL, `ativo` enum('0','1') NOT NULL, PRIMARY KEY (`idLogin`), KEY `fk_Login_Funcionario` (`idFuncionario`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
-- -- Inserindo os dados na tabela `Login` --
INSERT INTO `Login` (`idLogin`, `usuario`, `senha`, `ativo`) VALUES (1, 'admin', 'admin', '1'), (3, 'estoque', 'estoque', '1'), (4, 'rh', 'rh', '1'); Neste ponto estaremos colocando o usuário em seu devido grupo de acesso. -- -- Estrutura da tabela `Grupo_has_Login` --
CREATE TABLE IF NOT EXISTS `Grupo_has_Login` ( `idGrupo` int(11) NOT NULL, `idLogin` int(11) NOT NULL, PRIMARY KEY (`idLogin`,`idGrupo`), KEY `fk_Grupo_has_Login_Grupo2` (`idGrupo`), KEY `fk_Grupo_has_Login_Login2` (`idLogin`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- -- Extraindo dados da tabela `Grupo_has_Login` --
-- Colocando o usuário admin dentro do grupo ADMINISTRADOR INSERT INTO `Grupo_has_Login` (`idGrupo`, `idLogin`) VALUES (1, 1);
-- Colocando o usuário estoque dentro do grupo ESTOQUE INSERT INTO `Grupo_has_Login` (`idGrupo`, `idLogin`) VALUES (2, 4);
-- Colocando o usuário rh dentro do grupo RH INSERT INTO `Grupo_has_Login` (`idGrupo`, `idLogin`) VALUES (3, 3);
Lembrando que o usuário pode esta em mais de um grupo diferente, podendo assim carregar os menus de vários grupos.
Agora vamos aos códigos index.php e menu.php que serão responsáveis por exibir o menu. menu.php<?php
/** * @author Valdinei F. Lima <valdinei.lima@bbtools.com.br> */
$conexao = mysql_connect('localhost','root','root') or die(mysql_error()); mysql_select_db('menu', $conexao) or die(mysql_error());
function menu($idMenu=0) { $sql = "SELECT DISTINCT Menu.* "; $sql .= "FROM Menu, Grupo, Grupo_has_Login, Login, Grupo_Acesso_Menu "; $sql .= "WHERE (Grupo_Acesso_Menu.idGrupo=Grupo.idGrupo and Grupo_Acesso_Menu.idMenu=Menu.idMenu) and "; $sql .= "(Grupo_has_Login.idGrupo=Grupo.idGrupo and Grupo_has_Login.idLogin=Login.idLogin) and "; $sql .= "(Login.idLogin='".$_SESSION['idUsuario']."') and "; $sql .= "(Menu.pai='".$idMenu."') "; $sql .= "ORDER BY idMenu asc ";
$rsMenu = mysql_query($sql); $total = mysql_num_rows($rsMenu); for ($i = 0; $i < $total; $i++) { list($idMenu, $id, $text, $iconCls, $handle) = mysql_fetch_row($rsMenu); @$menu .= "{ id:'".$id."', text:'".$text."', iconCls:'".$iconCls."', handle:'".$handle."'";
if (subMenu($idMenu) > 0) { $menu .= ", menu:" . menu($idMenu) . "}"; } else { $menu .= "}"; }
if ($i != $total - 1) { $menu .= ","; } }
if (strlen($menu) > 0) { return "[" . $menu . "]"; } else { return false; } }
function subMenu($idMenu) { $sql = "SELECT DISTINCT Menu.* "; $sql .= "FROM Menu, Grupo, Grupo_has_Login, Login, Grupo_Acesso_Menu "; $sql .= "WHERE (Grupo_Acesso_Menu.idGrupo=Grupo.idGrupo and Grupo_Acesso_Menu.idMenu=Menu.idMenu) and "; $sql .= "(Grupo_has_Login.idGrupo=Grupo.idGrupo and Grupo_has_Login.idLogin=Login.idLogin) and "; $sql .= "(Login.idLogin='".$_SESSION['idUsuario']."') and "; $sql .= "(Menu.pai='".$idMenu."') "; $sql .= "ORDER BY idMenu asc ";
$rsMenu = mysql_query($sql); return mysql_num_rows($rsMenu); }
print utf8_encode( menu(0) );
?>
index.php<?php
/** * @author Valdinei F. Lima <valdinei.lima@bbtools.com.br> */
/** * Esse eh o codigo do usuario que jogamos em uma sessao, serve para * que possamos testar o menu usando o ID de cada usuario para que tenhamos * uma nocao das permissoes aplicadas. * * Caso voce utilize outro nome de variavel para definir o usuario online, deve ser alterado no arquivo menu.php, * pois nele existe a SQL que faz apontamento ao usuário utilizando a $_SESSION['idUsuario'] * * Experimente modificar o valor da variavel de acordo com o ID do Login do usuário: * 1-> admin; * 3-> estoque; * 4-> rh; */ $_SESSION['idUsuario'] = 1;
?>
<html> <head> <title>MENU</title> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../biblioteca/extjs/resources/css/ext-all.css" /> <script type="text/javascript" src="../biblioteca/extjs/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="../biblioteca/extjs/ext-all.js"></script> <link rel="stylesheet" type="text/css" href="css/erpPadrao.css" /> </head>
<body>
<script type="text/javascript"> Ext.onReady(function(){
Ext.QuickTips.init();
var menu = new Ext.Toolbar({ items: <? require_once 'menu.php'; ?> });
menu.render('barraMenu'); menu.doLayout();
}); </script>
<div id="recipiente"> <div class="banner"> <div id="barraMenu"></div> </div> </div>
</body> </html>
Segue as imagens dos menus após carregada com seus devidos usuários: admin estoque rh É isso ai pessoal. Espero que essa segunda versão do menu seja de grande utilidade. Abraços
|