From b525265d886907d5f918d2d6de5d56cc69c8b890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20J=C4=99drzejewski?= Date: Thu, 10 Nov 2011 20:29:34 +0100 Subject: [PATCH] added sorting. --- .../Controller/Backend/AddressController.php | 4 +- .../Entity/AddressManager.php | 11 +++- .../Bundle/AddressingBundle/Model/Address.php | 5 ++ .../AddressingBundle/Model/AddressManager.php | 8 --- .../Model/AddressManagerInterface.php | 16 +++--- .../Resources/config/container/driver/ORM.xml | 9 +++ .../Sorting/ORM/AddressSorter.php | 57 +++++++++++++++++++ .../Sorting/SorterInterface.php | 22 +++++++ 8 files changed, 114 insertions(+), 18 deletions(-) create mode 100755 src/Sylius/Bundle/AddressingBundle/Sorting/ORM/AddressSorter.php create mode 100755 src/Sylius/Bundle/AddressingBundle/Sorting/SorterInterface.php diff --git a/src/Sylius/Bundle/AddressingBundle/Controller/Backend/AddressController.php b/src/Sylius/Bundle/AddressingBundle/Controller/Backend/AddressController.php index b403c91ab5..86a999b576 100644 --- a/src/Sylius/Bundle/AddressingBundle/Controller/Backend/AddressController.php +++ b/src/Sylius/Bundle/AddressingBundle/Controller/Backend/AddressController.php @@ -32,8 +32,10 @@ class AddressController extends ContainerAware public function listAction() { $addressManager = $this->container->get('sylius_addressing.manager.address'); - $paginator = $addressManager->createPaginator(); + $addressSorter = $this->container->get('sylius_addressing.sorter.address'); + + $paginator = $addressManager->createPaginator($addressSorter); $paginator->setCurrentPage($this->container->get('request')->query->get('page', 1), true, true); $addresses = $paginator->getCurrentPageResults(); diff --git a/src/Sylius/Bundle/AddressingBundle/Entity/AddressManager.php b/src/Sylius/Bundle/AddressingBundle/Entity/AddressManager.php index 7f35f97a0e..a61e0a9845 100644 --- a/src/Sylius/Bundle/AddressingBundle/Entity/AddressManager.php +++ b/src/Sylius/Bundle/AddressingBundle/Entity/AddressManager.php @@ -17,6 +17,7 @@ use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Sylius\Bundle\AddressingBundle\Model\AddressInterface; use Sylius\Bundle\AddressingBundle\Model\AddressManager as BaseAddressManager; +use Sylius\Bundle\AddressingBundle\Sorting\SorterInterface; /** * Address entity manager. @@ -115,11 +116,17 @@ class AddressManager extends BaseAddressManager /** * {@inheritdoc} */ - public function createPaginator() + public function createPaginator(SorterInterface $sorter = null) { $queryBuilder = $this->entityManager->createQueryBuilder() ->select('a') - ->from($this->class, 'a'); + ->from($this->class, 'a') + ->orderBy('a.createdAt', 'DESC') + ; + + if (null !== $sorter) { + $sorter->sort($queryBuilder); + } return new Pagerfanta(new DoctrineORMAdapter($queryBuilder->getQuery())); } diff --git a/src/Sylius/Bundle/AddressingBundle/Model/Address.php b/src/Sylius/Bundle/AddressingBundle/Model/Address.php index 0e1b8f0fed..951a39c679 100644 --- a/src/Sylius/Bundle/AddressingBundle/Model/Address.php +++ b/src/Sylius/Bundle/AddressingBundle/Model/Address.php @@ -22,6 +22,11 @@ abstract class Address implements AddressInterface protected $createdAt; protected $updatedAt; + public function __construct() + { + $this->incrementCreatedAt(); + } + public function getId() { return $this->id; diff --git a/src/Sylius/Bundle/AddressingBundle/Model/AddressManager.php b/src/Sylius/Bundle/AddressingBundle/Model/AddressManager.php index 6a3e855ac8..7848702511 100644 --- a/src/Sylius/Bundle/AddressingBundle/Model/AddressManager.php +++ b/src/Sylius/Bundle/AddressingBundle/Model/AddressManager.php @@ -42,12 +42,4 @@ abstract class AddressManager implements AddressManagerInterface { return $this->class; } - - /** - * {@inheritdoc} - */ - public function setClass($class) - { - $this->class = $class; - } } diff --git a/src/Sylius/Bundle/AddressingBundle/Model/AddressManagerInterface.php b/src/Sylius/Bundle/AddressingBundle/Model/AddressManagerInterface.php index ac8972928a..2551d7b56e 100644 --- a/src/Sylius/Bundle/AddressingBundle/Model/AddressManagerInterface.php +++ b/src/Sylius/Bundle/AddressingBundle/Model/AddressManagerInterface.php @@ -11,6 +11,8 @@ namespace Sylius\Bundle\AddressingBundle\Model; +use Sylius\Bundle\AddressingBundle\Sorting\SorterInterface; + /** * Address manager interface. * @@ -24,6 +26,13 @@ interface AddressManagerInterface * @return AddressInterface */ function createAddress(); + + /** + * Creates paginator. + * + * @param SorterInterface $sorter + */ + function createPaginator(SorterInterface $sorter = null); /** * Persists address model. @@ -73,11 +82,4 @@ interface AddressManagerInterface * @return string The address model class */ function getClass(); - - /** - * Sets the address model class. - * - * @param string $class The address model class - */ - function setClass($class); } diff --git a/src/Sylius/Bundle/AddressingBundle/Resources/config/container/driver/ORM.xml b/src/Sylius/Bundle/AddressingBundle/Resources/config/container/driver/ORM.xml index 474b3d6aca..5065150e81 100644 --- a/src/Sylius/Bundle/AddressingBundle/Resources/config/container/driver/ORM.xml +++ b/src/Sylius/Bundle/AddressingBundle/Resources/config/container/driver/ORM.xml @@ -17,13 +17,22 @@ Sylius\Bundle\AddressingBundle\Entity\AddressManager + Sylius\Bundle\AddressingBundle\Sorting\ORM\AddressSorter + %sylius_addressing.model.address.class% + + + + + + + diff --git a/src/Sylius/Bundle/AddressingBundle/Sorting/ORM/AddressSorter.php b/src/Sylius/Bundle/AddressingBundle/Sorting/ORM/AddressSorter.php new file mode 100755 index 0000000000..ed473d143b --- /dev/null +++ b/src/Sylius/Bundle/AddressingBundle/Sorting/ORM/AddressSorter.php @@ -0,0 +1,57 @@ + + */ +class AddressSorter 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; + } + + $addressClass = $this->container->getParameter('sylius_addressing.model.address.class'); + $reflectionClass = new \ReflectionClass($addressClass); + + if (!in_array($sortProperty, array_keys($reflectionClass->getDefaultProperties()))) { + + return; + } + + /** @var QueryBuilder */ + $sortable->orderBy('a.' . $sortProperty, $sortOrder); + } +} diff --git a/src/Sylius/Bundle/AddressingBundle/Sorting/SorterInterface.php b/src/Sylius/Bundle/AddressingBundle/Sorting/SorterInterface.php new file mode 100755 index 0000000000..5de36fb515 --- /dev/null +++ b/src/Sylius/Bundle/AddressingBundle/Sorting/SorterInterface.php @@ -0,0 +1,22 @@ + + */ +interface SorterInterface +{ + function sort($sortable); +}