<?php
namespace App\Utils;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class CustomFilter
{
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 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(){
return [
'defaultSortFieldName' => $this->sort,
'defaultSortDirection' => $this->order,
];
}
public function __construct(Request $request = null, $filters = '', $form_name = '', ParameterBagInterface $params)
{
$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($request !== null && ($request->query->get('clear') == '1' || $request->get('clear') == '1')){
/**
* Eliminar filtro actual de la sesión
*/
$this->eliminarFiltro();
}
if($form_name != "" && $request->query->get($form_name)){
/**
* Para recibir el formulario enviado por get para aplicar el filtro al formulario...
*/
$this->añadirFiltrosForm($request->query->get($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 añadirFiltrosForm($data){
$this->añadirFiltrosForm2($data);
foreach($data as $key => $dat){
if(is_object($dat)){
if( $dat instanceof \ArrayAccess){
$data[$key]=array();
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'){
$sortForm = isset($this->data['sort']) ? $this->data['sort'] : false;
$orderForm = isset($this->data['order']) ? $this->data['order'] : false;
$this->sort = ($request_sort ? $request_sort : ($sortForm ? $sortForm : $default_sort) );
$this->order = ($request_order ? $request_order : ( $orderForm ? $orderForm : $default_order) );
if(($request_sort == null && $request_order == null) && ($sortForm == null || $orderForm == null)){
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($page == 0 && $limit == 0){
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);
}else{
if( $this->session->get($this->nombre_variable) != null){ //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;
}
}
}