262 lines
8.1 KiB
PHP
Executable File
262 lines
8.1 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Athlete2 Theme
|
|
*
|
|
* NOTICE OF LICENSE
|
|
*
|
|
* This source file is subject to the Olegnax.com license that is
|
|
* available through the world-wide-web at this URL:
|
|
* https://www.olegnax.com/license
|
|
*
|
|
* DISCLAIMER
|
|
*
|
|
* Do not edit or add to this file if you wish to upgrade this extension to newer
|
|
* version in the future.
|
|
*
|
|
* @category Olegnax
|
|
* @package Olegnax_Athlete2
|
|
* @copyright Copyright (c) 2023 Olegnax (http://www.olegnax.com/)
|
|
* @license https://www.olegnax.com/license
|
|
*/
|
|
|
|
namespace Olegnax\Athlete2\Helper;
|
|
|
|
use Magento\Catalog\Api\Data\ProductInterface;
|
|
use Magento\Catalog\Api\ProductRepositoryInterface;
|
|
use Magento\Catalog\Model\Category;
|
|
use Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer;
|
|
use Magento\Catalog\Model\Product;
|
|
use Magento\Catalog\Model\ResourceModel\Url;
|
|
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
|
|
use Magento\Framework\App\Helper\AbstractHelper;
|
|
use Magento\Framework\App\Helper\Context;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\App\ResourceConnection;
|
|
use Magento\Framework\DataObject;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Framework\Registry;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
|
|
class PrevNextProduct extends AbstractHelper
|
|
{
|
|
/**
|
|
*
|
|
* @var ObjectManager
|
|
*/
|
|
public $_objectManager;
|
|
/**
|
|
*
|
|
* @var Registry
|
|
*/
|
|
protected $_coreRegistry;
|
|
/**
|
|
*
|
|
* @var ProductRepositoryInterface
|
|
*/
|
|
protected $_productRepository;
|
|
/**
|
|
*
|
|
* @var ResourceConnection
|
|
*/
|
|
protected $_resource;
|
|
/**
|
|
*
|
|
* @var Url
|
|
*/
|
|
protected $_catalogUrl;
|
|
/**
|
|
* @var StoreManagerInterface
|
|
*/
|
|
protected $_storeManager;
|
|
|
|
/**
|
|
* PrevNextProduct constructor.
|
|
* @param Context $context
|
|
* @param Registry $coreRegistry
|
|
* @param ProductRepositoryInterface $productRepository
|
|
* @param Url $catalogUrl
|
|
* @param ResourceConnection $resource
|
|
* @param StoreManagerInterface $storeManager
|
|
*/
|
|
public function __construct(
|
|
Context $context,
|
|
Registry $coreRegistry,
|
|
ProductRepositoryInterface $productRepository,
|
|
Url $catalogUrl,
|
|
ResourceConnection $resource,
|
|
StoreManagerInterface $storeManager
|
|
) {
|
|
$this->_coreRegistry = $coreRegistry;
|
|
$this->_productRepository = $productRepository;
|
|
$this->_resource = $resource;
|
|
$this->_catalogUrl = $catalogUrl;
|
|
$this->_storeManager = $storeManager;
|
|
$this->_objectManager = ObjectManager::getInstance();
|
|
|
|
parent::__construct($context);
|
|
}
|
|
|
|
/**
|
|
* @return bool|ProductInterface|Product
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
public function getNextProduct()
|
|
{
|
|
return $this->getSiblingProduct();
|
|
}
|
|
|
|
/**
|
|
* @param int $index
|
|
* @return bool|ProductInterface|Product
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
protected function getSiblingProduct($index = 1)
|
|
{
|
|
$product = $this->_coreRegistry->registry('current_product');
|
|
if (!$product) {
|
|
return false;
|
|
}
|
|
$productId = $product->getId();
|
|
$category = $this->_coreRegistry->registry('current_category');
|
|
|
|
if (!$category) {
|
|
/** @var Product $product */
|
|
$product = $this->_objectManager->create(Product::class)->load($productId);
|
|
/** @var Category $category */
|
|
$category = $product->getCategory();
|
|
if (!$category) {
|
|
foreach ($product->getCategoryCollection() as $parent_cat) {
|
|
$category = $parent_cat;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($category) {
|
|
$productIds = array_keys($this->getProductsPosition($category));
|
|
$productPositions = array_flip($productIds);
|
|
if (array_key_exists($productId, $productPositions)) {
|
|
$newProductPosition = $productPositions[$productId] + $index;
|
|
|
|
if (array_key_exists($newProductPosition, $productIds)) {
|
|
$productId = $productIds[$newProductPosition];
|
|
|
|
$product = $this->_productRepository->getById($productId);
|
|
$product->setCategoryId($category->getId());
|
|
|
|
if ($productId = $product->getId()) {
|
|
$urlDatas = $this->getRewriteByProductStore([
|
|
$productId => $category->getStoreId()
|
|
]);
|
|
|
|
if (array_key_exists($productId, $urlDatas)) {
|
|
$urlData = $urlDatas[$productId];
|
|
$product->setUrlDataObject(new DataObject($urlData));
|
|
}
|
|
|
|
return $product;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param Category $category
|
|
* @return array
|
|
*/
|
|
protected function getProductsPosition($category)
|
|
{
|
|
$connection = $this->_resource->getConnection();
|
|
$select = $connection->select()->from(
|
|
$this->_resource->getTableName('catalog_category_product_index'),
|
|
['product_id', 'position']
|
|
)->where(
|
|
'category_id = :category_id'
|
|
)->where(
|
|
'store_id = :store_id'
|
|
)->order('position', 'ASC');
|
|
$bind = [
|
|
'category_id' => (int)$category->getId(),
|
|
'store_id' => $category->getStoreId(),
|
|
];
|
|
|
|
return $connection->fetchPairs($select, $bind);
|
|
}
|
|
|
|
public function getRewriteByProductStore(array $products)
|
|
{
|
|
$result = [];
|
|
|
|
if (empty($products)) {
|
|
return $result;
|
|
}
|
|
$connection = $this->_catalogUrl->getConnection();
|
|
|
|
$storesProducts = [];
|
|
foreach ($products as $productId => $storeId) {
|
|
$storesProducts[$storeId][] = $productId;
|
|
}
|
|
/** @var TableMaintainer $tableMaintainer */
|
|
$tableMaintainer = ObjectManager::getInstance()->get(TableMaintainer::class);
|
|
|
|
foreach ($storesProducts as $storeId => $productIds) {
|
|
$select = $connection->select()->from(
|
|
['i' => $tableMaintainer->getMainTable($storeId)],
|
|
['product_id', 'store_id', 'visibility']
|
|
)->joinLeft(
|
|
['u' => $this->_catalogUrl->getMainTable()],
|
|
'i.product_id = u.entity_id AND i.store_id = u.store_id'
|
|
. ' AND u.entity_type = "' . ProductUrlRewriteGenerator::ENTITY_TYPE . '"',
|
|
['request_path']
|
|
)->joinLeft(
|
|
['r' => $this->_catalogUrl->getTable('catalog_url_rewrite_product_category')],
|
|
'u.url_rewrite_id = r.url_rewrite_id AND r.category_id is NULL',
|
|
[]
|
|
);
|
|
|
|
$bind = [];
|
|
foreach ($productIds as $productId) {
|
|
$catId = $this->_storeManager->getStore($storeId)->getRootCategoryId();
|
|
$productBind = 'product_id' . $productId;
|
|
$storeBind = 'store_id' . $storeId;
|
|
$catBind = 'category_id' . $catId;
|
|
$bindArray = [
|
|
'i.product_id = :' . $productBind,
|
|
'i.store_id = :' . $storeBind,
|
|
'i.category_id = :' . $catBind,
|
|
'u.metadata is Null',
|
|
];
|
|
$cond = '(' . implode(' AND ', $bindArray) . ')';
|
|
$bind[$productBind] = $productId;
|
|
$bind[$storeBind] = $storeId;
|
|
$bind[$catBind] = $catId;
|
|
$select->orWhere($cond);
|
|
}
|
|
|
|
$rowSet = $connection->fetchAll($select, $bind);
|
|
foreach ($rowSet as $row) {
|
|
$result[$row['product_id']] = [
|
|
'store_id' => $row['store_id'],
|
|
'visibility' => $row['visibility'],
|
|
'url_rewrite' => $row['request_path'],
|
|
];
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @return bool|ProductInterface|Product
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
public function getPreviousProduct()
|
|
{
|
|
return $this->getSiblingProduct(-1);
|
|
}
|
|
|
|
}
|