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:
Na limpeza de um filtro, adicionado o método que limpa os dados do KeepNavigation:
Sempre que uma nova consulta for realizada, também devemos limpar os dados do KeepNavigation:
No onReload dos dados é que a coisa acontece, a ele foi adicionada uma única linha, vejam:
É isso ai, um abraço a todos!
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!
Eita... acima, cometi um erro, vejam abaixo:
Deve ser:
Mas aguardem, estamos montando uma classe para simplificar isso mais ainda...
Obrigado por compartilhar. Seria bem legal se fosse padrão.
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.
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
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:
b) na Função onSearch mude:
c) na função onReload mude:
Com essas poucas mudanças todas lista padrão irá manter a navegação mesmo que troque de página.
Espero que ajude
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":
Um grande abraço para todos os usuários do Adianti.