EXTJS - Comunidade brasileira da biblioteca EXTJS
Setembro 08, 2010, 07:39:53 *
Bem-vindo, Visitante. Por favor faça o Login ou Registro.
Perdeu o seu email de activação?

Login com nome de usuário, senha e duração da sessão
Notícias: Confira também conteúdo Ext JS no novo site rkn.com.br
 
   Home   Ajuda Pesquisa Login Registrar  
Faça uma doação e contribua para a
evolução desta comunidade. Saiba mais...
Páginas: [1]
  Imprimir  
Autor Tópico: [Versão 2] Criando um menu com botões em um toolbar utilizando um banco de dados  (Lida 270 vezes)
0 Membros e 1 Visitante estão vendo este tópico.
Valdinei F. Lima
Iniciante
*

Karma: +0/-0
Offline Offline

Mensagens: 24


Ver Perfil
« : 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);


Citar
 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

Código:
<?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_encodemenu(0) );

?>




index.php

Código:
<?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
« Última modificação: Julho 30, 2010, 13:27:41 por Valdinei F. Lima » Registrado
Páginas: [1]
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 Válido! CSS Válido!
Página criada em 0.249 segundos com 19 procedimentos.