Skip to content

Instantly share code, notes, and snippets.

@renatofrota
Last active December 15, 2023 20:20
Show Gist options
  • Save renatofrota/0a2eefbafb7b6112ebb7482070c85d3c to your computer and use it in GitHub Desktop.
Save renatofrota/0a2eefbafb7b6112ebb7482070c85d3c to your computer and use it in GitHub Desktop.
Classe de Navegação para Adianti Framework
<?php
/**
* Classe de Navegação para Adianti Framework
*
* Guarda e recupera parametros relacionados (order, offset, limit, direction, page, first_page)
* para manter o estado da paginação dos datagrids ao navegar pelas classes e janelas do sistema
*
* @author Renato Frota <[email protected]>
*/
/*
Uso:
- obrigatório - 1. no construtor para renderizar a seta de ordenação:
// antes de criar o datagrid
Navegacao::iniciar();
- obrigatório - 2. ao buscar (onSearch) para limpar o estado anterior:
// antes de definir os filtros
Navegacao::limpar();
- obrigatório - 3. ao carregar (onReload) para recuperar o estado de navegação:
// antes de carregar objetos do repositório
$param = Navegacao::salvar();
$criteria->setProperties($param);
- opcional - 4. em uma ação para limpeza dos filtros e da paginação (onClear)
Navegacao::limpar();
AdiantiCoreApplication::loadPage(__CLASS__);
- opcional - 5. em outros métodos de filtragem rápida (ex: onActive)
$data = (object) ['active' => 'Y'];
$filters = [new TFilter('active', '=', 'Y')];
Navegacao::limpar($data, $filters);
AdiantiCoreApplication::loadPage(__CLASS__);
Observações:
- debug_backtrace() funciona na maioria dos ambientes. se não funcionar no seu, passe a classe na chamada dos métodos, ex: Navegacao::salvar($param, __CLASS__);
Mudanças:
- get_called_class() eventualmente retornava a própria classe Navegacao, mesmo quando ela era acionada por um método não estático de outra classe, por isso foi removida.
- adicionado retorno de $_REQUEST para evitar efeitos indesejados ao atribuir o retorno à $param desnecessariamente por engano ($param = Navegacao::metodo()).
*/
class Navegacao
{
/**
* Inicializar parâmetros relevantes para a renderização da datagrid
* @param $class String nome da classe relativa aos filtros (opcional)
*/
public static function iniciar($class = null)
{
$class = $class ?? debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'];
$navegacao = TSession::getValue("{$class}_navegacao");
$params = ['order', 'direction'];
foreach ($params as $param) {
$value = $input[$param] ?? $navegacao[$param] ?? null;
if (isset($value)) $_GET[$param] = $_GET[$param] ?? $value;
}
return $_REQUEST;
}
/**
* Limpar parâmetros de navegação salvos na TSession e opcionalmente definir novos filtros de busca
* @param $data Object com novos dados do formulário de busca (opcional)
* @param $filters Array de elementos TFilter equivalentes aos dados do form (opcional; obrigatório quando houver dados de filtragem)
* @param $class String nome da classe relativa aos filtros (opcional)
*/
public static function limpar(Object $data = null, array $filters = null, $class = null)
{
$class = $class ?? debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'];
TSession::setValue("{$class}_filter_data", $data);
TSession::setValue("{$class}_filters", $filters);
TSession::delValue("{$class}_navegacao");
return $_REQUEST;
}
/**
* Salvar parâmetros de navegação na TSession
* @param $input Array contendo valores de entrada (opcional; $_REQUEST é utilizado quando nulo)
* @param $class String nome da classe relativa aos filtros (opcional)
*/
public static function salvar($input = null, $class = null)
{
$input = $input ?? $_REQUEST;
$class = $class ?? debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'];
$navegacao = TSession::getValue("{$class}_navegacao");
$params = ['order', 'offset', 'limit', 'direction', 'page', 'first_page'];
foreach ($params as $param) {
$value = $input[$param] ?? $navegacao[$param] ?? null;
if (isset($value)) $input[$param] = $navegacao[$param] = $value;
}
TSession::setValue("{$class}_navegacao", $navegacao);
return $input;
}
}
@icomenezes
Copy link

Muito bacana! Parabens!

@delphicleancode
Copy link

top!!! parabéns

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment