diff --git a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Category.php b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Category.php index 6a8190c2b765..85f8c0c6f4b4 100644 --- a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Category.php +++ b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Category.php @@ -6,6 +6,7 @@ namespace Magento\Sitemap\Model\ResourceModel\Catalog; use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; +use Magento\Framework\App\ObjectManager; /** * Sitemap resource catalog collection model @@ -45,27 +46,38 @@ class Category extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb */ protected $metadataPool; + /** + * @var CategorySelectBuilder + */ + private $categorySelectBuilder; + /** * @param \Magento\Framework\Model\ResourceModel\Db\Context $context * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Catalog\Model\ResourceModel\Category $categoryResource * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool * @param string $connectionName + * @param CategorySelectBuilder|null $categorySelectBuilder */ public function __construct( \Magento\Framework\Model\ResourceModel\Db\Context $context, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\ResourceModel\Category $categoryResource, \Magento\Framework\EntityManager\MetadataPool $metadataPool, - $connectionName = null + $connectionName = null, + CategorySelectBuilder $categorySelectBuilder = null ) { $this->_storeManager = $storeManager; $this->_categoryResource = $categoryResource; parent::__construct($context, $connectionName); $this->metadataPool = $metadataPool; + $this->categorySelectBuilder = $categorySelectBuilder ?? + ObjectManager::getInstance()->get(CategorySelectBuilder::class); } /** + * Initialize catalog category entity resource model + * * @return void */ protected function _construct() @@ -104,23 +116,17 @@ public function getCollection($storeId) return false; } - $this->_select = $connection->select()->from( - ['e' => $this->getMainTable()], - [$this->getIdFieldName(), 'updated_at'] - )->joinLeft( - ['url_rewrite' => $this->getTable('url_rewrite')], - 'e.entity_id = url_rewrite.entity_id AND url_rewrite.is_autogenerated = 1' - . $connection->quoteInto(' AND url_rewrite.store_id = ?', $store->getId()) - . $connection->quoteInto(' AND url_rewrite.entity_type = ?', CategoryUrlRewriteGenerator::ENTITY_TYPE), - ['url' => 'request_path'] - )->where( - 'e.path LIKE ?', - $categoryRow['path'] . '/%' + $this->_select = $this->categorySelectBuilder->execute( + $this->getMainTable(), + $this->getIdFieldName(), + $store, + $categoryRow['path'] ); $this->_addFilter($storeId, 'is_active', 1); $query = $connection->query($this->_select); + while ($row = $query->fetch()) { $category = $this->_prepareCategory($row); $categories[$category->getId()] = $category; @@ -186,7 +192,6 @@ protected function _addFilter($storeId, $attributeCode, $value, $type = '=') break; default: return false; - break; } if ($attribute['backend_type'] == 'static') { diff --git a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/CategorySelectBuilder.php b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/CategorySelectBuilder.php new file mode 100644 index 000000000000..f35639735d13 --- /dev/null +++ b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/CategorySelectBuilder.php @@ -0,0 +1,67 @@ +resource = $resource; + } + + /** + * Allow to modify a select statement with plugins + * + * @param string $mainTableName + * @param string $idField + * @param StoreInterface $store + * @param string $path + * @return Select + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function execute(string $mainTableName, string $idField, StoreInterface $store, string $path) + { + $connection = $this->resource->getConnection(); + + return $connection->select()->from( + ['e' => $mainTableName], + [$idField, 'updated_at'] + )->joinLeft( + ['url_rewrite' => $this->resource->getTableName('url_rewrite')], + 'e.entity_id = url_rewrite.entity_id AND url_rewrite.is_autogenerated = 1' + . $connection->quoteInto(' AND url_rewrite.store_id = ?', $store->getId()) + . $connection->quoteInto(' AND url_rewrite.entity_type = ?', CategoryUrlRewriteGenerator::ENTITY_TYPE), + ['url' => 'request_path'] + )->where( + 'e.path LIKE ?', + $path . '/%' + ); + } +} diff --git a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Product.php b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Product.php index dc15819b087b..f1771ee79689 100644 --- a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Product.php +++ b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/Product.php @@ -5,11 +5,9 @@ */ namespace Magento\Sitemap\Model\ResourceModel\Catalog; -use Magento\Catalog\Helper\Product as HelperProduct; use Magento\Catalog\Model\Product\Image\UrlBuilder; use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; use Magento\Framework\App\ObjectManager; -use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\Store; /** @@ -21,7 +19,7 @@ */ class Product extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb { - const NOT_SELECTED_IMAGE = 'no_selection'; + public const NOT_SELECTED_IMAGE = 'no_selection'; /** * Collection Zend Db select @@ -44,8 +42,6 @@ class Product extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb protected $mediaGalleryReadHandler; /** - * Sitemap data - * * @var \Magento\Sitemap\Helper\Data */ protected $_sitemapData = null; @@ -79,30 +75,19 @@ class Product extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb /** * @var \Magento\Catalog\Model\Product\Media\Config * @deprecated 100.2.0 unused + * @see getProductImageUrl */ protected $_mediaConfig; - /** - * @var \Magento\Catalog\Model\Product - */ - private $productModel; - - /** - * @var \Magento\Catalog\Helper\Image - */ - private $catalogImageHelper; - /** * @var UrlBuilder */ private $imageUrlBuilder; /** - * Scope Config - * - * @var \Magento\Framework\App\Config\ScopeConfigInterface + * @var ProductSelectBuilder */ - private $scopeConfig; + private $productSelectBuilder; /** * Product constructor. @@ -121,7 +106,9 @@ class Product extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb * @param \Magento\Catalog\Helper\Image $catalogImageHelper * @param \Magento\Framework\App\Config\ScopeConfigInterface|null $scopeConfig * @param UrlBuilder $urlBuilder + * @param ProductSelectBuilder $productSelectBuilder * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function __construct( \Magento\Framework\Model\ResourceModel\Db\Context $context, @@ -137,7 +124,8 @@ public function __construct( \Magento\Catalog\Model\Product $productModel = null, \Magento\Catalog\Helper\Image $catalogImageHelper = null, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig = null, - UrlBuilder $urlBuilder = null + UrlBuilder $urlBuilder = null, + ProductSelectBuilder $productSelectBuilder = null ) { $this->_productResource = $productResource; $this->_storeManager = $storeManager; @@ -147,13 +135,9 @@ public function __construct( $this->mediaGalleryReadHandler = $mediaGalleryReadHandler; $this->_mediaConfig = $mediaConfig; $this->_sitemapData = $sitemapData; - $this->productModel = $productModel ?: ObjectManager::getInstance()->get(\Magento\Catalog\Model\Product::class); - $this->catalogImageHelper = $catalogImageHelper; $this->imageUrlBuilder = $urlBuilder ?? ObjectManager::getInstance()->get(UrlBuilder::class); - $this->catalogImageHelper = $catalogImageHelper ?: ObjectManager::getInstance() - ->get(\Magento\Catalog\Helper\Image::class); - $this->scopeConfig = $scopeConfig ?: ObjectManager::getInstance() - ->get(\Magento\Framework\App\Config\ScopeConfigInterface::class); + $this->productSelectBuilder = $productSelectBuilder ?? + ObjectManager::getInstance()->get(ProductSelectBuilder::class); parent::__construct($context, $connectionName); } @@ -311,28 +295,12 @@ public function getCollection($storeId) } $connection = $this->getConnection(); - $urlRewriteMetaDataCondition = ''; - if (!$this->isCategoryProductURLsConfig($storeId)) { - $urlRewriteMetaDataCondition = ' AND url_rewrite.metadata IS NULL'; - } - $this->_select = $connection->select()->from( - ['e' => $this->getMainTable()], - [$this->getIdFieldName(), $this->_productResource->getLinkField(), 'updated_at'] - )->joinInner( - ['w' => $this->getTable('catalog_product_website')], - 'e.entity_id = w.product_id', - [] - )->joinLeft( - ['url_rewrite' => $this->getTable('url_rewrite')], - 'e.entity_id = url_rewrite.entity_id AND url_rewrite.is_autogenerated = 1' - . $urlRewriteMetaDataCondition - . $connection->quoteInto(' AND url_rewrite.store_id = ?', $store->getId()) - . $connection->quoteInto(' AND url_rewrite.entity_type = ?', ProductUrlRewriteGenerator::ENTITY_TYPE), - ['url' => 'request_path'] - )->where( - 'w.website_id = ?', - $store->getWebsiteId() + $this->_select = $this->productSelectBuilder->execute( + $this->getMainTable(), + $this->getIdFieldName(), + $this->_productResource->getLinkField(), + $store ); $this->_addFilter($store->getId(), 'visibility', $this->_productVisibility->getVisibleInSiteIds(), 'in'); @@ -491,20 +459,4 @@ private function getProductImageUrl($image) { return $this->imageUrlBuilder->getUrl($image, 'product_page_image_large'); } - - /** - * Return Use Categories Path for Product URLs config value - * - * @param null|string $storeId - * - * @return bool - */ - private function isCategoryProductURLsConfig($storeId) - { - return $this->scopeConfig->isSetFlag( - HelperProduct::XML_PATH_PRODUCT_URL_USE_CATEGORY, - ScopeInterface::SCOPE_STORE, - $storeId - ); - } } diff --git a/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/ProductSelectBuilder.php b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/ProductSelectBuilder.php new file mode 100644 index 000000000000..a95ba1e59be5 --- /dev/null +++ b/vendor/magento/module-sitemap/Model/ResourceModel/Catalog/ProductSelectBuilder.php @@ -0,0 +1,76 @@ +resource = $resource; + } + + /** + * Allow to modify a select statement with plugins + * + * @param string $mainTableName + * @param string $idField + * @param string $linkField + * @param StoreInterface $store + * @return Select + */ + public function execute( + string $mainTableName, + string $idField, + string $linkField, + StoreInterface $store + ): Select { + $connection = $this->resource->getConnection(); + + return $connection->select()->from( + ['e' => $mainTableName], + [$idField, $linkField, 'updated_at'] + )->joinInner( + ['w' => $this->resource->getTableName('catalog_product_website')], + 'e.entity_id = w.product_id', + [] + )->joinLeft( + ['url_rewrite' => $this->resource->getTableName('url_rewrite')], + 'e.entity_id = url_rewrite.entity_id AND url_rewrite.is_autogenerated = 1' + . ' AND url_rewrite.metadata IS NULL' + . $connection->quoteInto(' AND url_rewrite.store_id = ?', $store->getId()) + . $connection->quoteInto(' AND url_rewrite.entity_type = ?', ProductUrlRewriteGenerator::ENTITY_TYPE), + ['url' => 'request_path'] + )->where( + 'w.website_id = ?', + $store->getWebsiteId() + ); + } +} diff --git a/vendor/magento/module-url-rewrite/etc/db_schema.xml b/vendor/magento/module-url-rewrite/etc/db_schema.xml index 2812efac0bfb..696e721e8efa 100644 --- a/vendor/magento/module-url-rewrite/etc/db_schema.xml +++ b/vendor/magento/module-url-rewrite/etc/db_schema.xml @@ -40,5 +40,9 @@ + + + + diff --git a/vendor/magento/module-url-rewrite/etc/db_schema_whitelist.json b/vendor/magento/module-url-rewrite/etc/db_schema_whitelist.json index 658673959a73..92e34fed6c96 100644 --- a/vendor/magento/module-url-rewrite/etc/db_schema_whitelist.json +++ b/vendor/magento/module-url-rewrite/etc/db_schema_whitelist.json @@ -15,7 +15,8 @@ "index": { "URL_REWRITE_TARGET_PATH": true, "URL_REWRITE_STORE_ID_ENTITY_ID": true, - "URL_REWRITE_ENTITY_ID": true + "URL_REWRITE_ENTITY_ID": true, + "URL_REWRITE_IS_AUTOGENERATED_METADATA": true }, "constraint": { "PRIMARY": true,