Skip to content

Commit

Permalink
Merge pull request #4909 from pjedrzejewski/parse-parameters-of-grid-…
Browse files Browse the repository at this point in the history
…driver-configuration

[Grid] Parse parameters of grid driver configuration
  • Loading branch information
michalmarcinkowski committed Apr 29, 2016
2 parents 7f4b5a9 + a5d68c3 commit 549eec8
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 11 deletions.
Expand Up @@ -5,6 +5,8 @@ sylius_grid:
name: doctrine/orm
options:
class: %sylius.model.payment_method.class%
repository:
method: createListQueryBuilder
fields:
code:
type: string
Expand All @@ -23,9 +25,11 @@ sylius_grid:
options:
template: SyliusAdminBundle:Grid/Field:enabled.html.twig
filters:
code:
search:
type: string
label: sylius.ui.code
label: sylius.ui.search
options:
fields: [code, translation.name]
enabled:
type: boolean
label: sylius.ui.enabled
Expand Down
Expand Up @@ -15,6 +15,18 @@

class PaymentMethodRepository extends BasePaymentMethodRepository
{
/**
* {@inheritdoc}
*/
public function createListQueryBuilder()
{
return $this
->createQueryBuilder('o')
->addSelect('translation')
->leftJoin('o.translations', 'translation')
;
}

/**
* {@inheritdoc}
*/
Expand Down
10 changes: 9 additions & 1 deletion src/Sylius/Bundle/GridBundle/Doctrine/ORM/Driver.php
Expand Up @@ -45,7 +45,15 @@ public function getDataSource(array $configuration, Parameters $parameters)
}

$repository = $this->entityManager->getRepository($configuration['class']);
$queryBuilder = $repository->createQueryBuilder('o');

if (isset($configuration['repository']['method'])) {
$callable = [$repository, $configuration['repository']['method']];
$arguments = isset($configuration['repository']['arguments']) ? $configuration['repository']['arguments'] : [];

$queryBuilder = call_user_func_array($callable, $arguments);
} else {
$queryBuilder = $repository->createQueryBuilder('o');
}

return new DataSource($queryBuilder);
}
Expand Down
Expand Up @@ -17,7 +17,7 @@
/**
* @author Paweł Jędrzejewski <pawel@sylius.org>
*/
class ParametersParser
class ParametersParser implements ParametersParserInterface
{
/**
* @var ExpressionLanguage
Expand All @@ -33,10 +33,7 @@ public function __construct(ExpressionLanguage $expression)
}

/**
* @param array $parameters
* @param Request $request
*
* @return array
* {@inheritdoc}
*/
public function parseRequestValues(array $parameters, Request $request)
{
Expand Down
@@ -0,0 +1,28 @@
<?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\ResourceBundle\Controller;

use Symfony\Component\HttpFoundation\Request;

/**
* @author Paweł Jędrzejewski <pawel@sylius.org>
*/
interface ParametersParserInterface
{
/**
* @param array $parameters
* @param Request $request
*
* @return array
*/
public function parseRequestValues(array $parameters, Request $request);
}
Expand Up @@ -11,6 +11,7 @@

namespace Sylius\Bundle\ResourceBundle\Grid\View;

use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
use Sylius\Component\Grid\Data\DataProviderInterface;
use Sylius\Component\Grid\Definition\Grid;
Expand All @@ -27,19 +28,31 @@ class ResourceGridViewFactory implements ResourceGridViewFactoryInterface
*/
private $dataProvider;

/**
* @var ParametersParserInterface
*/
private $parametersParser;

/**
* @param DataProviderInterface $dataProvider
* @param ParametersParserInterface $parametersParser
*/
public function __construct(DataProviderInterface $dataProvider)
public function __construct(DataProviderInterface $dataProvider, ParametersParserInterface $parametersParser)
{
$this->dataProvider = $dataProvider;
$this->parametersParser = $parametersParser;
}

/**
* {@inheritdoc}
*/
public function create(Grid $grid, Parameters $parameters, MetadataInterface $metadata, RequestConfiguration $requestConfiguration)
{
$driverConfiguration = $grid->getDriverConfiguration();
$request = $requestConfiguration->getRequest();

$grid->setDriverConfiguration($this->parametersParser->parseRequestValues($driverConfiguration, $request));

return new ResourceGridView($this->dataProvider->getData($grid, $parameters), $grid, $parameters, $metadata, $requestConfiguration);
}
}
1 change: 1 addition & 0 deletions src/Sylius/Bundle/ResourceBundle/Resources/config/grid.xml
Expand Up @@ -24,6 +24,7 @@
<services>
<service id="sylius.grid.resource_view_factory" class="%sylius.grid.resource_view_factory.class%">
<argument type="service" id="sylius.grid.data_provider" />
<argument type="service" id="sylius.resource_controller.parameters_parser" />
</service>
<service id="sylius.resource_controller.resources_resolver.grid_aware" class="%sylius.resource_controller.resources_resolver.grid_aware.class%" decorates="sylius.resource_controller.resources_resolver">
<argument type="service" id="sylius.resource_controller.resources_resolver.grid_aware.inner" />
Expand Down
Expand Up @@ -13,6 +13,7 @@

use PhpSpec\ObjectBehavior;
use Sylius\Bundle\ResourceBundle\ExpressionLanguage\ExpressionLanguage;
use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
use Symfony\Component\HttpFoundation\Request;

/**
Expand All @@ -25,6 +26,11 @@ function let(ExpressionLanguage $expression)
{
$this->beConstructedWith($expression);
}

function it_implements_parameters_parser_interface()
{
$this->shouldImplement(ParametersParserInterface::class);
}

function it_should_parse_parameters(Request $request)
{
Expand Down
Expand Up @@ -13,6 +13,7 @@

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
use Sylius\Bundle\ResourceBundle\Grid\View\ResourceGridView;
use Sylius\Bundle\ResourceBundle\Grid\View\ResourceGridViewFactory;
Expand All @@ -21,6 +22,7 @@
use Sylius\Component\Grid\Definition\Grid;
use Sylius\Component\Grid\Parameters;
use Sylius\Component\Resource\Metadata\MetadataInterface;
use Symfony\Component\HttpFoundation\Request;

/**
* @mixin ResourceGridViewFactory
Expand All @@ -29,9 +31,9 @@
*/
class ResourceGridViewFactorySpec extends ObjectBehavior
{
function let(DataProviderInterface $dataProvider)
function let(DataProviderInterface $dataProvider, ParametersParserInterface $parametersParser)
{
$this->beConstructedWith($dataProvider);
$this->beConstructedWith($dataProvider, $parametersParser);
}

function it_is_initializable()
Expand All @@ -46,9 +48,11 @@ function it_implements_resource_grid_view_factory_interface()

function it_uses_data_provider_to_create_a_view_with_data_and_definition(
DataProviderInterface $dataProvider,
ParametersParserInterface $parametersParser,
Grid $grid,
Parameters $parameters,
MetadataInterface $resourceMetadata,
Request $request,
RequestConfiguration $requestConfiguration
) {
$expectedResourceGridView = new ResourceGridView(
Expand All @@ -59,6 +63,15 @@ function it_uses_data_provider_to_create_a_view_with_data_and_definition(
$requestConfiguration->getWrappedObject()
);

$requestConfiguration->getRequest()->willReturn($request);
$parametersParser
->parseRequestValues(['repository' => ['method' => 'createByCustomerQueryBuilder', 'arguments' => ['$customerId']]], $request)
->willReturn(['repository' => ['method' => 'createByCustomerQueryBuilder', 'arguments' => [5]]])
;

$grid->getDriverConfiguration()->willReturn(['repository' => ['method' => 'createByCustomerQueryBuilder', 'arguments' => ['$customerId']]]);
$grid->setDriverConfiguration(['repository' => ['method' => 'createByCustomerQueryBuilder', 'arguments' => [5]]])->shouldBeCalled();

$dataProvider->getData($grid, $parameters)->willReturn(['foo', 'bar']);

$this->create($grid, $parameters, $resourceMetadata, $requestConfiguration)->shouldBeSameResourceGridViewAs($expectedResourceGridView);
Expand Down
8 changes: 8 additions & 0 deletions src/Sylius/Component/Grid/Definition/Grid.php
Expand Up @@ -98,6 +98,14 @@ public function getDriverConfiguration()
return $this->driverConfiguration;
}

/**
* @param array $driverConfiguration
*/
public function setDriverConfiguration(array $driverConfiguration)
{
$this->driverConfiguration = $driverConfiguration;
}

/**
* @return array
*/
Expand Down
6 changes: 6 additions & 0 deletions src/Sylius/Component/Grid/spec/Definition/GridSpec.php
Expand Up @@ -58,6 +58,12 @@ function it_has_driver_configuration()
'arguments' => ['$code']
]);
}

function its_driver_configuration_is_mutable()
{
$this->setDriverConfiguration(['foo' => 'bar']);
$this->getDriverConfiguration()->shouldReturn(['foo' => 'bar']);
}

function it_has_empty_sorting_configuration_by_default()
{
Expand Down

0 comments on commit 549eec8

Please sign in to comment.