Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jribeirojr

Sugestão de como salvar menu dinâmico para o usuário

Recommended Posts

Pessoal gostaria de uma sugestão de vocês, caso já tenham passado por algo parecido

 

Hoje tenho uma aplicação que possui acesso restrito aos usuários, e cada usuário que realizar o acesso um menu é montado com base nos direitos que ele tem de acesso. Este menu é montado da seguinte maneira:

1 - o usuário ao se logar no sistema é atribuido um grupo de usuários a ele, com um nome, por exmeplo DIRETOR

2 - o meu sistema em PHP vai no diretório de MENUS e localiza o arquivo XML como nome diretor.xml e monta o menu para aquele usuário. Claro que a cada acesso do menu que ele faz eu capturo determinadas informações e valido se ele tem acesso aquele menu

 

Montando desta maneira eu tenho a vantagem de que a cada refresh da página eu não precise acessar o banco de dados e buscar os itens de menu que ele tem acesso, mas em compensação eu tenho que recarregar sempre o XML que monta o menu

 

Estava querendo desenvolver alguma outra forma para poder montar este menu dinâmico, e gostaria de sugestões , como por exemplo:

 

1 - Pensei em salvar em banco de dados o arquivo HTML do menu para cada usuário, mas isso consumiria espaço em banco de dados e também teria que acessar o banco a cada refresh da página, não sei se seria viável

 

2 - Pensei em salvar apenas o XML em banco de dados mas aí teria que consultar o banco de dados para pegar o XML e depois a função para ler o mesmo e montar o menu

 

3 - Pensei em deixar o menu livre para todos os usuários e validar apenas quando ele tivesse acesso, mas isso faria com que todos os usuário vissem todos os menus sendo que ele só tem acesso a 2 itens do menu por exemplo

 

4 - Já pensei em usar Angular para que toda o usuário ao trocar de página não fosse necessário recarregar o menu, mas isto neste momento é inviável porque teria que trocar muita coisa na minha aplicação, que já é bem grande

 

Pensei de tudo, mas não consigo chegar a uma conclusão ou solução saudável tanto para o sistema quanto para processamento e custo de armazenamento.

 

Sei que é complicado, mas se alguém pelo menos já tiver passado por isso, ou ter criado uma aplicação para resolver este tipo de problema e quiser compartilhar, agradeceria

 

Obrigado

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ate seguir este post xD para ver alguém apresenta alguma forma 100% eficiente. 

Ja fiz algo parecido com oque descreveu e também ja montei uma logica com cookies e também ja vi outros sistema com umas logicas muito louca para controlar isso. Ate hoje nunca cheguei em uma conclusão 100% eficiente.  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estou desenvolvendo alguma coisa parecida, mas por enquanto só estou usando menu com ícones para exibir módulos, eu criei uma tabela para os módulos e uma tabela para as permissões dos usuários.

 

Na tabela de módulos eu cadastro o nome de cada módulo (que também vai ser usado para chamar o ícone JPG) o nome do arquivo do módulo (ex: vendas.php) e o status do modulo (se ele está ativo ou não).

 

Na tabela de permissões (que será inerente a cada módulo) eu tenho os seguintes campos: id; modulo_id; usuário_id; ver; inserir; alterar; excluir; imprimir; exportar; (para os campos de ações ex: ver, inserir, alterar..., eu uso a codificação binária, 1 para verdadeiro e 0 para falso). 

 

A identificação do usuário é feita pela Session ID dele, então você pode criar uma função que não precisa nem passar parâmetros, basta fazer a consulta na tabela de módulos e permissões e trazer o resultado em forma de menu. Vou colocar abaixo o código do meu menu de ícones, acredito que a lógica seria a mesma.

 

header.php


<?php 

require_once("funcoes.php");
$modulos = modulos();

foreach($modulos as $menuitem) { 
?>
  <div class="col-1">
      <span class="centerbold top5">

          <img src="images/<?php echo $menuitem['modulo_nome'];?>.jpg" class="imenu" onClick="location.href='<?php echo $menuitem['modulo_arquivo'];?>';">

      </span>
      <span class="centerbold">

          <?php echo ucfirst($menuitem['modulo_nome']);?>

     </span>
  </div>    

  <?php
}
?>

 

funcoes.php


function modulos(){
  global $con;
 //A primeira id é a do index então ele é obrigatório e não entra na consulta

  $rs = $con->prepare("SELECT * FROM modulos WHERE modulo_status = 1 AND modulo_id <> 1");
  $rs->execute();
  $res = array();
  while($row = $rs->fetch(PDO::FETCH_ASSOC)){
    $res[]=$row;
  }
  return $res;
}
?>

 

Vou seguir a mesma lógica para os menus e opções que virão depois em cada módulo, consulto no banco de dados e com um while ou for eu monto os menus, talvez crie uma fução adicional para exibir os botões de ação dos módulos, mas não planejei esta parte ainda.

 

Como disse ainda estou implementando e isto pode parecer meio rudimentar e as revisões só virão depois de prontas as rotinas, então perdoem se tiver parecendo meio que "gambiarra" rsrsrsrs.
 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

pq você escolheu carregar um xml ao invés de usar include com o menu correspondente de cada grupo de usuário?

são muitos grupos?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Eletronic

 

Acabei usando XML porque nele guardo apenas os menus que o usuário tem acesso com o id do menu, texto, ícone e URL não então acessar o banco dados para consulta toda vez que a página é carregada 

Como os direitos de acesso de cada grupo pode mudar utilizar um include faria com que eu ainda continuasse a ter que acessar o banco para pegar a informação.

 

SERGIO

 

É exatamente assim que faço, tenho as tabelas no banco de dados que controlam cada módulo, o usuário ao clicar em um determinado link do menu passo o módulo daquele link e aí válido se aquele usuário tem ou não acesso ao link 

Meu problema está mesmo em como montar o menu de uma forma que economize processamento de banco de dados e servidor web

 

Estive pensando agora em uma ideia, levando em conta a utilização de include a como sugeriu o Eletronic o que acham?

 

1 - eu teria uma página Pho já com todo o código HTML do menu e teria um arquivo para cada grupo de usuário

 

2 - caso algum direito fosse alterado no banco de dados, via programação alteraria este include com as novas opções e o usuário ao se logar teria acesso ao novo menu

 

Não sei se é possível via PHP gerar um novo arquivo com extensão PHP mas talvez poderia ser a saída

 

O que acham?

 

Obrigado pelo compartilhamento das sugestões

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

É possível sim criar um arquivo com o html dos menus gerado de forma dinâmica, daí você atrela o nome desse arquivo ao ID do usuário por exemplo, e em todas as páginas  onde deve aparecer o menu você coloca um include tipo assim "include($id_usuario."menu.html");"

Dessa forma somente na autenticação você faz a consulta e cria o arquivo de menu.

O único detalhe seria que cada usuário passaria a ter um arquivo de menu criado no servidor, mas você pode destruir esse arquivo também ao finalizar a sessão do usuário, e seria interessante fazer uma verificação antes do include para ver se o arquivo realmente existe para prevenir mensagens de erro caso dê algum b.o., além de ter um menu padrão para redirecionar em caso de erro.

Acho que assim dá pra fazer da maneira que você falou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal,

 

Primeiramente quero agradecer a todos aqui pelas sugestões e compartilhamento das idéias, com elas acabei criando uma forma que chegou a economizar 80% de processamento no meu sistema de menu, vou tentar descrever um pouco mais sobre o que fiz, e se alguém quiser mais informações me avisem.

 

Minha aplicação foi desenvolvida em CodeIgniter 3.1.3.

 

Estrutura do Menu em banco de dados

Criei no meu banco de dados uma estrutura de menu onde tenho todos os dados do menu, com diversos campos que montam todo o menu, são eles:

  • id
  • idMenuPrincipal -> informa se o registro está vinculado a um MENU, portanto é um subMenu
  • txtIcone -> ícone do menu
  • txtMenu -> nome que aparece para o usuário
  • txtIdMenu -> serve para podermos colocar o ACTIVE no item, ou seja, o usuário ao acessar aquele menu e a página ser populado é inserido um active para informar ao mesmo em qual menu se encontra
  • txtUrl -> url do menu
  • intOrdem -> ordenação
  • bitCabecalho -> informa que este registro é apenas um cabeçalho, um teste separando os menus em grupos
  • txtButtonAction -> serve para poder inserir as ações que a página irá ter ao ser acessada, como por exemplo, editar, excluir, inserir, etc. Todos os botões que irão existir na página de diferentes funcionalidades, é um campo registrado como um array serializado

Com base nisso criei uma página onde lista todos estes menus em formato TREE VIEW, onde selecione o Menu Pai e ele automaticamente já seleciona os filhos dele (quem quiser posso enviar o código)

 

Toda vez que um usuário tem uma alteração nestes direitos, registros os direitos do mesmo em uma tabela que tem os seguintes campos:

  • idGrupoAccess -> id do grupo que o usuário pertence
  • idMenuAdmin ->chave estrangeria da tabela explicada acima
  • txtPermissoes -> as permissões que foram registradas no campo txtButtonAcion acima

Aqui está a alteração que fiz para economizar processamento.

Ao realizar a alteração, faço a leitura destes menus criando um array multidimensional com todas as informações e salvo este array em um arquivo criptografado, segue o código como nome do grupo do usuário

$serializedData = serialize($this->template->gera_array_menu_final($this->dataMenu['menu']));
write_file('assets/menu/' . $objData->txtGrupo . '.txt', encode($serializedData));

Desta maneira é criado um arquivo criptografado, que fica desta maneira:

isEvbzOhKhU~QIITLQmt1M23IkJhVbSSBzUby4O1302yLIWBFDPJG45H96WE3oDFWwzVgave9YolvtNdOEhtqPY9BTb.I8zmXyzSay8I~uTuW9EcZevNKg9fquE75SMRvI0.Wu~.wk8lMb8x0CNJxRnuQTa9OAPTxkl4Sn128NYGoci0jGZZRluFVnaZJM84EsAuhDQsLwn7e~~cjkM..bwjiOyVBjsxU2wIZ4Y.ZkT1g4I.g3weFPTuUF~gIxaGbXq0OrJ2vSlqUcXXLTK6tf~RPO~EXD7keUi4n6SdhYt1XWVVGJHRgrAm9Skv4IGY~.wzVISOEoV~FsbNOf76Ky3nwvh.NjtYrcANxMHWibut3gddJ8Z2NFUbHJif3nD2vevHfZKQzYSixERQ1Gy.2Kobfv1UTUxtFU4uP~~3FegfmyPI.YzhGtEl.RT8qi7RhZ0E.h5dhDiBTpwMloORmTu9Vl0FcCD~iHouzNIAZSwuUZOdDB73g5EUrEGUb~FstFd1fIOdTOikWxlVGF.TizxiNNPfbypjCmXFtJpnhLCy.yELw4QrNWlIIajVRXg~Pqd4.ryi0OqZFHNys~n78lEr9.2bfi7mlVizJrYybjsmuaKegETYIU75ttb6XfERPqXzNVYpebK.bKAvTq2rcWviApoI0.QqYlKW3W.MtF5.KIHUD2MsbMxav1sA4~To83MTkCwZ~xKzjapN.RtPDp5f2Laam6ObPmrKH2EzGdyQfUMx23M2jm1s6NvHHe3oQYpXTeOZncV0Yt5mxYZC9H2zO.E.jnAWEoAnmSg2odkmXzDcRwKcqt9wR5U5Gqat6yQyWXcWr3iaOtufgqUdNgc6YH0cTZSQUkrcekSPHCfHnqs2H2F3LJEujfXDqkjGHWnUJHgEEAkRWvV5w796x42AZvoTRrXxJ0evWzSQa~sUwQwlklVNlC7~ygNCclTLqkaXKnyPTwVDlBFlX4aDZMFXSYtNoEVAcwzJzok1jlM8AK0441LXqpDtqe5OJBkmjcXDwaTWHMljdnFW3Wd7bpGT9gjlENLmFutNFx24rKR6nPXYsEOHH5GKQ2Bywrbezo2qMnNTl620t5A1YvxjXMSBLkxydr15x592~Sxz~IbH9ihksfJjccZ6.T7eSkTMpF4aBg6pfOhaZnUZnXKEwIdqLssKZsGHN.AC9PIEmvm07MklKvFnyHic1H8nFCymQgkcU2ps9n33AdHZICuHSgCRF8mcnXnhyeI.Db1BSihpTbgPCQe.4OM5pedwoNoS4gg6rsBcHn4UWi6WaJDKkmxIJZj9TbRaB~W~uWK9bWGNcBNNy8aKnFZDMXo7TJ9y0Y09Uxzg49spzWxIe3U4YH.~GuoO~G83bmVdrUDrCzkxbqBSztl.2J.VRtYFuSTX3PVZcd1b7VVRcYFiMFQx~7MFRReKhZyuG05qcf6UHc34Ovxat7Cn9FKsByXhxrDp5c23fVeiQnzpaGZmHui13KYhor2~JE6rBj3UICpXvwSccV.qoHUxBxl1x6kq15DkE4wJD4IlmoRnHpdkAmFYnHzAvLpU3NvNMxPTGMUZJioB8gDpL5UdNiK.HnPb6zqXCJO6elo.y4oM4BD9Uit8AmHgUuCRZmJb9j4FwK~ZoaaKiu.dDvQoskI6NyhM8B78Huu3M2l3ol1WsmFeaDyYpFRsPkfzamKccZGpTq9PrswYHyxulPtXzvf3QhIDDzTp8E6N.rsVD1NxqNKw16zJnguqgRv~R7cOdtqGtfWpkEmSjaLiEvh5.QefpM0DK~xMK.8mGM0icK1NpM58i.78JQ.rMIJrsHhDg1VUvezr8nXL475C9ZkktLTSjUxRzeBIkLVGjlsQkSTwoh6e38beMIUE3mgq8jlDu1WlFGDeBiot08J7j3R.ghj0xtU3eedupn9tOD4KT3M8aKeCzjgVz5npi1U5grVzuy2CipWSq7pCgGyk0GeitwJ2qLgPfEt5ViYzFuhwzbYePrr0jly2AjjlFmZ9vqbXOo4sMKGWCJ4L7cMn7e0WZA9JJLZzulGP

Agora, ao carregar o menu faço apenas a leitura deste arquivo e decripto ele, percorrendo o array e montando o menu.

Não gerei este arquivo criptografado já em HTML porque preciso inserir o ACTIVE do menu que o usuário se encontra, mas meu processamento caiu em 80%. Vejam como ficou a leitura do arquivo e a formatação dele para gerar o menu

$CI = & get_instance();
$CI->load->helper('file');
$recoveredData = read_file(assets_url('assets/menu/' . $CI->session->administrativo['txtMenuFile'] . '.txt'));
$this->build_nav_array(unserialize(decode($recoveredData)));
echo $this->nav_html;

foreach ($nav_array as $node):
  $class_active = '';

  // Determinar em qual menu será colocada a classe active
  $this->main_nav_active = str_replace('/admin/', '', $_SERVER['REQUEST_URI']);
  $capturarClasseMetodo = explode('/', $this->main_nav_active);
  if(!isset($capturarClasseMetodo[1]))
  	$this->main_nav_active = $capturarClasseMetodo[0];
  else
  	$this->main_nav_active = $capturarClasseMetodo[0] . '/' . $capturarClasseMetodo[1];

  $link_name      = isset($node['name']) ? $node['name'] : '';
  $link_icon      = isset($node['icon']) ? '<i class="' . $node['icon'] . '"></i>' : '';
  $link_url       = isset($node['url']) ? $node['url'] : '#';
  $link_sub       = isset($node['sub']) && is_array($node['sub']) ? true : false;
  $link_type      = isset($node['type']) ? isset($node['type']) : '';
  $sub_active     = false;
  $link_active    = $link_url == $this->main_nav_active ? true : false;

  if($link_sub){
  	$this->nav_html .= "<li>";
    $this->nav_html .= "$link_name";
    $this->nav_html .= "<ul>";
    $this->build_nav_array($node['sub']);
    $this->nav_html .= "</ul>";
    $this->nav_html .= "</li>";
  }
  else{
	if($link_active)
  		$class_active = 'active';

  if($link_type)
  	$this->nav_html .= $link_name;
  else
  	$this->nav_html .= '<li class="' . $class_active . '">' . $link_name . '</li>';
  }
  endforeach;

O código é bem grande mas resolveu o problema que eu tinha, e conforme o Sergio tinha faldo que seria ideal apagar o arquivo quando o usuário saisse do sistema, criptografando o arquivo não é necessário realizar esta ação

 

Vou manter o sistema desta maneira e acompanhar a performance dele com a utilização dos usuários

 

Se alguém tiver alguma idéia e quiser compartilhar será bem vinda e também se desejarem melhorar o sistema seria ótimo, toda a contribuição é válido

 

Espero ter contribuido se não resolver pelo menos para poder ajudar a clarear para novas idéias

 

Abs

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por First
      Olá a todos!
       
      Quando eu tento fazer o login me mostra esse erro "Could not log you in."; Alguém sabe me ajudar a resolver esse problema no meu código?
      <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember"> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form>  
       
      Desde já obrigado.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.