added sorters.

This commit is contained in:
Paweł Jędrzejewski 2011-11-02 11:12:57 +01:00
parent a78b50a71d
commit 4ad9b5e652
6 changed files with 98 additions and 2 deletions

View file

@ -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();

View file

@ -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()));
}

View file

@ -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>

View 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);
}
}

View 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);
}

View file

@ -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.