mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-14 09:02:12 +00:00
added sorters.
This commit is contained in:
parent
a78b50a71d
commit
4ad9b5e652
6 changed files with 98 additions and 2 deletions
|
|
@ -29,8 +29,10 @@ class OrderController extends ContainerAware
|
||||||
public function listAction()
|
public function listAction()
|
||||||
{
|
{
|
||||||
$orderManager = $this->container->get('sylius_sales.manager.order');
|
$orderManager = $this->container->get('sylius_sales.manager.order');
|
||||||
$paginator = $orderManager->createPaginator();
|
|
||||||
|
|
||||||
|
$orderSorter = $this->container->get('sylius_sales.sorter.order');
|
||||||
|
|
||||||
|
$paginator = $orderManager->createPaginator($orderSorter);
|
||||||
$paginator->setCurrentPage($this->container->get('request')->query->get('page', 1));
|
$paginator->setCurrentPage($this->container->get('request')->query->get('page', 1));
|
||||||
|
|
||||||
$orders = $paginator->getCurrentPageResults();
|
$orders = $paginator->getCurrentPageResults();
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
namespace Sylius\Bundle\SalesBundle\Entity;
|
namespace Sylius\Bundle\SalesBundle\Entity;
|
||||||
|
|
||||||
|
use Sylius\Bundle\SalesBundle\Sorting\SorterInterface;
|
||||||
|
|
||||||
use Sylius\Bundle\SalesBundle\Model\OrderInterface;
|
use Sylius\Bundle\SalesBundle\Model\OrderInterface;
|
||||||
use Sylius\Bundle\SalesBundle\Model\OrderManager as BaseOrderManager;
|
use Sylius\Bundle\SalesBundle\Model\OrderManager as BaseOrderManager;
|
||||||
use Doctrine\ORM\EntityManager;
|
use Doctrine\ORM\EntityManager;
|
||||||
|
|
@ -60,13 +62,17 @@ class OrderManager extends BaseOrderManager
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function createPaginator()
|
public function createPaginator(SorterInterface $sorter = null)
|
||||||
{
|
{
|
||||||
$queryBuilder = $this->entityManager->createQueryBuilder()
|
$queryBuilder = $this->entityManager->createQueryBuilder()
|
||||||
->select('o')
|
->select('o')
|
||||||
->from($this->class, 'o')
|
->from($this->class, 'o')
|
||||||
->orderBy('o.createdAt', 'DESC');
|
->orderBy('o.createdAt', 'DESC');
|
||||||
|
|
||||||
|
if (null != $sorter) {
|
||||||
|
$sorter->sort($queryBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
return new Pagerfanta(new DoctrineORMAdapter($queryBuilder->getQuery()));
|
return new Pagerfanta(new DoctrineORMAdapter($queryBuilder->getQuery()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
<parameter key="sylius_sales.manager.order.class">Sylius\Bundle\SalesBundle\Entity\OrderManager</parameter>
|
<parameter key="sylius_sales.manager.order.class">Sylius\Bundle\SalesBundle\Entity\OrderManager</parameter>
|
||||||
<parameter key="sylius_sales.manager.item.class">Sylius\Bundle\SalesBundle\Entity\ItemManager</parameter>
|
<parameter key="sylius_sales.manager.item.class">Sylius\Bundle\SalesBundle\Entity\ItemManager</parameter>
|
||||||
<parameter key="sylius_sales.manager.status.class">Sylius\Bundle\SalesBundle\Model\StatusManager</parameter>
|
<parameter key="sylius_sales.manager.status.class">Sylius\Bundle\SalesBundle\Model\StatusManager</parameter>
|
||||||
|
<parameter key="sylius_sales.sorter.order.class">Sylius\Bundle\SalesBundle\Sorting\ORM\OrderSorter</parameter>
|
||||||
</parameters>
|
</parameters>
|
||||||
|
|
||||||
<services>
|
<services>
|
||||||
|
|
@ -23,6 +24,13 @@
|
||||||
<argument>%sylius_sales.statuses%</argument>
|
<argument>%sylius_sales.statuses%</argument>
|
||||||
<argument type="service" id="translator" />
|
<argument type="service" id="translator" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<!-- sorters... -->
|
||||||
|
<service id="sylius_sales.sorter.order" class="%sylius_sales.sorter.order.class%">
|
||||||
|
<call method="setContainer">
|
||||||
|
<argument type="service" id="service_container" />
|
||||||
|
</call>
|
||||||
|
</service>
|
||||||
</services>
|
</services>
|
||||||
|
|
||||||
</container>
|
</container>
|
||||||
|
|
|
||||||
57
src/Sylius/Bundle/SalesBundle/Sorting/ORM/OrderSorter.php
Normal file
57
src/Sylius/Bundle/SalesBundle/Sorting/ORM/OrderSorter.php
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Sylius package.
|
||||||
|
*
|
||||||
|
* (c) Paweł Jędrzejewski
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Sylius\Bundle\SalesBundle\Sorting\ORM;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerAware;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Sylius\Bundle\AssortmentBundle\Sorting\SorterInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default ORM sorter.
|
||||||
|
* Sorts order entities.
|
||||||
|
*
|
||||||
|
* @author Paweł Jędrzejewski <pjedrzejewski@diweb.pl>
|
||||||
|
*/
|
||||||
|
class OrderSorter extends ContainerAware implements SorterInterface
|
||||||
|
{
|
||||||
|
public function sort($sortable)
|
||||||
|
{
|
||||||
|
if (!$sortable instanceof QueryBuilder) {
|
||||||
|
throw new InvalidArgumentException('Default sorter supports only "Doctrine\\ORM\\QueryBuilder" as sortable argument.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$request = $this->container->get('request');
|
||||||
|
|
||||||
|
if (null === $sortProperty = $request->query->get('sort', null)) {
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sortOrder = $request->query->get('order', 'ASC');
|
||||||
|
|
||||||
|
if (!in_array($sortOrder, array('ASC', 'DESC'))) {
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$orderClass = $this->container->getParameter('sylius_sales.model.order.class');
|
||||||
|
$reflectionClass = new \ReflectionClass($orderClass);
|
||||||
|
|
||||||
|
if (!in_array($sortProperty, array_keys($reflectionClass->getDefaultProperties()))) {
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var QueryBuilder */
|
||||||
|
$sortable->orderBy('o.' . $sortProperty, $sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/Sylius/Bundle/SalesBundle/Sorting/SorterInterface.php
Normal file
22
src/Sylius/Bundle/SalesBundle/Sorting/SorterInterface.php
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Sylius package.
|
||||||
|
*
|
||||||
|
* (c) Paweł Jędrzejewski
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Sylius\Bundle\SalesBundle\Sorting;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for sorter.
|
||||||
|
*
|
||||||
|
* @author Paweł Jędrzejewski <pjedrzejewski@diweb.pl>
|
||||||
|
*/
|
||||||
|
interface SorterInterface
|
||||||
|
{
|
||||||
|
function sort($sortable);
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,7 @@ namespace Sylius\Bundle\SalesBundle;
|
||||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
use Sylius\Bundle\SalesBundle\DependencyInjection\Compiler\RegisterOperationsPass;
|
use Sylius\Bundle\SalesBundle\DependencyInjection\Compiler\RegisterOperationsPass;
|
||||||
|
use Sylius\Bundle\SalesBundle\DependencyInjection\Compiler\RegisterSortersPass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bundle of sales system.
|
* Bundle of sales system.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue