From 06696ddefaca511405ac4cfcfbe5a2d574de1a0a Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 23 Oct 2019 03:41:04 +0300 Subject: [PATCH] Serial column and documentation --- src/Grid/DataGridBuilder.php | 28 ++++++++++++++------- src/Grid/DataGridBuilderInterface.php | 8 +++--- src/Resources/doc/columns/ActionColumn.rst | 12 ++++----- src/Resources/doc/columns/BooleanColumn.rst | 11 +++----- src/Resources/doc/columns/DataColumn.rst | 12 +++------ src/Resources/doc/columns/DateColumn.rst | 11 +++----- src/Resources/doc/columns/ImageColumn.rst | 14 +++-------- src/Resources/doc/columns/SerialColumn.rst | 2 +- src/Resources/doc/configuration.rst | 15 +++++------ src/Resources/doc/grid/DataGridBuilder.rst | 15 ++++++----- src/Resources/doc/grid/DataGridType.rst | 5 ++-- src/Resources/doc/usage.rst | 20 +++++++++------ tests/DataGridBuilderTest.php | 3 +-- 13 files changed, 75 insertions(+), 81 deletions(-) diff --git a/src/Grid/DataGridBuilder.php b/src/Grid/DataGridBuilder.php index 4016599..01739f4 100644 --- a/src/Grid/DataGridBuilder.php +++ b/src/Grid/DataGridBuilder.php @@ -11,6 +11,7 @@ use Pfilsx\DataGrid\Grid\Columns\ActionColumn; use Pfilsx\DataGrid\Grid\Columns\DataColumn; use InvalidArgumentException; +use Pfilsx\DataGrid\Grid\Columns\SerialColumn; use Pfilsx\DataGrid\Grid\Providers\DataProviderInterface; class DataGridBuilder implements DataGridBuilderInterface @@ -55,10 +56,10 @@ public function __construct(DataGridServiceContainer $container) /** * @param string $attribute * @param string $columnClass - * @param array $config + * @param array $options * @return $this */ - public function addColumn(string $attribute, string $columnClass = DataColumn::class, array $config = []): DataGridBuilderInterface + public function addColumn(string $attribute, string $columnClass = DataColumn::class, array $options = []): DataGridBuilderInterface { if (!is_subclass_of($columnClass, AbstractColumn::class)) { throw new InvalidArgumentException('Expected subclass of' . AbstractColumn::class); @@ -66,7 +67,7 @@ public function addColumn(string $attribute, string $columnClass = DataColumn::c /** * @var AbstractColumn $column */ - $column = new $columnClass($this->container, array_merge($config, ['attribute' => $attribute])); + $column = new $columnClass($this->container, array_merge($options, ['attribute' => $attribute])); $this->columns[] = $column; if ($column->hasFilter() && $column->isVisible()) { $this->hasFilters = true; @@ -76,21 +77,30 @@ public function addColumn(string $attribute, string $columnClass = DataColumn::c /** * @param string $attribute - * @param array $config + * @param array $options * @return $this */ - public function addDataColumn(string $attribute, array $config = []): DataGridBuilderInterface + public function addDataColumn(string $attribute, array $options = []): DataGridBuilderInterface { - return $this->addColumn($attribute, DataColumn::class, $config); + return $this->addColumn($attribute, DataColumn::class, $options); } /** - * @param array $config + * @param array $options * @return $this */ - public function addActionColumn(array $config = []): DataGridBuilderInterface + public function addActionColumn(array $options = []): DataGridBuilderInterface { - return $this->addColumn('id', ActionColumn::class, $config); + return $this->addColumn('id', ActionColumn::class, $options); + } + + /** + * @param array $options + * @return $this + */ + public function addSerialColumn(array $options = []): DataGridBuilderInterface + { + return $this->addColumn('', SerialColumn::class, $options); } /** diff --git a/src/Grid/DataGridBuilderInterface.php b/src/Grid/DataGridBuilderInterface.php index da0d91d..c44ed6e 100644 --- a/src/Grid/DataGridBuilderInterface.php +++ b/src/Grid/DataGridBuilderInterface.php @@ -12,11 +12,13 @@ interface DataGridBuilderInterface { - public function addColumn(string $attribute, string $columnClass = DataColumn::class, array $config = []): self; + public function addColumn(string $attribute, string $columnClass = DataColumn::class, array $options = []): self; - public function addDataColumn(string $attribute, array $config = []): self; + public function addSerialColumn(array $options = []): self; - public function addActionColumn(array $config = []): self; + public function addDataColumn(string $attribute, array $options = []): self; + + public function addActionColumn(array $options = []): self; public function setTemplate(string $path): self; diff --git a/src/Resources/doc/columns/ActionColumn.rst b/src/Resources/doc/columns/ActionColumn.rst index 8dda26b..1371321 100644 --- a/src/Resources/doc/columns/ActionColumn.rst +++ b/src/Resources/doc/columns/ActionColumn.rst @@ -6,7 +6,7 @@ Usage .. code-block:: php - $builder->addColumn(self::ACTION_COLUMN, [ + $builder->addActionColumn([ 'pathPrefix' => 'path_prefix' ]); @@ -49,7 +49,7 @@ Path prefix would be used in default url generation. visible - boolean(default: true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -whether to display a column. +Whether to display a column. urlGenerator - callable(default: null) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -57,10 +57,8 @@ Can be used to override default url generation function. .. code-block:: php - $builder->addColumn(self::ACTION_COLUMN, [ - 'buttons' => [ - 'urlGenerator' => function($entity, string $action, RouterInterface $router){ + $builder->addActionColumn([ + 'urlGenerator' => function($entity, string $action, RouterInterface $router){ return $router->generate('entity-'.$action, ['guid' => $entity->getId()]); - } - ] + } ]); diff --git a/src/Resources/doc/columns/BooleanColumn.rst b/src/Resources/doc/columns/BooleanColumn.rst index e1e1b39..00072b2 100644 --- a/src/Resources/doc/columns/BooleanColumn.rst +++ b/src/Resources/doc/columns/BooleanColumn.rst @@ -6,8 +6,7 @@ Usage .. code-block:: php - $builder->addColumn(self::BOOLEAN_COLUMN, [ - 'attribute' => 'entity_attribute', + $builder->addColumn('entity_attribute', self::BOOLEAN_COLUMN, [ 'trueValue' => 'yes', 'falseValue' => 'no' ]); @@ -15,10 +14,6 @@ Usage Configuration ------------- -attribute - string(default: null) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Entity attribute. - attributes - array(default: []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ html attributes to be applied to the tag . @@ -29,7 +24,7 @@ Filter configuration. See filters docs. .. code-block:: php - $builder->addColumn(self::BOOLEAN_COLUMN, [ + $builder->addColumn('entity_attribute', self::BOOLEAN_COLUMN, [ ... 'filter' => [ 'class' => self::FILTER_BOOLEAN @@ -58,7 +53,7 @@ Can be used to override default output generation. .. code-block:: php - $builder->addColumn(self::BOOLEAN_COLUMN, [ + $builder->addColumn('entity_attribute', self::BOOLEAN_COLUMN, [ ... 'value' => function($entity) { return $entity->isEnabled ? 'enabled' : 'disabled'; diff --git a/src/Resources/doc/columns/DataColumn.rst b/src/Resources/doc/columns/DataColumn.rst index 2050cdd..70b3b77 100644 --- a/src/Resources/doc/columns/DataColumn.rst +++ b/src/Resources/doc/columns/DataColumn.rst @@ -6,17 +6,11 @@ Usage .. code-block:: php - $builder->addColumn(self::DATA_COLUMN, [ - 'attribute' => 'entity_attribute' - ]); + $builder->addDataColumn('entity_attribute'); Configuration ------------- -attribute - string(default: null) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Entity attribute. - attributes - array(default: []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ html attributes to be applied to the tag . @@ -27,7 +21,7 @@ Filter configuration. See filters docs. .. code-block:: php - $builder->addColumn(self::DATA_COLUMN, [ + $builder->addDataColumn('entity_attribute', [ ... 'filter' => [ 'class' => self::FILTER_TEXT @@ -48,7 +42,7 @@ Can be used to override default output generation. .. code-block:: php - $builder->addColumn(self::DATA_COLUMN, [ + $builder->addColumn('entity_attribute', self::DATA_COLUMN, [ 'value' => function($entity) { return $entity->isEnabled ? 'enabled' : 'disabled'; } diff --git a/src/Resources/doc/columns/DateColumn.rst b/src/Resources/doc/columns/DateColumn.rst index 931ef05..c34219d 100644 --- a/src/Resources/doc/columns/DateColumn.rst +++ b/src/Resources/doc/columns/DateColumn.rst @@ -6,16 +6,11 @@ Usage .. code-block:: php - $builder->addColumn(self::DATE_COLUMN, [ - 'attribute' => 'entity_attribute' - ]); + $builder->addColumn('entity_attribute', self::DATE_COLUMN); Configuration ------------- -attribute - string(default: null) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Entity attribute. attributes - array(default: []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -31,7 +26,7 @@ Filter configuration. See filters docs. .. code-block:: php - $builder->addColumn(self::DATE_COLUMN, [ + $builder->addColumn('entity_attribute', self::DATE_COLUMN, [ ... 'filter' => [ 'class' => self::FILTER_TEXT @@ -52,7 +47,7 @@ Can be used to override default output generation. .. code-block:: php - $builder->addColumn(self::DATE_COLUMN, [ + $builder->addColumn('entity_attribute', self::DATE_COLUMN, [ 'value' => function($entity) { return $entity->getCreationDate()->format('d.m.Y'); } diff --git a/src/Resources/doc/columns/ImageColumn.rst b/src/Resources/doc/columns/ImageColumn.rst index 7e10840..a38ec97 100644 --- a/src/Resources/doc/columns/ImageColumn.rst +++ b/src/Resources/doc/columns/ImageColumn.rst @@ -6,9 +6,7 @@ Usage .. code-block:: php - $builder->addColumn(self::IMAGE_COLUMN, [ - 'attribute' => 'entity_attribute' - ]); + $builder->addColumn('entity_attribute', self::IMAGE_COLUMN); Configuration ------------- @@ -19,17 +17,13 @@ Alt attribute callback. .. code-block:: php - $builder->addColumn(self::IMAGE_COLUMN, [ - 'attribute' => 'entity_attribute', + $builder->addColumn('entity_attribute', self::IMAGE_COLUMN, [ + ... 'alt' => function($entity){ return $entity->getAlt(); } ]); -attribute - string(default: null) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Entity attribute. - attributes - array(default: []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ html attributes to be applied to the tag . @@ -56,7 +50,7 @@ Can be used to override default output generation. .. code-block:: php - $builder->addColumn(self::IMAGE_COLUMN, [ + $builder->addColumn('entity_attribute', self::IMAGE_COLUMN, [ 'value' => function($entity) { return $entity->getImgTag(); } diff --git a/src/Resources/doc/columns/SerialColumn.rst b/src/Resources/doc/columns/SerialColumn.rst index 91ce6fa..a48c565 100644 --- a/src/Resources/doc/columns/SerialColumn.rst +++ b/src/Resources/doc/columns/SerialColumn.rst @@ -6,7 +6,7 @@ Usage .. code-block:: php - $builder->addColumn(self::SERIAL_COLUMN); + $builder->addSerialColumn(); Configuration ------------- diff --git a/src/Resources/doc/configuration.rst b/src/Resources/doc/configuration.rst index f5b2bc1..1b1e12b 100644 --- a/src/Resources/doc/configuration.rst +++ b/src/Resources/doc/configuration.rst @@ -6,11 +6,12 @@ Configuration Reference .. code-block:: yaml data_grid: - # template used for rendering grid blocks - template: 'grid/grid.blocks.html.twig' - # message used in case of no data found - noDataMessage: 'Записей не найдено' - # pagination configuration - pagination: + instances: + # template used for rendering grid blocks + template: 'grid/grid.blocks.html.twig' + # message used in case of no data found + noDataMessage: 'Записей не найдено' + # pagination configuration + pagination_enabled: true # num of data rows on each page - limit: 10 + pagination_limit: 10 \ No newline at end of file diff --git a/src/Resources/doc/grid/DataGridBuilder.rst b/src/Resources/doc/grid/DataGridBuilder.rst index 711d633..3f411c9 100644 --- a/src/Resources/doc/grid/DataGridBuilder.rst +++ b/src/Resources/doc/grid/DataGridBuilder.rst @@ -23,13 +23,12 @@ Usage 'class' => self::FILTER_TEXT ] ]) - ->addColumn(self::DATA_COLUMN, [ - 'attribute' => 'title', + ->addColumn('title', self::DATA_COLUMN, [ 'filter' => [ 'class' => self::FILTER_TEXT ], ]) - ->addColumn(self::ACTION_COLUMN, [ + ->addActionColumn([ 'pathPrefix' => 'entity' ]); } @@ -39,15 +38,19 @@ Usage Methods Reference ----------------- -addColumn(string $columnFQN, array $columnOptions = []) +addColumn(string $attribute, string $columnFQN, array $columnOptions = []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adds column of specific type to grid. See columns reference for ``$columnOptions`` and listing of default columns. addDataColumn(string $attribute, array $columnOptions = []) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Adds DataColumn to grid. Similar to ``addColumn(self::DATA_COLUMN, ['attribute' => ''])`` +Adds DataColumn to grid. Similar to ``addColumn($attribute, self::DATA_COLUMN, $columnOptions)`` -enablePagination(array|false $options = []) +addActionColumn(array $columnOptions = []) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Adds DataColumn to grid. Similar to ``addColumn('', self::ACTION_COLUMN, $columnOptions)`` + +enablePagination(boolean $isEnabled, int $limit = 10) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Configures grid pagination options or disable pagination. Only one option available right now - ``limit``. ``limit`` - max count of rows on each page. diff --git a/src/Resources/doc/grid/DataGridType.rst b/src/Resources/doc/grid/DataGridType.rst index 5cf38c2..d95463b 100644 --- a/src/Resources/doc/grid/DataGridType.rst +++ b/src/Resources/doc/grid/DataGridType.rst @@ -25,13 +25,12 @@ You must create your own DataGridType for specific entity. Your type must extend 'class' => self::FILTER_TEXT ] ]) - ->addColumn(self::DATA_COLUMN, [ - 'attribute' => 'title', + ->addColumn('title', self::DATA_COLUMN, [ 'filter' => [ 'class' => self::FILTER_TEXT ], ]) - ->addColumn(self::ACTION_COLUMN, [ + ->addActionColumn([ 'pathPrefix' => 'entity' ]); } diff --git a/src/Resources/doc/usage.rst b/src/Resources/doc/usage.rst index 7d3fe5c..1a16499 100644 --- a/src/Resources/doc/usage.rst +++ b/src/Resources/doc/usage.rst @@ -11,6 +11,12 @@ Step 1: Create data entity Step 2: Create data grid type for entity ---------------------------------------- +.. code-block:: bash + + $ php bin/console make:grid + +Command will generate basic GridType code for you. Next step you can customize it: + .. code-block:: php namespace App\Grid; @@ -30,14 +36,12 @@ Step 2: Create data grid type for entity 'class' => self::FILTER_TEXT ] ]) - ->addColumn(self::DATA_COLUMN, [ - 'attribute' => 'title', + ->addColumn('title', self::DATA_COLUMN, [ 'filter' => [ 'class' => self::FILTER_TEXT ], ]) - ->addColumn(self::BOOLEAN_COLUMN, [ - 'attribute' => 'is_enabled', + ->addColumn('is_enabled', self::BOOLEAN_COLUMN, [ 'format' => 'html', 'trueValue' => '', 'falseValue' => '', @@ -46,8 +50,8 @@ Step 2: Create data grid type for entity 'class' => self::FILTER_BOOLEAN ] ]) - ->addColumn(self::ACTION_COLUMN, [ - 'pathPrefix' => 'entity' + ->addActionColumn([ + 'pathPrefix' => 'entity_action' ]); } @@ -69,7 +73,7 @@ Step 3: Create grid in your controller { $grid = $factory->createGrid(EntityGridType::class, $entityRepository); return $this->render('entity/index.html.twig', [ - 'dataGrid' => $grid + 'grid' => $grid->createView() ]); } @@ -78,7 +82,7 @@ Step 4: Display grid in your twig template .. code-block:: twig - {{ grid_view(dataGrid, {class: 'table'}) }} + {{ grid_view(grid, {class: 'table'}) }} Additional step: Register assets for automating sorting and filtering ---------------- diff --git a/tests/DataGridBuilderTest.php b/tests/DataGridBuilderTest.php index f08a808..e48aa2e 100644 --- a/tests/DataGridBuilderTest.php +++ b/tests/DataGridBuilderTest.php @@ -47,8 +47,7 @@ public function testWrongColumnClass(): void public function testAddColumn() { - $this->builder - ->addColumn('attribute', self::SERIAL_COLUMN); + $this->builder->addSerialColumn(); $this->assertCount(1, $this->builder->getColumns()); $this->assertInstanceOf(SerialColumn::class, $this->builder->getColumns()[0]);