From 04eabe66832e1bfac293993cfe0dacce3d1fd873 Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 23 Oct 2019 00:34:54 +0300 Subject: [PATCH] handleRequest() method moved to DataGrid::createView() --- src/Config/Configuration.php | 10 -- src/Config/ConfigurationInterface.php | 4 - src/DependencyInjection/Configuration.php | 3 - src/Grid/DataGrid.php | 152 +++++++++++++++----- src/Grid/DataGridBuilder.php | 14 +- src/Grid/DataGridBuilderInterface.php | 9 +- src/Grid/DataGridFactory.php | 69 +-------- src/Grid/DataGridFactoryInterface.php | 2 +- src/Grid/DataGridInterface.php | 4 +- src/Grid/Pager.php | 1 - tests/DataGridBuilderTest.php | 2 - tests/DataGridFactoryTest.php | 4 +- tests/PagerTest.php | 1 + tests/config/ConfigurationContainerTest.php | 3 - tests/config/ConfigurationTest.php | 4 - 15 files changed, 134 insertions(+), 148 deletions(-) diff --git a/src/Config/Configuration.php b/src/Config/Configuration.php index f5c1741..c1247ad 100644 --- a/src/Config/Configuration.php +++ b/src/Config/Configuration.php @@ -63,10 +63,6 @@ public function setPaginationLimit(int $limit): void $this->paginationLimit = $limit; } - public function setShowTitles(bool $showTitles): void - { - $this->showTitles = $showTitles; - } public function setTranslationDomain(?string $domain): void { @@ -80,7 +76,6 @@ public function getConfigsArray(): array 'paginationEnabled' => $this->getPaginationEnabled(), 'paginationLimit' => $this->getPaginationLimit(), 'noDataMessage' => $this->getNoDataMessage(), - 'showTitles' => $this->getShowTitles(), 'translationDomain' => $this->getTranslationDomain() ]; } @@ -107,11 +102,6 @@ public function getPaginationEnabled(): ?bool return $this->paginationEnabled; } - public function getShowTitles(): ?bool - { - return $this->showTitles; - } - public function getTranslationDomain(): ?string { return $this->translationDomain; diff --git a/src/Config/ConfigurationInterface.php b/src/Config/ConfigurationInterface.php index 329819a..613aac3 100644 --- a/src/Config/ConfigurationInterface.php +++ b/src/Config/ConfigurationInterface.php @@ -28,10 +28,6 @@ public function getPaginationEnabled(): ?bool; public function setPaginationEnabled(bool $value): void; - public function getShowTitles(): ?bool; - - public function setShowTitles(bool $showTitles): void; - public function getTranslationDomain(): ?string; public function setTranslationDomain(string $domain): void; diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index bd996e8..e7f9215 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -4,8 +4,6 @@ namespace Pfilsx\DataGrid\DependencyInjection; -use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; @@ -37,7 +35,6 @@ public function getConfigTreeBuilder() ->children() ->scalarNode('template')->defaultValue('@DataGrid/grid.blocks.html.twig')->end() ->scalarNode('no_data_message')->defaultValue('No data found')->end() - ->scalarNode('show_titles')->defaultValue(true)->end() ->booleanNode('pagination_enabled')->defaultValue(true)->end() ->integerNode('pagination_limit')->defaultValue(10)->end() ->scalarNode('translation_domain')->defaultNull()->end() diff --git a/src/Grid/DataGrid.php b/src/Grid/DataGrid.php index 2c2e879..39684de 100644 --- a/src/Grid/DataGrid.php +++ b/src/Grid/DataGrid.php @@ -36,34 +36,56 @@ class DataGrid implements DataGridInterface * @var Criteria */ protected $filtersCriteria; + /** + * @var AbstractGridType + */ + protected $gridType; + /** * @var DataGridBuilderInterface */ protected $builder; + /** + * @var DataGridFiltersBuilderInterface + */ + protected $filterBuilder; /** * DataGrid constructor. - * @param DataGridBuilderInterface $builder + * @param AbstractGridType $type + * @param DataProviderInterface $dataProvider * @param ConfigurationContainerInterface $defaultConfiguration * @param DataGridServiceContainer $container * @internal */ public function __construct( - DataGridBuilderInterface $builder, + AbstractGridType $type, + DataProviderInterface $dataProvider, ConfigurationContainerInterface $defaultConfiguration, DataGridServiceContainer $container ) { - $this->builder = $builder; + $this->gridType = $type; $this->container = $container; - $this->configuration = $defaultConfiguration->getInstance($builder->getInstance())->merge($builder->getConfiguration()); + + $this->configureBuilders($dataProvider); + + $this->configuration = $defaultConfiguration->getInstance($this->builder->getInstance()) + ->merge($this->builder->getConfiguration()); + $this->setTemplate($this->configuration->getTemplate()); - $this->configurePagerOptions(); - if (!empty($this->configuration->getTranslationDomain())){ - foreach ($this->builder->getColumns() as $column){ - $column->setTranslationDomain($this->configuration->getTranslationDomain()); - } - } + $this->setTranslationDomain($this->configuration->getTranslationDomain()); + + } + + protected function configureBuilders(DataProviderInterface $dataProvider) + { + $this->builder = new DataGridBuilder($this->container); + $this->builder->setProvider($dataProvider); + $this->gridType->buildGrid($this->builder); + + $this->filterBuilder = new DataGridFiltersBuilder(); + $this->filterBuilder->setProvider($dataProvider); } /** @@ -73,21 +95,14 @@ protected function configurePagerOptions() { $pager = $this->builder->getProvider()->getPager(); $pager->setLimit($this->configuration->getPaginationLimit()); - if ($this->configuration->getPaginationEnabled()){ + if ($this->configuration->getPaginationEnabled()) { $pager->enable(); $pager->setTotalCount($this->getProvider()->getTotalCount()); + $pager->rebuildPaginationOptions(); } else { $pager->disable(); } } - /** - * @return bool - * @internal - */ - public function getShowTitles(): bool - { - return $this->configuration->getShowTitles(); - } /** * @return Providers\DataProviderInterface @@ -135,23 +150,8 @@ public function getTemplate() } /** - * @internal - * @param string $path - * @throws \Twig\Error\LoaderError - * @throws \Twig\Error\RuntimeError - * @throws \Twig\Error\SyntaxError - */ - protected function setTemplate(string $path) - { - $this->template = $this->container->getTwig()->loadTemplate($path); - foreach ($this->builder->getColumns() as $column){ - $column->setTemplate($this->template); - } - } - - /** - * @internal * @return string + * @internal */ public function getNoDataMessage() { @@ -161,8 +161,8 @@ public function getNoDataMessage() } /** - * @internal * @return bool + * @internal */ public function hasPagination() { @@ -170,16 +170,94 @@ public function hasPagination() } /** - * @internal * @return array + * @internal */ public function getPaginationOptions() { return $this->builder->getPager()->getPaginationOptions(); } + /** + * @return DataGridView + */ public function createView(): DataGridView { + $this->handleRequest(); + $this->configurePagerOptions(); return new DataGridView($this, $this->container); } + + /** + * @param string $path + */ + protected function setTemplate(string $path) + { + $this->template = $this->container->getTwig()->loadTemplate($path); + foreach ($this->builder->getColumns() as $column) { + $column->setTemplate($this->template); + } + } + + /** + * @param string $domain + */ + protected function setTranslationDomain(?string $domain) + { + foreach ($this->builder->getColumns() as $column) { + $column->setTranslationDomain($domain); + } + } + + protected function handleRequest(): void + { + $request = $this->container->getRequest()->getCurrentRequest(); + $queryParams = $request !== null ? $request->query->get('data_grid', []) : []; + + $this->handleSorting($queryParams); + + $this->handlePagination($queryParams); + + $this->handleFilters($queryParams); + } + + protected function handleSorting(array &$queryParams) + { + if (array_key_exists('sortBy', $queryParams)) { + $this->setSort($queryParams['sortBy']); + unset($queryParams['sortBy']); + } + } + + protected function handlePagination(array &$queryParams) + { + if (array_key_exists('page', $queryParams)) { + $this->setPage($queryParams['page']); + unset($queryParams['page']); + } else { + $this->setPage(1); + } + } + + protected function handleFilters(array $queryParams) + { + $this->builder->setFiltersValues($queryParams); + $this->filterBuilder->setParams($queryParams); + $this->gridType->handleFilters($this->filterBuilder, $queryParams); + } + + protected function setSort($attribute) + { + $first = substr($attribute, 0, 1); + if ($first == '-') { + $this->builder->setSort(substr($attribute, 1), 'DESC'); + } else { + $this->builder->setSort($attribute, 'ASC'); + } + } + + protected function setPage($page) + { + $this->builder->getPager()->setPage(is_numeric($page) ? (int)$page : 1); + } } diff --git a/src/Grid/DataGridBuilder.php b/src/Grid/DataGridBuilder.php index 8656f16..4016599 100644 --- a/src/Grid/DataGridBuilder.php +++ b/src/Grid/DataGridBuilder.php @@ -112,16 +112,6 @@ public function setNoDataMessage(string $message): DataGridBuilderInterface return $this; } - /** - * @param bool $flag - * @return DataGridBuilderInterface - */ - public function setShowTitles(bool $flag): DataGridBuilderInterface - { - $this->configuration->setShowTitles($flag); - return $this; - } - public function enablePagination(bool $enabled = true, ?int $limit = null): DataGridBuilderInterface { $this->configuration->setPaginationEnabled($enabled); @@ -164,7 +154,7 @@ public function setProvider(DataProviderInterface $provider): void public function setSort(string $attribute, string $direction) { foreach ($this->columns as $column) { - if ($column->hasSort() && $column->getAttribute() == $attribute) { + if ($column instanceof DataColumn && $column->hasSort() && $column->getAttribute() == $attribute) { $column->setSort($direction); $this->provider->setSort([$attribute => $direction]); break; @@ -188,7 +178,7 @@ public function hasFilters(): bool public function setFiltersValues(array $filters): void { foreach ($this->columns as $column) { - if ($column->hasFilter() && array_key_exists($column->getAttribute(), $filters)) { + if ($column instanceof DataColumn && $column->hasFilter() && array_key_exists($column->getAttribute(), $filters)) { $column->setFilterValue($filters[$column->getAttribute()]); } } diff --git a/src/Grid/DataGridBuilderInterface.php b/src/Grid/DataGridBuilderInterface.php index 8985d08..da0d91d 100644 --- a/src/Grid/DataGridBuilderInterface.php +++ b/src/Grid/DataGridBuilderInterface.php @@ -22,8 +22,6 @@ public function setTemplate(string $path): self; public function setNoDataMessage(string $message): self; - public function setShowTitles(bool $flag): self; - public function enablePagination(bool $enabled = true, int $limit = 10): self; public function setCountFieldName(string $name): self; @@ -83,5 +81,10 @@ public function getConfiguration(): ConfigurationInterface; */ public function getInstance(): string; - + /** + * @param string $attribute + * @param string $direction + * @internal + */ + public function setSort(string $attribute, string $direction); } diff --git a/src/Grid/DataGridFactory.php b/src/Grid/DataGridFactory.php index dff50b1..aeaaee2 100644 --- a/src/Grid/DataGridFactory.php +++ b/src/Grid/DataGridFactory.php @@ -20,10 +20,6 @@ class DataGridFactory implements DataGridFactoryInterface * @var Request */ protected $request; - /** - * @var DataGridBuilder - */ - protected $gridBuilder; /** * @var DataGridFiltersBuilder */ @@ -46,77 +42,20 @@ public function __construct(DataGridServiceContainer $container, ConfigurationCo $this->container = $container; $this->request = $container->getRequest()->getCurrentRequest(); $this->defaultConfiguration = $configs; - $this->gridBuilder = new DataGridBuilder($this->container); - $this->filterBuilder = new DataGridFiltersBuilder(); } - public function createGrid(string $gridType, $dataProvider): DataGridInterface + public function createGrid(string $gridType, $dataSource): DataGridInterface { if (!is_subclass_of($gridType, AbstractGridType::class)) { throw new InvalidArgumentException('Expected subclass of ' . AbstractGridType::class); } - $provider = DataProvider::create($dataProvider, $this->container->getDoctrine()); - $this->gridBuilder->setProvider($provider); - $this->filterBuilder->setProvider($provider); + $provider = DataProvider::create($dataSource, $this->container->getDoctrine()); /** @var AbstractGridType $type */ - $this->gridType = new $gridType($this->container); - $this->gridType->buildGrid($this->gridBuilder); - //TODO move handle request to grid init - $this->handleRequest(); - - return new DataGrid($this->gridBuilder, $this->defaultConfiguration, $this->container); - } - - protected function handleRequest(): void - { - $this->queryParams = $this->request !== null && $this->request->query->has('data_grid') ? $this->request->query->get('data_grid') : []; - - $this->handleSorting(); + $gridType = new $gridType($this->container); - $this->handlePagination(); - - $this->handleFilters(); - } - - protected function handleSorting() - { - if (array_key_exists('sortBy', $this->queryParams)) { - $this->setSort($this->queryParams['sortBy']); - unset($this->queryParams['sortBy']); - } - } - protected function handlePagination() - { - if (array_key_exists('page', $this->queryParams)) { - $this->setPage($this->queryParams['page']); - unset($this->queryParams['page']); - } else { - $this->setPage(1); - } - } - - protected function handleFilters() - { - $this->gridBuilder->setFiltersValues($this->queryParams); - $this->filterBuilder->setParams($this->queryParams); - $this->gridType->handleFilters($this->filterBuilder, $this->queryParams); - } - - protected function setSort($attribute) - { - $first = substr($attribute, 0, 1); - if ($first == '-') { - $this->gridBuilder->setSort(substr($attribute, 1), 'DESC'); - } else { - $this->gridBuilder->setSort($attribute, 'ASC'); - } - } - - protected function setPage($page) - { - $this->gridBuilder->getPager()->setPage(is_numeric($page) ? (int)$page : 1); + return new DataGrid($gridType, $provider, $this->defaultConfiguration, $this->container); } } diff --git a/src/Grid/DataGridFactoryInterface.php b/src/Grid/DataGridFactoryInterface.php index 5928f33..7fb85b8 100644 --- a/src/Grid/DataGridFactoryInterface.php +++ b/src/Grid/DataGridFactoryInterface.php @@ -11,5 +11,5 @@ interface DataGridFactoryInterface { public function __construct(DataGridServiceContainer $container, ConfigurationContainerInterface $configs); - public function createGrid(string $gridType, $dataProvider): DataGridInterface; + public function createGrid(string $gridType, $dataSource): DataGridInterface; } diff --git a/src/Grid/DataGridInterface.php b/src/Grid/DataGridInterface.php index eb82ba6..216af1b 100644 --- a/src/Grid/DataGridInterface.php +++ b/src/Grid/DataGridInterface.php @@ -6,10 +6,12 @@ use Pfilsx\DataGrid\Config\ConfigurationContainerInterface; use Pfilsx\DataGrid\DataGridServiceContainer; +use Pfilsx\DataGrid\Grid\Providers\DataProviderInterface; interface DataGridInterface { - public function __construct(DataGridBuilderInterface $builder, + public function __construct(AbstractGridType $type, + DataProviderInterface $dataProvider, ConfigurationContainerInterface $defaultConfiguration, DataGridServiceContainer $container); diff --git a/src/Grid/Pager.php b/src/Grid/Pager.php index 581569c..fa22fb1 100644 --- a/src/Grid/Pager.php +++ b/src/Grid/Pager.php @@ -93,7 +93,6 @@ public function setTotalCount(int $totalCount): void public function getPaginationOptions() { - $this->rebuildPaginationOptions(); return [ 'currentPage' => $this->page, 'pages' => $this->pages diff --git a/tests/DataGridBuilderTest.php b/tests/DataGridBuilderTest.php index f4cf3c9..f08a808 100644 --- a/tests/DataGridBuilderTest.php +++ b/tests/DataGridBuilderTest.php @@ -145,14 +145,12 @@ public function testConfiguration(): void { $this->builder->setNoDataMessage('Test Message'); $this->builder->setTemplate('test_template'); - $this->builder->setShowTitles(false); $this->builder->enablePagination(true, 15); $this->assertEquals([ 'template' => 'test_template', 'paginationEnabled' => true, 'paginationLimit' => 15, 'noDataMessage' => 'Test Message', - 'showTitles' => false, 'translationDomain' => null ], $this->builder->getConfiguration()->getConfigsArray()); diff --git a/tests/DataGridFactoryTest.php b/tests/DataGridFactoryTest.php index 0dd153b..0decb79 100644 --- a/tests/DataGridFactoryTest.php +++ b/tests/DataGridFactoryTest.php @@ -68,6 +68,7 @@ public function testWrongGridTypeException(): void public function testCreateGrid(): void { $grid = $this->factory->createGrid(NodeGridType::class, $this->getEntityManager()->getRepository(Node::class)); + $grid->createView(); $this->assertEquals('empty', $grid->getNoDataMessage()); $this->assertTrue($grid->hasPagination()); $this->assertInstanceOf(Template::class, $grid->getTemplate()); @@ -75,7 +76,6 @@ public function testCreateGrid(): void $this->assertNotEmpty($grid->getData()); $this->assertFalse($grid->hasFilters()); $this->assertNotEmpty($grid->getColumns()); - $this->assertFalse($grid->getShowTitles()); $this->assertInstanceOf(DataGridView::class, $grid->createView()); $this->assertEquals([ 'currentPage' => 1, @@ -100,7 +100,7 @@ public function testCreateGrid(): void ); $factory2 = new DataGridFactory($container, $this->configuration); $grid2 = $factory2->createGrid(NodeGridType2::class, $this->getEntityManager()->getRepository(Node::class)); - + $grid2->createView(); $this->assertFalse($grid2->hasPagination()); } } diff --git a/tests/PagerTest.php b/tests/PagerTest.php index b7a1add..615de57 100644 --- a/tests/PagerTest.php +++ b/tests/PagerTest.php @@ -44,6 +44,7 @@ public function testGetPaginationOptions(int $page, int $count, array $result): $pager->setPage($page); $pager->setTotalCount($count); + $pager->rebuildPaginationOptions(); $this->assertEquals($result, $pager->getPaginationOptions()); } diff --git a/tests/config/ConfigurationContainerTest.php b/tests/config/ConfigurationContainerTest.php index ce7a7d0..ec74828 100644 --- a/tests/config/ConfigurationContainerTest.php +++ b/tests/config/ConfigurationContainerTest.php @@ -31,7 +31,6 @@ public function configsProvider() [ 'template' => '@DataGrid/grid.blocks.html.twig', 'noDataMessage' => 'No data found', - 'showTitles' => true, 'paginationEnabled' => true, 'paginationLimit' => 10, 'translationDomain' => null @@ -42,7 +41,6 @@ public function configsProvider() 'instances' => [ 'test' => [ 'template' => 'test/grid.blocks.html.twig', - 'show_titles' => false, 'pagination_enabled' => true, 'pagination_limit' => 15, 'translation_domain' => 'test' @@ -53,7 +51,6 @@ public function configsProvider() [ 'template' => 'test/grid.blocks.html.twig', 'noDataMessage' => null, - 'showTitles' => false, 'paginationEnabled' => true, 'paginationLimit' => 15, 'translationDomain' => 'test' diff --git a/tests/config/ConfigurationTest.php b/tests/config/ConfigurationTest.php index 832df66..7f74cf3 100644 --- a/tests/config/ConfigurationTest.php +++ b/tests/config/ConfigurationTest.php @@ -13,14 +13,12 @@ public function testCreate(): void { $configuration = new Configuration([ 'template' => 'test/grid.blocks.html.twig', - 'show_titles' => false, 'pagination_enabled' => true, 'pagination_limit' => 15, 'translation_domain' => 'test' ]); $this->assertEquals('test/grid.blocks.html.twig', $configuration->getTemplate()); - $this->assertFalse($configuration->getShowTitles()); $this->assertTrue($configuration->getPaginationEnabled()); $this->assertEquals(15, $configuration->getPaginationLimit()); $this->assertEquals('test', $configuration->getTranslationDomain()); @@ -30,7 +28,6 @@ public function testMerge(): void { $configuration = new Configuration([ 'template' => 'test/grid.blocks.html.twig', - 'show_titles' => false, 'pagination_enabled' => true, 'pagination_limit' => 15, 'translation_domain' => null @@ -49,7 +46,6 @@ public function testMerge(): void $this->assertEquals([ 'template' => 'test/grid.blocks.html.twig', - 'showTitles' => false, 'paginationEnabled' => true, 'paginationLimit' => 10, 'translationDomain' => 'test',