Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Dúvidas sobre o menu dinâmico Olá pessoal, bom dia. Vou tentar deixar o menu dinâmico, então caso alguém já fez esse tipo de ajuste, gostaria de dicas e saber qual foi a forma que fizeram. ...
FV
Dúvidas sobre o menu dinâmico  
Fechado
Olá pessoal, bom dia.
Vou tentar deixar o menu dinâmico, então caso alguém já fez esse tipo de ajuste, gostaria de dicas e saber qual foi a forma que fizeram.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (9)


NC

O código está meio bagunçado, e eu criei uma tabela para ter um submenu, se você tirar funciona nas tabelas padrões do framework.

Criei um botão no SYSTEMPROGRAMFORM para gerar o menu.xml, e coloquei a função no model SYSTEMGROUPMENU

  1. <?php
  2.     /**
  3.      * Cria arquivos menu.xml
  4.      */
  5.     public static function CriaArquivoMenu()
  6.     {
  7.         try
  8.         {
  9.             // open a transaction with database 'permission'
  10.             TTransaction::open('permission');
  11.             
  12.             $SQL 'select t.*, 
  13.                            g.name as GRUPO,
  14.                            g.icon as GRUPO_ICON,
  15.                            s.name as SUBGRUPO,
  16.                            s.icon as SUBGRUPO_ICON
  17.                     from SYSTEM_PROGRAM t
  18.                     join SYSTEM_GROUP_MENU g on g.ID = t.Group_Menu_Id 
  19.                     left join SYSTEM_GROUP_MENU s on s.ID = t.Subgroup_Menu_Id
  20.                     ORDER BY g.name, s.name, t.name';
  21.             
  22.             // get connection
  23.             $conn TTransaction::get();
  24.             
  25.             // execute sql
  26.             $result $conn->query($SQL);
  27.             //$result = array_change_key_case($result, CASE_LOWER);
  28.             
  29.             $grupo NULL;
  30.             $subgrupo NULL;
  31.             $id_program NULL;
  32.             $groupUser 0;
  33.             
  34.             $array_adianti[] = array('label' => 'Adianti Reports''icon' => 'fa:cube fa-fw''action' => 'ReportsAdianti#method=onRedireciona#static=1');
  35.             $Write[999999] = $array_adianti;
  36.             
  37.             foreach ($result as $row
  38.             {
  39.                 $row array_change_key_case($rowCASE_LOWER);
  40.                 if ($row['grupo'] == 'Usuário'$groupUser 1// encontrou grupo usuário deve adicionar no menu o Logout
  41.                 
  42.                 if ($grupo <> $row['group_menu_id'])
  43.                 {
  44.                     if (!empty($subgrupo))
  45.                     {
  46.                         array_push($submenu[$subgrupo], $itemmenu); 
  47.                         array_push($Write[$grupo], $submenu[$subgrupo]);
  48.                         unset($itemmenu);
  49.                     
  50.                     }else if (!empty($grupo)) {
  51.                         
  52.                         array_push($Write[$grupo], $itemmenu);                        
  53.                         unset($itemmenu);
  54.                     
  55.                     }
  56.                     
  57.                     
  58.                     $Write[$row['group_menu_id']] = array('label' => $row['grupo'], 'icon' => $row['grupo_icon']);
  59.                     
  60.                     $grupo $row['group_menu_id'];
  61.                     $subgrupo NULL;
  62.                 }
  63.                 
  64.                 if (!empty($row['subgrupo']))
  65.                 {
  66.                     if ($subgrupo <> $row['subgrupo'])
  67.                     {
  68.                         if (!empty($subgrupo))
  69.                         {
  70.                             array_push($submenu[$subgrupo], $itemmenu); 
  71.                             array_push($Write[$grupo], $submenu[$subgrupo]);
  72.                             unset($itemmenu);
  73.                         }
  74.                         $submenu[$row['subgrupo']] = array('label' => $row['subgrupo'], 'icon' => $row['subgrupo_icon']);
  75.                         
  76.                         $subgrupo $row['subgrupo'];
  77.                         //array_push($Write[$row['id']], $submenu[$row['subgrupo']]);
  78.                     }
  79.                     
  80.                 }else{
  81.                     if (!empty($subgrupo))
  82.                     {
  83.                         array_push($submenu[$subgrupo], $itemmenu);
  84.                         array_push($Write[$grupo], $submenu[$subgrupo]);
  85.                         
  86.                         $subgrupo NULL;
  87.                         
  88.                         unset($itemmenu);
  89.                     }
  90.                 }
  91.                 $id_program $grupo;    
  92.                 //if (isset($itemmenu))
  93.                 //{
  94.                     //array_push($itemmenu, array('label' => $row['name'], 'icon' => $row['icon'], 'action' => $row['controller']));
  95.                     $itemmenu[] = array('label' => $row['name'], 'icon' => $row['icon'], 'action' => $row['controller']);
  96.                 //}else{
  97.                 //    $itemmenu[] = array('label' => $row['name'], 'icon' => $row['icon'], 'action' => $row['controller']);
  98.                     
  99.                 //}
  100.                     
  101.                 if ($groupUser==1
  102.                 {
  103.                     $itemmenu[] = array('label' => 'Logout''icon' => 'fa:sign-out fa-fw''action' => 'LoginForm#method=onLogout#static=1');
  104.                 }
  105.                 
  106.             }
  107.             if (!empty($subgrupo))
  108.             {
  109.                 array_push($submenu[$subgrupo], $itemmenu); 
  110.                 array_push($Write[$grupo], $submenu[$subgrupo]);
  111.                 unset($itemmenu);
  112.             }else if (!empty($grupo)) {
  113.                 array_push($Write[$grupo], $itemmenu);                        
  114.                 unset($itemmenu);
  115.             }            
  116.                         
  117.             $Writer = new XMLWriter();
  118.             $Writer->openMemory();
  119.             $Writer->startDocument'1.0' 'utf-8' ) ;
  120.             $Writer->setIndent(true);
  121.             $Writer->startElement'menu' );
  122.             
  123.             $abriu_menu 1;
  124.             $abriu_itemmenu 0;
  125.             $ultimo_nivel 0// Verifica se passou pelo ultimo nivel
  126.             
  127.             
  128.             forEach ( $Write as $Nodes ) {
  129.                 if ( is_array $Nodes ) )
  130.                 {
  131.                     forEach ( $Nodes as $nodeName => $nodeValue )
  132.                     {
  133.                         if (!is_array($nodeValue))
  134.                         {
  135.                             if ($nodeName==='label')
  136.                             {
  137.                                 if ($abriu_itemmenu==1)
  138.                                 {
  139.                                     $Writer->endElement();
  140.                                     $abriu_itemmenu 0;
  141.                                     
  142.                                     if ($abriu_menu==1
  143.                                     {
  144.                                         $Writer->endElement();
  145.                                         $Writer->endElement();
  146.                                         if ($ultimo_nivel)
  147.                                         {
  148.                                             $Writer->endElement();
  149.                                             $Writer->endElement();
  150.                                             $ultimo_nivel 0;
  151.                                         }
  152.                                     }
  153.                                 }else if ($abriu_menu==1)
  154.                                 {
  155.                                     $Writer->endElement();
  156.                                    
  157.                                 }
  158.                                 $Writer->startElement'menuitem' );
  159.                                 $Writer->writeAttribute $nodeName$nodeValue ); 
  160.                             }else{
  161.                                 $Writer->writeElement $nodeName $nodeValue );
  162.                             }
  163.                             $abriu_menu 0;
  164.                         }else{
  165.                             $ultimo_nivel 0;
  166.                             if ($abriu_menu==0)
  167.                             {
  168.                                 $Writer->startElement'menu' );
  169.                                 $abriu_menu 1;
  170.                             }else{
  171.                                 if ($abriu_itemmenu==1// nilson atençaõ aqui
  172.                                 {
  173.                                     $Writer->endElement();
  174.                                     $Writer->endElement();
  175.                                 }
  176.                             }                            
  177.                             forEach ( $nodeValue as $nodeName02 => $nodeValue02 )
  178.                             {
  179.                                 if (!is_array($nodeValue02))
  180.                                 {
  181.                                     if ($nodeName02==='label')
  182.                                     {
  183.                                         if ($abriu_itemmenu==1)
  184.                                         {
  185.                                             $Writer->endElement();
  186.                                             $abriu_itemmenu 0;
  187.                                         }
  188.                                         $Writer->startElement'menuitem' );
  189.                                         $Writer->writeAttribute $nodeName02 $nodeValue02 );
  190.                                     }else{
  191.                                         $Writer->writeElement $nodeName02 $nodeValue02 );
  192.                                         $abriu_menu = ($nodeName02==='action')?1:0;
  193.                                     }
  194.                                 }else{
  195.                                     if ($abriu_menu==0)
  196.                                     {
  197.                                         $Writer->startElement'menu' );
  198.                                         $abriu_menu 1;
  199.                                     }
  200.                                     forEach ( $nodeValue02 as $nodeName03 => $nodeValue03 )
  201.                                     {
  202.                                         if (!is_array($nodeValue03))
  203.                                         {
  204.                                             if ($nodeName03==='label')
  205.                                             {
  206.                                                 if ($abriu_itemmenu==1)
  207.                                                 {
  208.                                                     $Writer->endElement();
  209.                                                     $abriu_itemmenu 0;
  210.                                                 }
  211.                                                 $Writer->startElement'menuitem' );
  212.                                                 $Writer->writeAttribute $nodeName03 $nodeValue03 );
  213.                                             }else{
  214.                                                 $Writer->writeElement $nodeName03 $nodeValue03 );
  215.                                                 $abriu_itemmenu = ($nodeName03==='action')?1:0;
  216.                                             }
  217.                                         }else{
  218.                                             if ($abriu_menu==0)
  219.                                             {
  220.                                                 $Writer->startElement'menu' );
  221.                                                 $abriu_menu 1;
  222.                                             }
  223.                                             forEach ( $nodeValue03 as $nodeName04 => $nodeValue04 )
  224.                                             {
  225.                                                 if ($nodeName04==='label')
  226.                                                 {
  227.                                                     if ($abriu_itemmenu==1)
  228.                                                     {
  229.                                                         $Writer->endElement();
  230.                                                         $abriu_itemmenu 0;
  231.                                                     }
  232.                                                     $Writer->startElement'menuitem' );
  233.                                                     $Writer->writeAttribute $nodeName04 $nodeValue04 );
  234.                                                 }else{
  235.                                                     $Writer->writeElement $nodeName04 $nodeValue04 );
  236.                                                     $abriu_itemmenu 1;
  237.                                                     $ultimo_nivel 1;
  238.                                                 }                                                
  239.                                             }
  240.                                         }
  241.                                     }
  242.                                 }
  243.                             }
  244.                         }
  245.                     }
  246.                 }
  247.             }    
  248.             $Writer->endElement();
  249.             $Writer->endElement();
  250.             $Writer->endElement();
  251.             $Writer->endElement();
  252.             $Output $Writer->outputMemory true ) ;
  253.             //$fHandle = fopen ( 'backup.xml' , 'w+' ) ;  
  254.             $fHandle fopen 'menu.xml' 'w+' ) ;  
  255.             fwrite $fHandle $Output ) ;
  256.             fclose $fHandle ) ;        
  257.             return 1;
  258.         
  259.         }
  260.         catch (Exception $e// in case of exception
  261.         {
  262.             // shows the exception error message
  263.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  264.             
  265.             // undo all pending operations
  266.             TTransaction::rollback();
  267.         }
  268.         
  269.     }
  270. ?>
FV

Blz, vou fazer algo parecido, qualquer dúvida pergunto aqui de novo, obrigado!
HP

Não considero isso um menu dinâmico.
Menu dinâmico, é aquele criado no momento que o menu é carregado, baseado numa tabela de dados e que pode ser modificado conforme o usuário logado.

Quando se cria um xml, o menu fica dependente desse XML, para alterar o menu o xml tem que ser modificado.

Um menu dinâmico possibilita ter um item (aplicação) em posições diferente na hierarquia dos itens conforme o usuário logado.
NC

Haroldo, considero dinamico pelo seguinte:

1) O arquivo XML é criado pelo sistema, e não manualmente como proposto incialmente pelo ERP III

2) O usuário só visualiza e acessa os programas que ele tem acesso (dinamicamente), seguindo a proposta inicial do ERP III

3) Como o menu é carregado no perfil do usuário dinamicamente via arquivo XML e o controle de acesso via variaveis da sessão, fica mais rapido do que acesso ao banco.

Você escreveu "Um menu dinâmico possibilita ter um item (aplicação) em posições diferente na hierarquia dos itens conforme o usuário logado.", talvez não conheça a proposta do ERP III, pois ele faz exatamente isto com a diferença que ele busca as informações no arquivo XML.

Faz um teste e verá que é dinamico sim.


HP

Nilton,

Realmente não vi o ERP III. Na verdade não programo com FW Adiant, ainda.
Só discordo do termo Dinâmico, buscando a geração do menu em um xml. Dinâmico para mim é é aquilo que pode ser modificado em temo de execução e funcional a mult-usuário, ou seja ao mesmo tempo usuários diferentes acessando menus que pode ser modificados durante a execução. Se a estrutura do menu está vinculado a um arquivo xml escrito no disco, o menu é fixo, apenas a permissividade libera ou não itens desse menu. A não ser que ao carregar o menu um xml (exclusivo para cada usuário) seja criado no momento de sua carga.
Eu penso em um menu dinâmico criando seus itens no momento de sua carga lendo diretamente uma tabela de dados sem passar por um xml.

HP

Desculpe, os erros, respondi pelo celular.
HP

Isso eu poso entender como menu dinâmico:

www.adianti.com.br/forum/pt/view_604?menu-composite
PD

Haroldo,

O XML suporta múltiplos níveis e é de mais fácil manutenção do que criar uma estrutura em banco multinível.
Além disso, as permissões são carregadas e filtram o menu no momento do login, como o Nilson disse.
Não existe muitas vantagens em manter essa estrutura no banco de dados, a não ser que tenha um bom argumento ;-)
Mesmo que você altere essa estrutura enquanto o usuário estiver logado, o menu dele não vai ser alterado, isto por que o Framework recarrega somente a parte central da tela, via ajax.
Você teria de alterar o Framework para forçar um recarga total de página à cada clique de link, ou o usuário teria de dar um [F5] para atualizar o menu.
Mesmo assim, imagine que teriam de ser executados vários SELECT's para ler as permissões da base de dados sempre que atualizar a página.
Hoje, no momento do login, as permissões são carregadas, e depois não mais, para diminuir o fluxo de informações entre a aplicação e o BD.

Atenciosamente,
HP

Eu só discordo do termo Dinâmico. quanto ao formato da geração do menu ser por xml, por mim tudo bem.