Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Adicionando um Evento de Inicialização à TPage Esse artigo abrange o Adianti Framework Web. Sendo assim, não o considere para aplicações GTK. Ele surgiu da necessidade de estruturar melhor a inicialização de um TPage, evitando um dificultoso controle de filtros em sessão e o acúmulo excessivo dos mesmos. Se for do seu interesse desenvolver um sistema web de forma mais segura, evitando problemas com filtros em sessão, continue a le...
GF
Adicionando um Evento de Inicialização à TPage  
Fechado
Esse artigo abrange o Adianti Framework Web. Sendo assim, não o considere para aplicações GTK. Ele surgiu da necessidade de estruturar melhor a inicialização de um TPage, evitando um dificultoso controle de filtros em sessão e o acúmulo excessivo dos mesmos. Se for do seu interesse desenvolver um sistema web de forma mais segura, evitando problemas com filtros em sessão, continue a leitura desse artigo.

Em muitas linguagens de programação encontramos os eventos. Dentre eles, destacamos os eventos de inicialização. No Adianti Framework os eventos podem ser criados pela classe TAction. Essa classe permitirá que sejam instanciados objetos para representar ações como salvar, editar, consultar, excluir, dentre outras inúmeras possibilidades. Entretanto, sempre respeitando as restrições impostas pelo protocolo HTTP.

Quando falamos de ações, há outro aspecto que deve ser considerado. Ele é o ciclo de vida do TPage. No Framework, o ciclo de vida de uma instância de TPage corresponde à construção, representada pelo método construtor. Em seguida existe a possibilidade da execução de algum método, permitindo o processamento de dados e alterações nos estados dos objetos instanciados. Por fim, os widgets, juntamente com a instância de TPage serão transformados numa estrutura de tags html, que será renderizada pelos navegadores (browsers).

O evento de inicialização de um TPage corresponderá a um método executado logo após o construtor. Além disso, ele deve ser executado apenas uma vez. É nesse método que poderá ser feito o “reset” de qualquer filtro ou estado de um objeto armazenado em sessão. A princípio não existe uma solução transparente, pois sempre que um método onSave, ou qualquer outro método é chamado, todo o ciclo de vida do TPage é executado. No entanto, a solução encontrada está na maneira como é feito o acesso ao TPage. O caminho natural para se acessar, por exemplo, uma lista de clientes é o menu superior de navegação. Ele é gerado pela classe TMenu do Framework. Então, deve-se vincular o evento de inicialização ao Action do menu. Isso porque ao sair de uma listagem e ir para outra, significa que o usuário tem a intenção de acessar outro tipo de informação e está carregando de fato um novo componente. É esse o momento em que entra o evento de inicialização, um momento oportuno para eliminar todo e qualquer filtro existente, e deixar o TPage no estado inicial.

Para que se possa executar um método de inicialização haverá necessidade de alguns ajustes no framework.

Ajuste 1 - Classe TMenu: Substituir o método parse pelo código abaixo.

  1. <?php
  2.     /**
  3.      * Parse a XMLElement reading menu entries
  4.      * @param $xml A SimpleXMLElement Object
  5.      */
  6.     public function parse($xml)
  7.     {
  8.         $i 0;
  9.         foreach ($xml as $xmlElement)
  10.         {
  11.             $atts   $xmlElement->attributes();
  12.             $label  = (string) $atts['label'];
  13.             // --> AQUI FOI FEITO O AJUSTE
  14.      $action $xmlElement-> action
  15.             // <-- FIM DO AJUSTE
  16.      $icon   = (string) $xmlElement-> icon;
  17.             
  18.             $menuItem = new TMenuItem($label$action$icon);
  19.             $this->addMenuItem($menuItem);
  20.             
  21.             if ($xmlElement->menu)
  22.             {
  23.                 $menu=new TMenu($xmlElement-> menu-> menuitem);
  24.                 $menuItem->setMenu($menu);
  25.             }
  26.             $i ++;
  27.         }
  28.     }
  29. ?>


Ajuste 2 - Classe TMenuItem: Substituir o método show pelo código abaixo.

  1. <?php    
  2.     /**
  3.      * Shows the widget at the screen
  4.      */
  5.     public function show()
  6.     {
  7.         $link = new TElement('a');
  8.         
  9.         if ($this->action)
  10.         {
  11.             // --> AQUI FOI FEITO O AJUSTE
  12.      $url['class'] = (string) $this->action->class;   
  13.             $url['method'] = (string) $this->action->method;
  14.          // <-- FIM DO AJUSTE       
  15.      $url_str http_build_query($url);
  16.             $link-> href "index.php?{$url_str}";
  17.             $link-> generator 'adianti';
  18.         }
  19.         else
  20.         {
  21.             $link-> href '#';
  22.         }
  23.         
  24.         if (isset($this->image))
  25.         {
  26.             $image = new TImage($this->image);
  27.             $image->style 'padding-right: 8px';
  28.             $link->add($image);
  29.         }
  30.         $link->add($this->label); // converts into ISO
  31.         $this->add($link);
  32.         
  33.         if ($this->menu instanceof TMenu)
  34.         {
  35.             $this->{'class'} = 'dropdown-submenu';
  36.             parent::add($this->menu);
  37.         }
  38.         
  39.         parent::show();
  40.     }
  41. ?>


Ajuste 3 - Arquivo Menu.xml: Dentro da marcação <action> deverão ser colocadas mais duas marcações a <class>, que especifica a classe TPage a ser chamada e a <method>, que especifica o nome do método de inicialização que será chamado. Neste artigo chamamos de onInit, conforme código abaixo.

<menu> <menuitem label='Cadastro'> <menu> <menuitem label='Clientes'> <icon>app/images/ico_wellcome.png</icon> <action> <class>ClienteForm</class> <method> onInit</method> </action> </menuitem> </menu> </menuitem> </menu>


Caso não seja desejado um método de inicialização, basta deixar a marcação <method></method> vazia deste jeito.

Como puderam ser observadas, as modificações foram poucas, mas os benefícios são enormes. Pois agora será possível limpar os filtros que antes estavam ativos, pode-se eliminar um estado de objeto que estava aguardado em sessão, resumindo, pode-se restaurar o estado inicial dos componentes.

Coloco-me a disposição para dirimir qualquer dúvida e prestar qualquer esclarecimento. Espero que tenham gostado.



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 (1)


PD

Parabéns pelo artigo Guilherme!

grande abraço,
Pablo