Montando um menu dinâmico com banco de dados

Olá, pessoal!
Neste artigo, veremos como montar "menu" com os dados vindo diretamente do banco de dados. Sabemos que muitos aplicativos montam o seu "menu" cadastrado no banco de dados, cada um com seu perfil e sua permissão. Para isso, é necessário ter primeiro uma boa estrutura de banco de dados e campos para montá-lo.
Em momentos anteriores, escrevi outros artigos que montam "menu" diretamente de um XML, e com o componente diferente, ou seja, que precisa ser referenciado no projeto. Este artigo será um pouco diferente, pois os dados são de um banco de dados, e o componente para montar o menu é o nativo da ferramenta.

Referências:

  • Visual Studio .NET 2008
  • Banco de dados SQL Server
  • Linguagem C#.NET
  • Plataforma Web ASP.NET
Vou mostrar o banco de dados montado para que entenda desde o começo o passo a passo, pegando os dados do menu vindo do banco de dados.
O primeiro passo é criar uma tabela no banco de dados. Dei o nome de dbo.Objeto. Essa tabela terá o menu, links, ordenação e informações necessárias para montar o menu.
O campo ObjetoId é autoincremento e o objetoPaiId é um auto-relacionamento indicando o menu principal. Por exemplo: se o "menu" for o principal, esse campo ObjetoPaiId será NULL. Para o submenu, o objetoPaiId terá um número indicando o ObjetoId. Segue a imagem preenchida para que tenha uma outra boa referência:

Produção

  • Formaliza Conta
Note que, na imagem, na primeira linha, o ObjetoPaiId está NULL (o último campo da primeira linha). E que na segunda linha e no último campo existe um número referenciado, é o mesmo da primeira linha; ou seja; um auto-relacionamento.
Foram inseridos também alguns campos que, no momento, não serão utilizados, mas podem ser futuro. Os campos são ExibeImagem e URLImagem. Isso é para caso o seu menu tenha alguma imagem que precise ser mostrada.
No campo endereço, o nome da página está com a extensão. Veja que não coloquei o endereço completo, só o nome da página propriamente dito. Todas as minhas páginas estão no diretório raiz. Dessa forma, coloquei só o nome da página. Se tivesse dentro de uma pasta, colocaria o nome da pasta barra o nome da página. (Isso é só para que entenda como funciona).
O objeto que vou usar para mostrar o "menu" é o do próprio Visual Studio .NET 2008. A versão da ferramenta não importa, pois o <ASP:MENU> é o mesmo das versões anteriores.
E esse objeto funciona em todos os browsers sem qualquer problema. Pelo menos em meus testes todos abriram.
Além do objeto <ASP:MENU>, vou usar CSS e Imagens para ficar bonito o menu montado na tela.

Tabelas de vínculo

Agora, vamos ver a criação das tabelas de vínculo e um pouco de codificação em C#.NET.
Lembrando que não vamos mostrar aqui a forma de conectar ao banco de dados, nem mesmo fazer o select para validar o usuário logado, isso porque estou partindo do pressuposto que você sabe fazer isso. O objetivo é mostrar como carregar o menu vindo do banco de dados de acordo com o usuário logado no sistema.
O menu precisa ser carregado de acordo com o perfil do usuário, depois que ele entra com o usuário e senha. Dessa forma, o sistema busca no banco de dados o perfil e com ele busca os dados no menu, que, no nosso caso, é a tabela Objeto.
Se o seu caso for apenas carregar o menu sem distinção de usuário, o caminho está fácil. Mas se você precisa carregar o menu de acordo com o grupo do usuário, é necessário criar mais algumas tabelas específicas.

Criando tabelas para vincular o perfil do usuário

A primeira tabela para gerar o perfil do usuário foi a Grupo.
Tabela Grupo
Campos:
  • GrupoId (int) auto incremento
  • Nome (varchar(60) notnull
A descrição do grupo pode ser colocada como você preferir. Na minha aplicação eu tenho: Administrador, Usuário, Leitor.
Depois de criar a tabela grupo, é necessário criar uma tabela chamada GrupoObjeto para vincular a tabela Objeto com a tabela Grupo.
Tabela GrupoObjeto
Campos:
  • ObjetoId (int) notnull
  • GrupoId (int) notnull
O número do menu cadastrado fica no campo ObjetoId, e o número do grupo cadastro fica no campo GrupoId.
A próxima tabela para criar vínculo é a usuário grupo, ou seja, vincular o usuário cadastro ao grupo. Para isso criei a tabela chamada UsuarioGrupo.
Tabela: UsuarioGrupo
Campos:
  • UsuarioId (int) notnull
  • GrupoId (int) notnull
Depois de criar estas tabelas ficou simples fazer o select. Para facilitar, vou colocar o select abaixou para carregar o menu do usuário que acabou de logar no sistema.
Select que retorna o menu para o usuário
   Select distinct Obj.*

       From Objeto Obj

    Inner join GrupoObjeto gob on obj.objetoId = gob.objetoId

    Inner Join Grupo gru on gob.grupoId = gru.grupoId

    Inner Join UsuarioGrupo ugp on  ugp.grupoId = gru.grupoId

       Where ugp.usuarioId=(NUMERO_DO_USUARIO_ID)

    Order by obj.Ordem
Select 1.1
Este select retorna o menu de acordo com o usuário logado e com ele basta construir o código para mostrar em tela.

Codificando

Agora vamos codificar o menu para ser mostrado em tela. Para facilitar, eu vou criar uma classe chamada Sessão, que carrega todas as sessões do meu sistema, inclusive a sessão de menu.
Esta classe sessão só tem get e set.
    public static DataTable Menu
    {
        get
        {
            try
            {
                return (DataTable)HttpContext.Current.Session["Session:MENU"];
            }
            catch
            {
                return null;
            }
        }
        set
        {
            HttpContext.Current.Session["Session:MENU"] = value;
        }
    }

   public static decimal UsuarioId
    {
        get
        {
            try
            {
                return Conversion.ToDecimal(HttpContext.Current.Session["Session:USUARIOCOD"]);
            }
            catch
            {
                return 0;
            }
        }
        set
        {
            HttpContext.Current.Session["Session:USUARIOCOD"] = value;
        }
    }  
Depois que o usuário entrar no sistema com usuário e senha, eu preciso buscar o menu e chamar o select 1.1. O retorno dela eu atribuo para a classe sessão atribuindo o menu.
 Sessao.Menu = new ObjetoBRL().BuscaObjetosDoUsuario(Sessao.UsuarioId);
Assim, eu fico com a sessão menu preenchida para montar na tela.
Na próxima parte do artigo veremos o restante da codificação. Espero que tenha entendido e gostado, qualquer dúvida pode entrar em contato
Obrigado pelo seu comentário

Postagens Relacionadas

Related Posts Plugin for WordPress, Blogger...

Programador GB