From 318c93d4fcde1a357de8ec17eb5951b0b12e9af2 Mon Sep 17 00:00:00 2001 From: Vinai Kopp Date: Fri, 14 May 2021 12:19:31 +0200 Subject: [PATCH] Add collection grid source type processor Add collection specific source type processor to allow joining fields before the available grid columns are extracted. Fixes issue #45. --- Api/HyvaGridCollectionProcessorInterface.php | 23 +++++++++++ Api/HyvaGridSourceProcessorInterface.php | 2 +- .../CollectionGridSourceType.php | 11 ++++- .../CollectionGridSourceTypeTest.php | 41 +++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 Api/HyvaGridCollectionProcessorInterface.php diff --git a/Api/HyvaGridCollectionProcessorInterface.php b/Api/HyvaGridCollectionProcessorInterface.php new file mode 100644 index 00000000..5311881f --- /dev/null +++ b/Api/HyvaGridCollectionProcessorInterface.php @@ -0,0 +1,23 @@ +gridSourceCollectionFactory->create($this->getCollectionConfig()); + return reduce( + $this->processors, + function (AbstractDb $collection, HyvaGridSourceProcessorInterface $processor): AbstractDb { + if ($processor instanceof HyvaGridCollectionProcessorInterface) { + $processor->afterInitSelect($collection, $this->gridName); + } + return $collection; + }, + $this->gridSourceCollectionFactory->create($this->getCollectionConfig())); } private function isTypeReflectionField(string $key): bool diff --git a/Test/Integration/Model/GridSourceType/CollectionGridSourceTypeTest.php b/Test/Integration/Model/GridSourceType/CollectionGridSourceTypeTest.php index 04bbd4e0..714e0871 100644 --- a/Test/Integration/Model/GridSourceType/CollectionGridSourceTypeTest.php +++ b/Test/Integration/Model/GridSourceType/CollectionGridSourceTypeTest.php @@ -2,11 +2,13 @@ namespace Hyva\Admin\Test\Integration\Model\GridSourceType; +use Hyva\Admin\Api\HyvaGridCollectionProcessorInterface; use Hyva\Admin\Api\HyvaGridSourceProcessorInterface; use Hyva\Admin\Model\DataType\ArrayDataType; use Hyva\Admin\Model\DataType\BooleanDataType; use Hyva\Admin\Model\DataType\IntDataType; use Hyva\Admin\Model\DataType\TextDataType; +use Hyva\Admin\Model\GridSource\AbstractGridSourceProcessor; use Hyva\Admin\Model\GridSourceType\CollectionGridSourceType; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection; @@ -14,6 +16,8 @@ use Magento\Framework\Api\SearchCriteria; use Magento\Framework\Api\SearchCriteriaInterface; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Data\Collection\AbstractDb as AbstractDbCollection; +use Magento\Framework\DB\Select; use Magento\Sales\Model\ResourceModel\Order\Collection as OrderCollection; use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OrderGridCollection; use Magento\Sales\Setup\SalesSetup; @@ -288,4 +292,41 @@ public function afterLoad($rawResult, SearchCriteriaInterface $searchCriteria, s $records = $sut->extractRecords($rawGridData); $this->assertCount(1, $records); } + + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + * @magentoDataFixture Magento/Catalog/_files/products_list.php + */ + public function testAfterInitSelectProcessorCanJoinFieldsForGrid(): void + { + $processor = new class() extends AbstractGridSourceProcessor implements HyvaGridCollectionProcessorInterface { + + public function afterInitSelect(AbstractDbCollection $source, string $gridName): void + { + $select = $source->getSelect(); + // add select expression + $select->columns(['foo' => new \Zend_Db_Expr('foo')]); + // add field from joined table + $source->getSelect()->joinLeft( + 'catalog_category_product', + 'e.entity_id = catalog_category_product.product_id', + ['test_field' => 'catalog_category_product.entity_id'] + ); + } + }; + + $args = [ + 'gridName' => 'test', + 'processors' => [$processor], + 'sourceConfiguration' => ['collection' => ProductCollection::class], + ]; + /** @var CollectionGridSourceType $sut */ + $sut = ObjectManager::getInstance()->create(CollectionGridSourceType::class, $args); + + $columnKeys = $sut->getColumnKeys(); + $this->assertContains('foo', $columnKeys); // select expression + $this->assertContains('test_field', $columnKeys); // joined field + $this->assertContains('sku', $columnKeys); // entity table attribute + $this->assertContains('color', $columnKeys); // eav attribute + } }