~danielside/rptfront

90e30bc895f14709fda562e6492d99aa6fea8bc3 — Danielside 1 year, 2 months ago 36b6a26
implementa criterios de ordenación seleccionables
M lib/Db/Puesto.php => lib/Db/Puesto.php +35 -1
@@ 5,10 5,12 @@ use Rpt\Db\Entidad;
use Rpt\Db\Retribucion;
use \PDO;
use Rpt\SearchCriteria\ISearchPuestoCriteria;
use Rpt\OrderCriteria\IOrderPuestoCriteria;

class Puesto extends Entidad
{
    private $criteria;
    private $orderCriteria;
    private $pageSize;
    private $totalPages;
    private $totalEncontrados;


@@ 60,6 62,11 @@ class Puesto extends Entidad
        $this->criteria[] = $criteria;
    }

    public function addOrderCriteria(IOrderPuestoCriteria $criteria)
    {
        $this->orderCriteria[] = $criteria;
    }

    public function search($page = 1)
    {
        $query = $this->getRootQueryStart();


@@ 76,7 83,34 @@ class Puesto extends Entidad
            $substitutions = array_merge($substitutions, $criteria->getSubstitutions());
        }

        $query .= " ORDER BY puesto.nivel, puesto.ministerio_id, puesto.centrodirectivo_id, puesto.unidad_id";
        $queryDefaultOrderBy = " ORDER BY puesto.nivel asc, puesto.ministerio_id asc, puesto.centrodirectivo_id asc, puesto.unidad_id asc";

        $queryOrderBy = " ORDER BY ";
        $orderByNormalizado = [];
        if (count($this->orderCriteria) == 0) {
            $queryOrderBy = $queryDefaultOrderBy;
        } else {
            foreach ($this->orderCriteria as $oc) {
                if (!isset($orderByNormalizado[$oc->getCampo()])) {
                    $orderByNormalizado[$oc->getCampo()] = $oc;
                }
            }
        }

        if (empty($orderByNormalizado)) {
            $queryOrderBy = $queryDefaultOrderBy;
        } else {
            $firstOrderBy = true;
            foreach ($orderByNormalizado as $oc) {
                if (!$firstOrderBy) {
                    $queryOrderBy .= ", ";
                }
                $queryOrderBy .= $oc->getSQLFragment();
                $firstOrderBy = false;
            }
        }

        $query = $query .= $queryOrderBy;

        $sth = $this->db->prepare($query);
        $sth->execute($substitutions);

A lib/OrderCriteria/IOrderPuestoCriteria.php => lib/OrderCriteria/IOrderPuestoCriteria.php +15 -0
@@ 0,0 1,15 @@
<?php
namespace Rpt\OrderCriteria;

interface IOrderPuestoCriteria
{
    public function getSQLFragment();

    public function getCampo(): string;
    
    /**
     * The criteria returns the clause with parameter markers
     * so it requires further subst. in execution
     */
    public function getSubstitutions();
}

A lib/OrderCriteria/OrderPuestoCriteria.php => lib/OrderCriteria/OrderPuestoCriteria.php +31 -0
@@ 0,0 1,31 @@
<?php
namespace Rpt\OrderCriteria;

use Rpt\OrderCriteria\IOrderPuestoCriteria as IOrderPuestoCriteria;

class OrderPuestoCriteria implements IOrderPuestoCriteria
{
    private $campo;
    private $direccion;

    public function __construct($campo, $direccion = 'asc')
    {
        $this->campo = $campo;
        $this->direccion = $direccion;
    }

    public function getCampo(): string
    {
        return $this->campo;
    }

    public function getSQLFragment()
    {
        return $this->campo . " " . $this->direccion;
    }

    public function getSubstitutions()
    {
        return [];
    }
}

M public_html/index.php => public_html/index.php +18 -2
@@ 18,6 18,7 @@ use Rpt\SearchCriteria\PaisPuestoCriteria;
use Rpt\SearchCriteria\ProvinciaPuestoCriteria;
use Rpt\SearchCriteria\ProvisionPuestoCriteria;
use Rpt\SearchCriteria\TextoLibreCriteria;
use Rpt\OrderCriteria\OrderPuestoCriteria;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;



@@ 232,9 233,24 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
    $ordenacion3 = $parametros['ordenacion_3'];
    $ordenacion4 = $parametros['ordenacion_4'];


    die(var_export($request->getParsedBody(), true));
    $puesto = $app->getContainer()['puesto'];

    //En este punto los valores de los campos de ordenación están validados pero
    //pueden estar repetidos, más tarde la función de búsqueda tiene
    //la responsabilidad de normalizar el conjunto
    if (!empty($ordenacion1)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion1));
    }
    if (!empty($ordenacion2)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion2));
    }
    if (!empty($ordenacion3)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion3));
    }
    if (!empty($ordenacion4)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion4));
    }
    
    $puesto->addSearchCriteria(new NivelPuestoCriteria((int)$nivelMinimo, (int)$nivelMaximo));
    $puesto->addSearchCriteria(new OrganismoCriteria($organismo));
    if (!($estado == 'ambos')) {

M templates/buscarpt.php => templates/buscarpt.php +1 -1
@@ 191,7 191,7 @@
                if (isset($flash['defaults'][$campo]) && $campobd == $flash['defaults'][$campo]) {
                    $selected = "selected";
                }
                echo "<option value='$campo' $selected>$etiqueta</option>";
                echo "<option value='$campobd' $selected>$etiqueta</option>";
            }
            echo "</select>";
        }