<?php
namespace App\Utils;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
class FilterSession
{
private $requestStack;
private $session;
private $nombre_variable;
private $nombre_variable_get;
private $data;
private $data_get;
private $page;
private $limit;
private $sort;
private $order;
private $params;
public function __construct(Request $request = null, $filters = [], $form_name = '', ?ParameterBagInterface $params = null)
{
//$this->session = new Session();
$this->session = $request->getSession();
$this->nombre_variable = 'filter_'.('' == $form_name ? $request->get('_route') : $form_name);
$this->nombre_variable_get = 'filter_'.('' == $form_name ? $request->get('_route') : $form_name).'_get';
$this->nombre_variable_form = 'filter_'.('' == $form_name ? $request->get('_route') : $form_name).'_form';
$this->data = [];
$this->data_get = [];
$this->params = $params;
if (null !== $request && ('1' == $request->query->get('clear') || '1' == $request->get('clear'))) {
// Eliminar filtro actual de la sesión
$this->eliminarFiltro();
}
if ('' != $form_name && ($request->query->all()[$form_name] ?? null)) {
// Para recibir el formulario enviado por get para aplicar el filtro al formulario...
$this->añadirFiltrosForm($request->query->all()[$form_name]);
}
// Finalmente aplicar las variables de ordenación y paginación.
if ($filters && is_countable($filters) && count($filters) > 0) {
$this->añadirFiltrosOrdenar($request->query->get('sort'), $request->query->get('order'), $filters['sort'], $filters['order']);
$this->añadirFiltrosPaginacion($request->query->getInt('page'), $request->query->getInt('limit'), $filters['page'], $filters['limit']);
}
}
public function getPage()
{
return $this->page;
}
public function getLimit()
{
return $this->limit > 0 ? $this->limit : $this->params->get('PaginationLimit');
}
public function getOrder()
{
return $this->order;
}
public function getSort()
{
return $this->sort;
}
public function getData()
{
return array_merge($this->data, $this->data_get);
}
public function getSortKnp()
{
//defaultSortFieldName
//defaultSortDirection
return [
//$this->params->get('DEFAULT_SORT_FIELD_NAME') => $this->order,
//$this->params->get('DEFAULT_SORT_DIRECTION') => $this->sort
'defaultSortFieldName' => $this->sort,
'defaultSortDirection' => $this->order,
];
}
public function añadirFiltrosForm($data)
{
$this->añadirFiltrosForm2($data);
foreach ($data as $key => $dat) {
if (is_object($dat)) {
if ($dat instanceof \ArrayAccess) {
$data[$key] = [];
foreach ($dat as $key2 => $d) {
if (method_exists($d, 'getid')) {
$data[$key][$key2] = $d->getId();
} elseif ($d instanceof \DateTime) {
$data[$key][$key2] = $d->format('Y-m-d H:i');
}
}
} else {
if (method_exists($dat, 'getid')) {
$data[$key] = $dat->getId();
} elseif ($dat instanceof \DateTime) {
$data[$key] = $dat->format('Y-m-d H:i');
}
}
}
}
$this->data = $data;
$this->session->set($this->nombre_variable, $data);
}
public function añadirFiltrosForm2($data)
{
$this->session->set($this->nombre_variable_form, $data);
}
public function añadirFiltrosOrdenar($request_sort, $request_order, $default_sort, $default_order = 'DESC')
{
$this->sort = ($request_sort ? $request_sort : $default_sort);
$this->order = ($request_order ? $request_order : $default_order);
if (null == $request_sort && null == $request_order) {
if (isset($this->session->get($this->nombre_variable_get)['sort'], $this->session->get($this->nombre_variable_get)['order'])) {
$this->sort = $this->session->get($this->nombre_variable_get)['sort'];
$this->order = $this->session->get($this->nombre_variable_get)['order'];
$this->data_get['sort'] = $this->sort;
$this->data_get['order'] = $this->order;
}
} else {
$this->data_get['sort'] = $this->sort;
$this->data_get['order'] = $this->order;
$this->session->set($this->nombre_variable_get, $this->data_get);
}
}
public function añadirFiltrosPaginacion($page, $limit, $defaul_page = 1, $default_limit = 12)
{
$this->page = ($page > 0 ? $page : $defaul_page);
$this->limit = ($limit > 0 ? $limit : $default_limit);
if (0 == $page && 0 == $limit) {
if (isset($this->session->get($this->nombre_variable_get)['page']) || isset($this->session->get($this->nombre_variable_get)['limite'])) {
$this->page = $this->session->get($this->nombre_variable_get)['page'];
$this->limit = $this->session->get($this->nombre_variable_get)['limit'];
} else {
$this->page = $defaul_page;
$this->limit = $default_limit;
}
} else {
$this->data_get['page'] = $page;
$this->data_get['limit'] = $limit;
$this->session->set($this->nombre_variable_get, $this->data_get);
}
}
public function eliminarFiltro()
{
$this->session->remove($this->nombre_variable);
$this->session->remove($this->nombre_variable_form);
$this->session->remove($this->nombre_variable_get);
}
public function checkFiltroForm($form = false)
{
if ($form) {
return $this->session->get($this->nombre_variable_form);
}
if (null != $this->session->get($this->nombre_variable)) { //Si existen filtros que van por formulario almacenados en la sessión guardar para enviar...
$this->data = $this->session->get($this->nombre_variable);
}
return $this->data;
}
}