mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-05 20:57: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()
|
||||
{
|
||||
$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));
|
||||
|
||||
$orders = $paginator->getCurrentPageResults();
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@
|
|||
|
||||
namespace Sylius\Bundle\SalesBundle\Entity;
|
||||
|
||||
use Sylius\Bundle\SalesBundle\Sorting\SorterInterface;
|
||||
|
||||
use Sylius\Bundle\SalesBundle\Model\OrderInterface;
|
||||
use Sylius\Bundle\SalesBundle\Model\OrderManager as BaseOrderManager;
|
||||
use Doctrine\ORM\EntityManager;
|
||||
|
|
@ -60,12 +62,16 @@ class OrderManager extends BaseOrderManager
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createPaginator()
|
||||
public function createPaginator(SorterInterface $sorter = null)
|
||||
{
|
||||
$queryBuilder = $this->entityManager->createQueryBuilder()
|
||||
->select('o')
|
||||
->from($this->class, 'o')
|
||||
->orderBy('o.createdAt', 'DESC');
|
||||
|
||||
if (null != $sorter) {
|
||||
$sorter->sort($queryBuilder);
|
||||
}
|
||||
|
||||
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.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.sorter.order.class">Sylius\Bundle\SalesBundle\Sorting\ORM\OrderSorter</parameter>
|
||||
</parameters>
|
||||
|
||||
<services>
|
||||
|
|
@ -23,6 +24,13 @@
|
|||
<argument>%sylius_sales.statuses%</argument>
|
||||
<argument type="service" id="translator" />
|
||||
</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>
|
||||
|
||||
</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\DependencyInjection\ContainerBuilder;
|
||||
use Sylius\Bundle\SalesBundle\DependencyInjection\Compiler\RegisterOperationsPass;
|
||||
use Sylius\Bundle\SalesBundle\DependencyInjection\Compiler\RegisterSortersPass;
|
||||
|
||||
/**
|
||||
* Bundle of sales system.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue