quinta-feira, 30 de maio de 2013

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

Nenhum comentário:

Postar um comentário