From 6a9faad034234eff06b3f7ae7a531ed75a551d8a Mon Sep 17 00:00:00 2001 From: Mausham Shrestha Date: Wed, 21 Feb 2024 12:35:44 +1030 Subject: [PATCH 1/2] BEG-143: Trigger re-caching when child variant is edited #15 --- Helper/ProductIndexer.php | 51 +++++++++++++++++++++++ Model/Indexer/Category/ProductIndexer.php | 14 +++++++ Model/Indexer/Product/ProductIndexer.php | 14 +++++++ 3 files changed, 79 insertions(+) create mode 100644 Helper/ProductIndexer.php diff --git a/Helper/ProductIndexer.php b/Helper/ProductIndexer.php new file mode 100644 index 0000000..df7af83 --- /dev/null +++ b/Helper/ProductIndexer.php @@ -0,0 +1,51 @@ +configurable = $configurable; + $this->productFactory = $productFactory; + } + + /** + * Returns parent entity id(s) + * + * @param $simpleProductId + * @return array + */ + public function getParentEntityId($simpleProductId): array + { + $parentIds = []; + $simpleProduct = $this->productFactory->create()->load($simpleProductId); + if ($simpleProduct->getTypeId() == 'simple') { + // Get the parent IDs of the simple product (configurable product IDs) + $parentIds = $this->configurable->getParentIdsByChild($simpleProductId); + } + return $parentIds; + } +} diff --git a/Model/Indexer/Category/ProductIndexer.php b/Model/Indexer/Category/ProductIndexer.php index 696dd99..f5d0c16 100644 --- a/Model/Indexer/Category/ProductIndexer.php +++ b/Model/Indexer/Category/ProductIndexer.php @@ -9,6 +9,7 @@ use Aligent\PrerenderIo\Api\PrerenderClientInterface; use Aligent\PrerenderIo\Helper\Config; +use Aligent\PrerenderIo\Helper\ProductIndexer as ProductIndexerHelper; use Aligent\PrerenderIo\Model\Indexer\DataProvider\ProductCategories; use Aligent\PrerenderIo\Model\Url\GetUrlsForCategories; use Magento\Framework\App\DeploymentConfig; @@ -38,6 +39,10 @@ class ProductIndexer implements IndexerActionInterface, MviewActionInterface, Di private DeploymentConfig $eploymentConfig; /** @var Config */ private Config $prerenderConfigHelper; + /** + * @var ProductIndexerHelper + */ + private ProductIndexerHelper $productIndexerHelper; /** @var int|null */ private ?int $batchSize; @@ -58,6 +63,7 @@ public function __construct( PrerenderClientInterface $prerenderClient, DeploymentConfig $deploymentConfig, Config $prerenderConfigHelper, + ProductIndexerHelper $productIndexerHelper, ?int $batchSize = 1000 ) { $this->dimensionProvider = $dimensionProvider; @@ -67,6 +73,7 @@ public function __construct( $this->deploymentConfig = $deploymentConfig; $this->batchSize = $batchSize; $this->prerenderConfigHelper = $prerenderConfigHelper; + $this->productIndexerHelper = $this->productIndexerHelper; } /** @@ -144,6 +151,13 @@ public function executeByDimensions(array $dimensions, \Traversable $entityIds): } $entityIds = iterator_to_array($entityIds); + // Include configurable product id(s) if the edited product is simple + foreach ($entityIds as $entityId) { + $parentEntityIds = $this->productIndexerHelper->getParentEntityId($entityId); + if (!empty($parentEntityIds)) { + $entityIds = array_merge($entityIds, $parentEntityIds); + } + } // get list of category ids for the products $categoryIds = $this->productCategoriesDataProvider->getCategoryIdsForProducts($entityIds, $storeId); diff --git a/Model/Indexer/Product/ProductIndexer.php b/Model/Indexer/Product/ProductIndexer.php index 83f3cc7..4c95e3e 100644 --- a/Model/Indexer/Product/ProductIndexer.php +++ b/Model/Indexer/Product/ProductIndexer.php @@ -9,6 +9,7 @@ use Aligent\PrerenderIo\Api\PrerenderClientInterface; use Aligent\PrerenderIo\Helper\Config; +use Aligent\PrerenderIo\Helper\ProductIndexer as ProductIndexerHelper; use Aligent\PrerenderIo\Model\Url\GetUrlsForProducts; use Magento\Framework\App\DeploymentConfig; use Magento\Framework\Exception\FileSystemException; @@ -35,6 +36,10 @@ class ProductIndexer implements IndexerActionInterface, MviewActionInterface, Di private DeploymentConfig $eploymentConfig; /** @var Config */ private Config $prerenderConfigHelper; + /** + * @var ProductIndexerHelper + */ + private ProductIndexerHelper $productIndexerHelper; /** @var int|null */ private ?int $batchSize; @@ -53,6 +58,7 @@ public function __construct( PrerenderClientInterface $prerenderClient, DeploymentConfig $deploymentConfig, Config $prerenderConfigHelper, + ProductIndexerHelper $productIndexerHelper, ?int $batchSize = 1000 ) { $this->dimensionProvider = $dimensionProvider; @@ -61,6 +67,7 @@ public function __construct( $this->deploymentConfig = $deploymentConfig; $this->batchSize = $batchSize; $this->prerenderConfigHelper = $prerenderConfigHelper; + $this->productIndexerHelper = $productIndexerHelper; } /** @@ -138,6 +145,13 @@ public function executeByDimensions(array $dimensions, \Traversable $entityIds): } $entityIds = iterator_to_array($entityIds); + // Include configurable product id(s) if the edited product is simple + foreach ($entityIds as $entityId) { + $parentEntityIds = $this->productIndexerHelper->getParentEntityId($entityId); + if (!empty($parentEntityIds)) { + $entityIds = array_merge($entityIds, $parentEntityIds); + } + } // get urls for the products $urls = $this->getUrlsForProducts->execute($entityIds, $storeId); From dbfd7fe280c09692cf5ed56331cddafce959b7c9 Mon Sep 17 00:00:00 2001 From: Mausham Shrestha Date: Wed, 21 Feb 2024 16:31:05 +1030 Subject: [PATCH 2/2] BEG-143: Performance improvement and code refactoring #15 --- Helper/ProductIndexer.php | 51 ----------------------- Model/Indexer/Category/ProductIndexer.php | 22 ++++------ Model/Indexer/Product/ProductIndexer.php | 24 +++++------ 3 files changed, 20 insertions(+), 77 deletions(-) delete mode 100644 Helper/ProductIndexer.php diff --git a/Helper/ProductIndexer.php b/Helper/ProductIndexer.php deleted file mode 100644 index df7af83..0000000 --- a/Helper/ProductIndexer.php +++ /dev/null @@ -1,51 +0,0 @@ -configurable = $configurable; - $this->productFactory = $productFactory; - } - - /** - * Returns parent entity id(s) - * - * @param $simpleProductId - * @return array - */ - public function getParentEntityId($simpleProductId): array - { - $parentIds = []; - $simpleProduct = $this->productFactory->create()->load($simpleProductId); - if ($simpleProduct->getTypeId() == 'simple') { - // Get the parent IDs of the simple product (configurable product IDs) - $parentIds = $this->configurable->getParentIdsByChild($simpleProductId); - } - return $parentIds; - } -} diff --git a/Model/Indexer/Category/ProductIndexer.php b/Model/Indexer/Category/ProductIndexer.php index f5d0c16..9c85fc6 100644 --- a/Model/Indexer/Category/ProductIndexer.php +++ b/Model/Indexer/Category/ProductIndexer.php @@ -9,9 +9,9 @@ use Aligent\PrerenderIo\Api\PrerenderClientInterface; use Aligent\PrerenderIo\Helper\Config; -use Aligent\PrerenderIo\Helper\ProductIndexer as ProductIndexerHelper; use Aligent\PrerenderIo\Model\Indexer\DataProvider\ProductCategories; use Aligent\PrerenderIo\Model\Url\GetUrlsForCategories; +use Magento\ConfigurableProduct\Model\Product\Type\Configurable; use Magento\Framework\App\DeploymentConfig; use Magento\Framework\Exception\FileSystemException; use Magento\Framework\Exception\LocalizedException; @@ -39,10 +39,8 @@ class ProductIndexer implements IndexerActionInterface, MviewActionInterface, Di private DeploymentConfig $eploymentConfig; /** @var Config */ private Config $prerenderConfigHelper; - /** - * @var ProductIndexerHelper - */ - private ProductIndexerHelper $productIndexerHelper; + /** @var Configurable */ + private Configurable $configurable; /** @var int|null */ private ?int $batchSize; @@ -63,7 +61,7 @@ public function __construct( PrerenderClientInterface $prerenderClient, DeploymentConfig $deploymentConfig, Config $prerenderConfigHelper, - ProductIndexerHelper $productIndexerHelper, + Configurable $configurable, ?int $batchSize = 1000 ) { $this->dimensionProvider = $dimensionProvider; @@ -73,7 +71,7 @@ public function __construct( $this->deploymentConfig = $deploymentConfig; $this->batchSize = $batchSize; $this->prerenderConfigHelper = $prerenderConfigHelper; - $this->productIndexerHelper = $this->productIndexerHelper; + $this->configurable = $configurable; } /** @@ -151,13 +149,11 @@ public function executeByDimensions(array $dimensions, \Traversable $entityIds): } $entityIds = iterator_to_array($entityIds); + // Include configurable product id(s) if the edited product is simple - foreach ($entityIds as $entityId) { - $parentEntityIds = $this->productIndexerHelper->getParentEntityId($entityId); - if (!empty($parentEntityIds)) { - $entityIds = array_merge($entityIds, $parentEntityIds); - } - } + $parentIds = $this->configurable->getParentIdsByChild($entityIds); + $entityIds = array_unique(array_merge($entityIds, $parentIds)); + // get list of category ids for the products $categoryIds = $this->productCategoriesDataProvider->getCategoryIdsForProducts($entityIds, $storeId); diff --git a/Model/Indexer/Product/ProductIndexer.php b/Model/Indexer/Product/ProductIndexer.php index 4c95e3e..0239eb8 100644 --- a/Model/Indexer/Product/ProductIndexer.php +++ b/Model/Indexer/Product/ProductIndexer.php @@ -9,8 +9,8 @@ use Aligent\PrerenderIo\Api\PrerenderClientInterface; use Aligent\PrerenderIo\Helper\Config; -use Aligent\PrerenderIo\Helper\ProductIndexer as ProductIndexerHelper; use Aligent\PrerenderIo\Model\Url\GetUrlsForProducts; +use Magento\ConfigurableProduct\Model\Product\Type\Configurable; use Magento\Framework\App\DeploymentConfig; use Magento\Framework\Exception\FileSystemException; use Magento\Framework\Exception\LocalizedException; @@ -36,10 +36,8 @@ class ProductIndexer implements IndexerActionInterface, MviewActionInterface, Di private DeploymentConfig $eploymentConfig; /** @var Config */ private Config $prerenderConfigHelper; - /** - * @var ProductIndexerHelper - */ - private ProductIndexerHelper $productIndexerHelper; + /** @var Configurable */ + private Configurable $configurable; /** @var int|null */ private ?int $batchSize; @@ -50,6 +48,8 @@ class ProductIndexer implements IndexerActionInterface, MviewActionInterface, Di * @param PrerenderClientInterface $prerenderClient * @param DeploymentConfig $deploymentConfig * @param Config $prerenderConfigHelper + * @param Configurable $configurable + * * @param int|null $batchSize */ public function __construct( @@ -58,7 +58,7 @@ public function __construct( PrerenderClientInterface $prerenderClient, DeploymentConfig $deploymentConfig, Config $prerenderConfigHelper, - ProductIndexerHelper $productIndexerHelper, + Configurable $configurable, ?int $batchSize = 1000 ) { $this->dimensionProvider = $dimensionProvider; @@ -67,7 +67,7 @@ public function __construct( $this->deploymentConfig = $deploymentConfig; $this->batchSize = $batchSize; $this->prerenderConfigHelper = $prerenderConfigHelper; - $this->productIndexerHelper = $productIndexerHelper; + $this->configurable = $configurable; } /** @@ -145,13 +145,11 @@ public function executeByDimensions(array $dimensions, \Traversable $entityIds): } $entityIds = iterator_to_array($entityIds); + // Include configurable product id(s) if the edited product is simple - foreach ($entityIds as $entityId) { - $parentEntityIds = $this->productIndexerHelper->getParentEntityId($entityId); - if (!empty($parentEntityIds)) { - $entityIds = array_merge($entityIds, $parentEntityIds); - } - } + $parentIds = $this->configurable->getParentIdsByChild($entityIds); + $entityIds = array_unique(array_merge($entityIds, $parentIds)); + // get urls for the products $urls = $this->getUrlsForProducts->execute($entityIds, $storeId);