Skip to content

Commit

Permalink
magento#1465: Introduced Used In Products filter
Browse files Browse the repository at this point in the history
  • Loading branch information
sivaschenko committed Jul 10, 2020
1 parent 7c968be commit 31b3779
Show file tree
Hide file tree
Showing 4 changed files with 184 additions and 0 deletions.
21 changes: 21 additions & 0 deletions MediaGalleryCatalogUi/etc/adminhtml/di.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="Magento\MediaGalleryUi\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
<arguments>
<argument name="customFilters" xsi:type="array">
<item name="product_id" xsi:type="object">Magento\MediaGalleryCatalogUi\Model\SearchCriteria\CollectionProcessor\FilterProcessor\Product</item>
</argument>
</arguments>
</virtualType>
<virtualType name="Magento\MediaGalleryCatalogUi\Model\SearchCriteria\CollectionProcessor\FilterProcessor\Product" type="Magento\MediaGalleryUi\Model\SearchCriteria\CollectionProcessor\FilterProcessor\Entity">
<arguments>
<argument name="entityType" xsi:type="string">catalog_product</argument>
</arguments>
</virtualType>
</config>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<filters name="listing_filters">
<filterSelect
name="product_id"
provider="${ $.parentName }"
sortOrder="50"
component="Magento_Catalog/js/components/product-ui-select"
template="ui/grid/filters/elements/ui-select">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filterOptions" xsi:type="boolean">true</item>
<item name="searchOptions" xsi:type="boolean">true</item>
<item name="chipsEnabled" xsi:type="boolean">true</item>
<item name="closeBtn" xsi:type="boolean">true</item>
<item name="filterPlaceholder" xsi:type="string" translate="true">Product Name or SKU</item>
<item name="emptyOptionsHtml" xsi:type="string" translate="true">Start typing to find products</item>
<item name="missingValuePlaceholder" xsi:type="string" translate="true">Product with ID: %s doesn\'t exist</item>
<item name="isDisplayMissingValuePlaceholder" xsi:type="boolean">true</item>
<item name="isDisplayEmptyPlaceholder" xsi:type="boolean">true</item>
<item name="isRemoveSelectedIcon" xsi:type="boolean">true</item>
<item name="filterRateLimitMethod" xsi:type="string">notifyWhenChangesStop</item>
<item name="levelsVisibility" xsi:type="number">1</item>
<item name="searchUrl" xsi:type="url" path="catalog/product/search"/>
<item name="validationUrl" xsi:type="url" path="catalog/product/getSelected"/>
</item>
</argument>
<settings>
<label translate="true">Used in Products</label>
<dataScope>product_id</dataScope>
</settings>
</filterSelect>
</filters>
</listingToolbar>
</listing>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<filters name="listing_filters">
<filterSelect
name="product_id"
provider="${ $.parentName }"
sortOrder="50"
component="Magento_Catalog/js/components/product-ui-select"
template="ui/grid/filters/elements/ui-select">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filterOptions" xsi:type="boolean">true</item>
<item name="searchOptions" xsi:type="boolean">true</item>
<item name="chipsEnabled" xsi:type="boolean">true</item>
<item name="closeBtn" xsi:type="boolean">true</item>
<item name="filterPlaceholder" xsi:type="string" translate="true">Product Name or SKU</item>
<item name="emptyOptionsHtml" xsi:type="string" translate="true">Start typing to find products</item>
<item name="missingValuePlaceholder" xsi:type="string" translate="true">Product with ID: %s doesn\'t exist</item>
<item name="isDisplayMissingValuePlaceholder" xsi:type="boolean">true</item>
<item name="isDisplayEmptyPlaceholder" xsi:type="boolean">true</item>
<item name="isRemoveSelectedIcon" xsi:type="boolean">true</item>
<item name="filterRateLimitMethod" xsi:type="string">notifyWhenChangesStop</item>
<item name="levelsVisibility" xsi:type="number">1</item>
<item name="searchUrl" xsi:type="url" path="catalog/product/search"/>
<item name="validationUrl" xsi:type="url" path="catalog/product/getSelected"/>
</item>
</argument>
<settings>
<label translate="true">Used in Products</label>
<dataScope>product_id</dataScope>
</settings>
</filterSelect>
</filters>
</listingToolbar>
</listing>
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\MediaGalleryUi\Model\SearchCriteria\CollectionProcessor\FilterProcessor;

use Magento\Framework\Api\Filter;
use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\DB\Select;

/**
* Custom filter to filter collection by entity type
*/
class Entity implements CustomFilterInterface
{
private const TABLE_ALIAS = 'main_table';
private const TABLE_MEDIA_CONTENT_ASSET = 'media_content_asset';

/**
* @var ResourceConnection
*/
private $connection;

/**
* @var string
*/
private $entityType;

/**
* @param ResourceConnection $resource
*/
public function __construct(ResourceConnection $resource, string $entityType)
{
$this->connection = $resource;
$this->entityType = $entityType;
}

/**
* @inheritDoc
*/
public function apply(Filter $filter, AbstractDb $collection): bool
{
$ids = $filter->getValue();
if (is_array($ids)) {
$collection->addFieldToFilter(
self::TABLE_ALIAS . '.id',
['in' => $this->getSelectByEntityIds($ids)]
);
}
return true;
}

/**
* Return select asset ids by entity type
*
* @param array $ids
* @return Select
*/
private function getSelectByEntityIds(array $ids): Select
{
return $this->connection->getConnection()->select()->from(
['asset_content_table' => $this->connection->getTableName(self::TABLE_MEDIA_CONTENT_ASSET)],
['asset_id']
)->where(
'entity_type = ?',
$this->entityType
)->where(
'entity_id IN (?)',
$ids
);
}
}

0 comments on commit 31b3779

Please sign in to comment.