diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php b/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php index df5894bf4cbd1..20bd1b379beef 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php @@ -14,6 +14,9 @@ use Magento\Backend\Block\Widget\Grid; use Magento\Backend\Block\Widget\Grid\Column; use Magento\Backend\Block\Widget\Grid\Extended; +use Magento\Catalog\Model\Product\Attribute\Source\Status; +use Magento\Catalog\Model\Product\Visibility; +use Magento\Framework\App\ObjectManager; class Product extends \Magento\Backend\Block\Widget\Grid\Extended { @@ -29,22 +32,38 @@ class Product extends \Magento\Backend\Block\Widget\Grid\Extended */ protected $_productFactory; + /** + * @var Status + */ + private $status; + + /** + * @var Visibility + */ + private $visibility; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Backend\Helper\Data $backendHelper * @param \Magento\Catalog\Model\ProductFactory $productFactory * @param \Magento\Framework\Registry $coreRegistry * @param array $data + * @param Visibility|null $visibility + * @param Status|null $status */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Backend\Helper\Data $backendHelper, \Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Framework\Registry $coreRegistry, - array $data = [] + array $data = [], + Visibility $visibility = null, + Status $status = null ) { $this->_productFactory = $productFactory; $this->_coreRegistry = $coreRegistry; + $this->visibility = $visibility ?: ObjectManager::getInstance()->get(Visibility::class); + $this->status = $status ?: ObjectManager::getInstance()->get(Status::class); parent::__construct($context, $backendHelper, $data); } @@ -102,6 +121,10 @@ protected function _prepareCollection() 'name' )->addAttributeToSelect( 'sku' + )->addAttributeToSelect( + 'visibility' + )->addAttributeToSelect( + 'status' )->addAttributeToSelect( 'price' )->joinField( @@ -159,6 +182,28 @@ protected function _prepareColumns() ); $this->addColumn('name', ['header' => __('Name'), 'index' => 'name']); $this->addColumn('sku', ['header' => __('SKU'), 'index' => 'sku']); + $this->addColumn( + 'visibility', + [ + 'header' => __('Visibility'), + 'index' => 'visibility', + 'type' => 'options', + 'options' => $this->visibility->getOptionArray(), + 'header_css_class' => 'col-visibility', + 'column_css_class' => 'col-visibility' + ] + ); + + $this->addColumn( + 'status', + [ + 'header' => __('Status'), + 'index' => 'status', + 'type' => 'options', + 'options' => $this->status->getOptionArray() + ] + ); + $this->addColumn( 'price', [ diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php index 19033094c1fb7..6dd6c6c863da5 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php @@ -29,6 +29,14 @@ class ProductGrid extends Grid 'name' => [ 'selector' => '#catalog_category_products_filter_name', ], + 'visibility' => [ + 'selector' => '#catalog_category_products_filter_visibility', + 'input' => 'select', + ], + 'status' => [ + 'selector' => '#catalog_category_products_filter_status', + 'input' => 'select', + ], ]; /** diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php new file mode 100644 index 0000000000000..2cc67271abca4 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php @@ -0,0 +1,99 @@ +getTreeCategories()->selectCategory($category, true); + $categoryProducts = $category->getDataFieldConfig('category_products')['source']->getProducts(); + $catalogCategoryEdit->getEditForm()->openSection('category_products'); + + foreach ($this->testFilterColumns as $field) { + $this->testGridFilter($categoryProducts, $catalogCategoryEdit, $field); + } + } + + /** + * @param array $categoryProducts + * @param CatalogCategoryEdit $catalogCategoryEdit + * @param string $filterField + */ + private function testGridFilter(array $categoryProducts, CatalogCategoryEdit $catalogCategoryEdit, $filterField) + { + $productsByFilter = []; + foreach ($categoryProducts as $product) { + $filterValue = $product->getData($filterField); + if (!isset($productsByFilter[$filterValue])) { + $productsByFilter[$filterValue] = []; + } + $productsByFilter[$filterValue][] = $product; + } + + $productsFieldset = $catalogCategoryEdit->getEditForm()->getSection('category_products'); + foreach ($productsByFilter as $filterValue => $products) { + $productsFieldset->getProductGrid()->search([ + 'in_category' => 'Yes', + $filterField => $filterValue, + ]); + + $expectedRows = []; + foreach ($products as $product) { + $expectedRows[] = $product->getName(); + } + $gridRows = $productsFieldset->getProductGrid()->getRowsData(['name']); + $actualRows = array_column($gridRows, 'name'); + sort($expectedRows); + sort($actualRows); + + \PHPUnit_Framework_Assert::assertEquals( + $expectedRows, + $actualRows, + "Category products grid filter '$filterField' does not work correctly" + ); + } + } + + /** + * Returns a string representation of the object. + * + * @return string + */ + public function toString() + { + return 'Category products grid filter works correctly'; + } +} diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml index b10a47b63508c..a840b81a5d206 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml @@ -175,5 +175,15 @@ + + addSubcategory + default_category + Yes + Yes + Subcategory%isolation% + catalogProductSimple::default, catalogProductSimple::not_visible_individually + + +