menu
Fórum Adianti
menu Menu
Mantendo a Paginação nas Listagens Olá, bom dia, Você usa paginação com frequência nos seus sistemas? Em algum momento os usuários reclamaram que ao sair de uma determinada tela, ou ainda, ao editar algum objeto e voltar a paginação voltou para o inicio? Pois bem, isso aconteceu conosco, desenvolvemos uma solução bem simples para isso, espero que possa ajudar aos demais. Essa solução aplica-se as classes "*...
MD
Mantendo a Paginação nas Listagens  
Olá, bom dia,

Você usa paginação com frequência nos seus sistemas?

Em algum momento os usuários reclamaram que ao sair de uma determinada tela, ou ainda, ao editar algum objeto e voltar a paginação voltou para o inicio?

Pois bem, isso aconteceu conosco, desenvolvemos uma solução bem simples para isso, espero que possa ajudar aos demais.

Essa solução aplica-se as classes "*List.php" que são completas, mas talvez o Pabllo possa implementar nas listagens padrões caso ache útil também, abaixo detalhado seguem as modificações realizadas:

Dois métodos foram adicionados a classe:
/** * Metodo usado para manter limpar os dados da paginação quando se realiza um filtro ou * ainda quando se limpa o filtro */ private function clearKeepNavigation() { // Recupera o nome da classe para ser dinâmico $class_name = get_class($this); // dados do keepNavigation TSession::setValue("{$class_name}_filter_order", NULL); TSession::setValue("{$class_name}_filter_offset", NULL); TSession::setValue("{$class_name}_filter_limit", NULL); TSession::setValue("{$class_name}_filter_direction", NULL); TSession::setValue("{$class_name}_filter_page", NULL); TSession::setValue("{$class_name}_filter_first_page", NULL); } /** * Metodo usado para manter a paginação mesmo quando se entra ou sai da listagem * esse metodo é chamado pelo onReload com os parametros recebidos e então ele os * armazena na sessão para devolver os mesmos quando a pagina for novamente acessada * os dados aqui colocados na sessão somente são limpos quando a pagina é limpa ou ainda * quando uma nova busca por dados é realizada */ private function keepNavigation($param) { // Recupera o nome da classe para ser dinâmico $class_name = get_class($this); // a lógica é simples, se os parâmetros informados contém uma order, ela é atualizada na sessão // já se o parâmetro é null significa que devemos devolver a última informação salva na sessão // ao final, retornamos $param tal qual ela entrou no método, ou atualizada com os dados da paginação salva if (!isset($param['order'])){ if (TSession::getValue("{$class_name}_filter_order")) $param['order'] = TSession::getValue("{$class_name}_filter_order"); } else { TSession::setValue("{$class_name}_filter_order", $param['order']); } if (!isset($param['offset'])){ if (TSession::getValue("{$class_name}_filter_offset")) $param['offset'] = TSession::getValue("{$class_name}_filter_offset"); } else { TSession::setValue('Equipamento_filter_offset', $param['offset']); } if (!isset($param['limit'])){ if (TSession::getValue("{$class_name}_filter_limit")) $param['limit'] = TSession::getValue("{$class_name}_filter_limit"); } else { TSession::setValue("{$class_name}_filter_limit", $param['limit']); } if (!isset($param['direction'])){ if (TSession::getValue("{$class_name}_filter_direction")) $param['direction'] = TSession::getValue("{$class_name}_filter_direction"); } else { TSession::setValue("{$class_name}_filter_direction", $param['direction']); } if (!isset($param['page'])){ if (TSession::getValue("{$class_name}_filter_page")) $param['page'] = TSession::getValue("{$class_name}_filter_page"); } else { TSession::setValue("{$class_name}_filter_page", $param['page']); } if (!isset($param['first_page'])){ if (TSession::getValue("{$class_name}_filter_first_page")) $param['first_page'] = TSession::getValue("{$class_name}_filter_first_page"); } else { TSession::setValue("{$class_name}_filter_first_page", $param['first_page']); } // retorna os parâmetros eventualmente modificados return $param; }


Na limpeza de um filtro, adicionado o método que limpa 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 $this->clearKeepNavigation(); $param=array(); $param['offset'] =0; $param['first_page']=1; $this->onReload($param); }


Sempre que uma nova consulta for realizada, também devemos limpar 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 $this->clearKeepNavigation(); // Restante do onSearch não é modificado }


No onReload dos dados é que a coisa acontece, a ele foi adicionada uma única linha, vejam:

/** * 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; // Neste ponto, quando usamos a paginação a variável $param manda seus dados para o KeepNavigation // Já se ela for nula (quando acessamos direto a listagem), ela é atualizada com os dados da paginação salva $param = $this->keepNavigation($param); // 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, um abraço a todos!


Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (6)


MD

Eita... acima, cometi um erro, vejam abaixo:

if (!isset($param['offset'])){ if (TSession::getValue("{$class_name}_filter_offset")) $param['offset'] = TSession::getValue("{$class_name}_filter_offset"); } else { TSession::setValue('Equipamento_filter_offset', $param['offset']); }


Deve ser:
if (!isset($param['offset'])){ if (TSession::getValue("{$class_name}_filter_offset")) $param['offset'] = TSession::getValue("{$class_name}_filter_offset"); } else { TSession::setValue("{$class_name}_filter_offset", $param['offset']); }


Mas aguardem, estamos montando uma classe para simplificar isso mais ainda...
FT

Obrigado por compartilhar. Seria bem legal se fosse padrão.
MR

Pablo, poderia colocar este comportamento de forma padrão no Framework, porque quando um usuário edita um registro e clica em voltar, ele espera poder voltar para a mesma página que ele estava.
MD

Olá,

Pessoal, quem vem usando esse código, favor observa a classe abaixo que simplifica o uso:

www.adianti.com.br/forum/pt/view_4423?keepnavigation-10000-classe-pa
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.         
  7.         if ($this->formFilters)
  8.         {
  9.             [...]
  10.         }
  11.         // limpa dados do keepNavigation 
  12.         KeepNavigation::clear(get_class($this));
  13.         TSession::setValue($this->activeRecord.'_filter_data'$data);
  14.         TSession::setValue(get_class($this).'_filter_data'$data);
  15.         [...]
  16. ?>


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.             
  10.             // atualiza ou recupera os parametros de paginação com dados da sessão 
  11.             $param KeepNavigation::update($paramget_class($this));
  12.             
  13.             if ($this->order)
  14.             {
  15.             [...]
  16. ?>


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

Espero que ajude
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.