diff --git a/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php similarity index 50% rename from app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php rename to app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php index 82a25531757a2fb3cd90da751467d69fe6037cfe..bc6de17f90cfede8926865e821652beb00ffb62d 100644 --- a/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php +++ b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php @@ -4,50 +4,37 @@ * See COPYING.txt for license details. */ -namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository; +namespace Magento\Catalog\Plugin\Model\AttributeSetRepository; use Magento\Catalog\Model\ResourceModel\Product\Collection; use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; -use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; use Magento\Eav\Api\AttributeSetRepositoryInterface; use Magento\Eav\Api\Data\AttributeSetInterface; -use Magento\UrlRewrite\Model\UrlPersistInterface; -use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; /** - * Remove url rewrites for products with given attribute set. + * Delete related products after attribute set successfully removed. */ -class RemoveProductUrlRewrite +class RemoveProducts { /** - * @var int - */ - private $chunkSize = 1000; - - /** - * @var UrlPersistInterface - */ - private $urlPersist; - - /** + * Retrieve products related to specific attribute set. + * * @var CollectionFactory */ private $collectionFactory; /** - * ProductUrlRewriteProcessor constructor. + * RemoveProducts constructor. * - * @param UrlPersistInterface $urlPersist * @param CollectionFactory $collectionFactory */ - public function __construct(UrlPersistInterface $urlPersist, CollectionFactory $collectionFactory) + public function __construct(CollectionFactory $collectionFactory) { - $this->urlPersist = $urlPersist; $this->collectionFactory = $collectionFactory; } /** - * Remove url rewrites for products with given attribute set. + * Delete related to specific attribute set products, if attribute set was removed successfully. * * @param AttributeSetRepositoryInterface $subject * @param \Closure $proceed @@ -64,19 +51,8 @@ class RemoveProductUrlRewrite /** @var Collection $productCollection */ $productCollection = $this->collectionFactory->create(); $productCollection->addFieldToFilter('attribute_set_id', ['eq' => $attributeSet->getId()]); - $productIds = $productCollection->getAllIds(); $result = $proceed($attributeSet); - if (!empty($productIds)) { - $productIds = array_chunk($productIds, $this->chunkSize); - foreach ($productIds as $ids) { - $this->urlPersist->deleteByData( - [ - UrlRewrite::ENTITY_ID => $ids, - UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, - ] - ); - } - } + $productCollection->delete(); return $result; } diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php index 616bee43de00e521439cba4f2447c446bb0e7e03..ae09ff1113608509504f0405ce62207251bc72f5 100755 --- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php +++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php @@ -126,6 +126,10 @@ class UpgradeSchema implements UpgradeSchemaInterface $this->fixCustomerGroupIdColumn($setup); } + if (version_compare($context->getVersion(), '2.2.4', '<')) { + $this->removeAttributeSetRelation($setup); + } + $setup->endSetup(); } @@ -699,4 +703,22 @@ class UpgradeSchema implements UpgradeSchemaInterface ); $setup->getConnection()->query($sql); } + + /** + * Remove foreign key between catalog_product_entity and eav_attribute_set tables. + * Drop foreign key to delegate cascade on delete to plugin. + * @see \Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts + * + * @param SchemaSetupInterface $setup + * @return void + */ + private function removeAttributeSetRelation(SchemaSetupInterface $setup) + { + $productTable = $setup->getTable('catalog_product_entity'); + $attributeSetTable = $setup->getTable('eav_attribute_set'); + $setup->getConnection()->dropForeignKey( + $productTable, + $setup->getFkName($productTable, 'attribute_set_id', $attributeSetTable, 'attribute_set_id') + ); + } } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php similarity index 65% rename from app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php rename to app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php index cf2337bf7c76c76885d765c6da4fdbb634fbeb43..a8eb757646e7421f5ae913e3b8f61afbacc2e883 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php @@ -4,26 +4,23 @@ * See COPYING.txt for license details. */ -namespace Magento\CatalogUrlRewrite\Test\Unit\Plugin\Eav\AttributeSetRepository; +namespace Magento\Catalog\Test\Unit\Plugin\Model\AttributeSetRepository; use Magento\Catalog\Model\ResourceModel\Product\Collection; use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; -use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; -use Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite; +use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts; use Magento\Eav\Api\AttributeSetRepositoryInterface; use Magento\Eav\Api\Data\AttributeSetInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; -use Magento\UrlRewrite\Model\UrlPersistInterface; -use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; use PHPUnit\Framework\TestCase; /** - * Provide tests for RemoveProductUrlRewrite plugin. + * Provide tests for RemoveProducts plugin. */ -class RemoveProductUrlRewriteTest extends TestCase +class RemoveProductsTest extends TestCase { /** - * @var RemoveProductUrlRewrite + * @var RemoveProducts */ private $testSubject; @@ -32,11 +29,6 @@ class RemoveProductUrlRewriteTest extends TestCase */ private $collectionFactory; - /** - * @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject - */ - private $urlPersist; - /** * @inheritdoc */ @@ -47,25 +39,20 @@ class RemoveProductUrlRewriteTest extends TestCase ->disableOriginalConstructor() ->setMethods(['create']) ->getMock(); - $this->urlPersist = $this->getMockBuilder(UrlPersistInterface::class) - ->disableOriginalConstructor() - ->getMockForAbstractClass(); $this->testSubject = $objectManager->getObject( - RemoveProductUrlRewrite::class, + RemoveProducts::class, [ 'collectionFactory' => $this->collectionFactory, - 'urlPersist' => $this->urlPersist, ] ); } /** - * Test plugin will delete all url rewrites for products with given attribute set. + * Test plugin will delete all related products for given attribute set. */ public function testAroundDelete() { $attributeSetId = '1'; - $productId = '1'; /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collection */ $collection = $this->getMockBuilder(Collection::class) @@ -75,21 +62,12 @@ class RemoveProductUrlRewriteTest extends TestCase ->method('addFieldToFilter') ->with(self::identicalTo('attribute_set_id'), self::identicalTo(['eq' => $attributeSetId])); $collection->expects(self::once()) - ->method('getAllIds') - ->willReturn([$productId]); + ->method('delete'); $this->collectionFactory->expects(self::once()) ->method('create') ->willReturn($collection); - $this->urlPersist->expects(self::once()) - ->method('deleteByData') - ->with(self::identicalTo( - [ - UrlRewrite::ENTITY_ID => [$productId], - UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, - ] - )); /** @var AttributeSetRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSetRepository */ $attributeSetRepository = $this->getMockBuilder(AttributeSetRepositoryInterface::class) ->disableOriginalConstructor() diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml index b97e6fc1aa31891365a9eb901e80b456dab0b9a1..34d089580906f035f181e1b34cd85f77dfa59f70 100644 --- a/app/code/Magento/Catalog/etc/adminhtml/di.xml +++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml @@ -184,4 +184,7 @@ <argument name="scopeOverriddenValue" xsi:type="object">Magento\Catalog\Model\Attribute\ScopeOverriddenValue</argument> </arguments> </type> + <type name="Magento\Eav\Api\AttributeSetRepositoryInterface"> + <plugin name="remove_products" type="Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts"/> + </type> </config> diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml index 18671a32bb4fbc05cd08e5581649de3f11b423aa..26ed173420adb95491694389c71d2a0848bfb198 100644 --- a/app/code/Magento/Catalog/etc/module.xml +++ b/app/code/Magento/Catalog/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Catalog" setup_version="2.2.3"> + <module name="Magento_Catalog" setup_version="2.2.4"> <sequence> <module name="Magento_Eav"/> <module name="Magento_Cms"/> diff --git a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml index ebac217df5fcbd0215a6d677e4ca13e5759a644f..32ecc97d0f85f0929f1f1f96d601d6899b21ff3c 100644 --- a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml +++ b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml @@ -25,9 +25,6 @@ <type name="Magento\Catalog\Model\Category\DataProvider"> <plugin name="category_ui_form_url_key_plugin" type="Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab\Attributes"/> </type> - <type name="Magento\Eav\Api\AttributeSetRepositoryInterface"> - <plugin name="attribute_set_delete_plugin" type="Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite"/> - </type> <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php similarity index 67% rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php rename to dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php index da189b85932c74e04a6a128a37e67a39669d7961..724e2e62f230dac9d411862d833be9ae94d93915 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php @@ -7,6 +7,8 @@ namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository; use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; +use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts; use Magento\Eav\Api\AttributeSetRepositoryInterface; use Magento\Eav\Model\Entity\Attribute\Set; use Magento\TestFramework\Helper\Bootstrap; @@ -15,25 +17,25 @@ use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollectionFactory; use PHPUnit\Framework\TestCase; /** - * Provide tests for RemoveProductUrlRewrite plugin. + * Provide tests for RemoveProducts plugin. * @magentoAppArea adminhtml */ -class RemoveProductUrlRewriteTest extends TestCase +class RemoveProductsTest extends TestCase { /** * @return void */ - public function testRemoveProductUrlRewriteIsRegistered() + public function testRemoveProductsIsRegistered() { $pluginInfo = Bootstrap::getObjectManager()->get(PluginList::class) ->get(AttributeSetRepositoryInterface::class, []); - self::assertSame(RemoveProductUrlRewrite::class, $pluginInfo['attribute_set_delete_plugin']['instance']); + self::assertSame(RemoveProducts::class, $pluginInfo['remove_products']['instance']); } /** - * Test url rewrite will be removed for product with given attribute set, if one will be deleted. + * Test related to given attribute set products will be removed, if attribute set will be deleted. * - * @magentoDataFixture Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php + * @magentoDataFixture Magento/Catalog/_files/attribute_set_with_product.php * @magentoDbIsolation enabled */ public function testAroundDelete() @@ -44,19 +46,25 @@ class RemoveProductUrlRewriteTest extends TestCase $productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class); $product = $productRepository->get('simple'); + $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create(); + $productCollection->addIdFilter($product->getId()); $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create(); $urlRewriteCollection->addFieldToFilter('entity_type', 'product'); $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId()); self::assertSame(1, $urlRewriteCollection->getSize()); + self::assertSame(1, $productCollection->getSize()); $attributeSetRepository = Bootstrap::getObjectManager()->get(AttributeSetRepositoryInterface::class); $attributeSetRepository->deleteById($attributeSet->getAttributeSetId()); + $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create(); + $productCollection->addIdFilter($product->getId()); $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create(); $urlRewriteCollection->addFieldToFilter('entity_type', 'product'); $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId()); self::assertSame(0, $urlRewriteCollection->getSize()); + self::assertSame(0, $productCollection->getSize()); } } diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php similarity index 100% rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php rename to dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php similarity index 100% rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php rename to dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php