KeepNavigation 1.00.00 - Classe para manter a paginação Olá, boa tarde, Mais cedo fiz uma postagem em http://www.adianti.com.br/forum/pt/view_4420 Um colega meu pegou esse código e fez um componente, ficou bem bacana, uma vez instalado, seu uso é muito fácil, abaixo detalhes. Ao limpar um filtro, limpamos também os dados do KeepNavigation: public function onClean() { $this->form->clear(); // ...
MD
KeepNavigation 1.00.00 - Classe para manter a paginação  
Olá, boa tarde,

Mais cedo fiz uma postagem em www.adianti.com.br/forum/pt/view_4420

Um colega meu pegou esse código e fez um componente, ficou bem bacana, uma vez instalado, seu uso é muito fácil, abaixo detalhes.

Ao limpar um filtro, limpamos também os dados do KeepNavigation:
public function onClean() { $this->form->clear(); // clear the search data in the session TSession::setValue('List_filter_data', Null); // limpa dados do keepNavigation KeepNavigation::clear(get_class($this)); $param=array(); $param['offset'] =0; $param['first_page']=1; $this->onReload($param); }


Da mesma forma, ao realizar um novo filtro, também limpamos os dados do KeepNavigation.
/** * Register the filter in the session */ public function onSearch() { // get the search form data $data = $this->form->getData(); // clear session filters TSession::setValue('List_filter_data', Null); // limpa dados do keepNavigation KeepNavigation::clear(get_class($this)); // Restante do onSearch não é modificado }


Já no onReload, quando uma listagem é acessada, os dados parâmetros são nulos, nesse caso, o KeepNavigation devolve os dados de paginação do último acesso. Caso a paginação seja utilizada, ou ainda, caso algum parâmetro seja encaminhado para o onReload, ele são atualizados no KeepNavigation:
/** * Load the datagrid with data */ public function onReload($param = NULL) { try { // open a transaction with database 'database' TTransaction::open('database'); // creates a repository for List $repository = new TRepository('List'); $limit = 10; // creates a criteria $criteria = new TCriteria; // atualiza ou recupera os parametros de paginação com dados da sessão $param = KeepNavigation::update($param, get_class($this)); // default order if (empty($param['order'])) { $param['order'] = 'id'; $param['direction'] = 'asc'; } $criteria->setProperties($param); // order, offset $criteria->setProperty('limit', $limit); // Restante do onReload não é modificado } }


É isso ai, com o componente e apenas 3 linhas podemos manter a paginação ao entrar e sair das listagens.

Abraço!

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (6)


LC

Funcionou perfeito. Valeu!
FA

Boa tarde,

Excelente post, experimentei aqui e funcionou super bem mas observei que as listas feitas usando o TStandardList não tinham como usar o KeepNavigation. Um pequeno estudo e pesquisa nas classes base do Adianti e achei onde implementar a mudança para funcionar em toda listagem padrão.

1º Passo - Copiar o KeepNavigation.class.php para a pasta meu_projeto/lib/adianti/base
2º Passo - Troque o nome do KeepNavigation.class.php para KeepNavigation.php
3º Passo - Edite na pasta meu_projeto/lib/adianti/base AdiandiStandardListTrait.php e faço o seguinte:
a) Adicione no início:
 
  1. <?php
  2. namespace Adianti\Base;
  3. use Adianti\Core\AdiantiCoreTranslator;
  4. use Adianti\Widget\Base\TElement;
  5. use Adianti\Widget\Dialog\TMessage;
  6. use Adianti\Widget\Dialog\TQuestion;
  7. use Adianti\Control\TAction;
  8. use Adianti\Database\TTransaction;
  9. use Adianti\Database\TRepository;
  10. use Adianti\Database\TRecord;
  11. use Adianti\Database\TFilter;
  12. use Adianti\Database\TCriteria;
  13. use Adianti\Registry\TSession;
  14. use Exception;
  15. use KeepNavigation;//Usa o KeepNavigation
  16. /**
  17. * Standard List Trait
  18. *
  19. * @version 5.5
  20. * @package base
  21. * @author Pablo Dall'Oglio
  22. * @copyright Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  23. * @license http://www.adianti.com.br/framework-license
  24. */
  25. </code>

b) na Função onSearch mude:
public function onSearch() { // get the search form data $data = $this->form->getData(); if ($this->formFilters) { foreach ($this->formFilters as $filterKey => $formFilter) { [...] } } // limpa dados do keepNavigation KeepNavigation::clear(get_class($this)); TSession::setValue($this->activeRecord.'_filter_data', $data); TSession::setValue(get_class($this).'_filter_data', $data); [...]


c) na função onReload mude:
public function onReload($param = NULL) { try { [...] // creates a criteria $criteria = isset($this->criteria) ? clone $this->criteria : new TCriteria; // atualiza ou recupera os parametros de paginação com dados da sessão $param = KeepNavigation::update($param, get_class($this)); if ($this->order) { [...]


Com essas poucas mudanças todas lista padrão irá manter a navegação mesmo que troque de página.

Espero que ajude
FA


b) na Função onSearch mude:
 
  1. <?php
  2. public function onSearch() { // get the search form data $data = $this->form->getData(); if ($this->formFilters) { foreach ($this->formFilters as $filterKey => $formFilter) { [...] } } // limpa dados do keepNavigation KeepNavigation::clear(get_class($this)); TSession::setValue($this->activeRecord.'_filter_data', $data); TSession::setValue(get_class($this).'_filter_data', $data); [...]
FA

Boa tarde,

Excelente post, experimentei aqui e funcionou super bem mas observei que as listas feitas usando o TStandardList não tinham como usar o KeepNavigation. Um pequeno estudo e pesquisa nas classes base do Adianti e achei onde implementar a mudança para funcionar em toda listagem padrão.

1º Passo - Copiar o KeepNavigation.class.php para a pasta meu_projeto/lib/adianti/base
2º Passo - Troque o nome do KeepNavigation.class.php para KeepNavigation.php
3º Passo - Edite na pasta meu_projeto/lib/adianti/base AdiandiStandardListTrait.php e faço o seguinte:
a) Adicione no início:

 
  1. <?php
  2. namespace Adianti\Base;
  3. use Adianti\Core\AdiantiCoreTranslator;
  4. use Adianti\Widget\Base\TElement;
  5. use Adianti\Widget\Dialog\TMessage;
  6. use Adianti\Widget\Dialog\TQuestion;
  7. use Adianti\Control\TAction;
  8. use Adianti\Database\TTransaction;
  9. use Adianti\Database\TRepository;
  10. use Adianti\Database\TRecord;
  11. use Adianti\Database\TFilter;
  12. use Adianti\Database\TCriteria;
  13. use Adianti\Registry\TSession;
  14. use Exception;
  15. use KeepNavigation;//Usa o KeepNavigation
  16. /**
  17. * Standard List Trait
  18. *
  19. * @version 5.5
  20. * @package base
  21. * @author Pablo Dall'Oglio
  22. * @copyright Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  23. * @license http://www.adianti.com.br/framework-license
  24. */
  25. ?>



b) na Função onSearch mude:
 
  1. <?php
  2. public function onSearch()
  3. {
  4. // get the search form data
  5. $data = $this->form->getData();
  6. if ($this->formFilters)
  7. {
  8. [...]
  9. }
  10. // limpa dados do keepNavigation
  11. KeepNavigation::clear(get_class($this));
  12. TSession::setValue($this->activeRecord.'_filter_data', $data);
  13. TSession::setValue(get_class($this).'_filter_data', $data);
  14. [...]
  15. ?>


c) na função onReload mude:
 
  1. <?php
  2. public function onReload($param = NULL)
  3. {
  4. try
  5. {
  6. [...]
  7. // creates a criteria
  8. $criteria = isset($this->criteria) ? clone $this->criteria : new TCriteria;
  9. // atualiza ou recupera os parametros de paginação com dados da sessão
  10. $param = KeepNavigation::update($param, get_class($this));
  11. if ($this->order)
  12. {
  13. [...]
  14. ?>


Com essas poucas mudanças todas lista padrão irá manter a navegação mesmo que troque de página.

Espero que ajude

PS: Estou postando novamente pois na primeira tentativa deu ruim...
AR

Excelente contribuição.
Segue o agradecimento ao @Fernando Araújo e ao @Marco Driemeyer.
Bastou descompactar o arquivo zip e seguir as instruções para permitir o controle de navegação nas paginações dos grids.
Só completando as instruções, precisei adicionar a seguinte linha no arquivo "libadianticoreAdiantiClassMap.php" para reconhecer a classe do "KeepNavigation":
$classPath['KeepNavigation'] = 'lib/adianti/base/KeepNavigation.php'; //Alair

Um grande abraço para todos os usuários do Adianti.
AR

Onde consigo baixar essa classe?