Показать количество на странице категории Magento 2 - PullRequest
0 голосов
/ 12 ноября 2018

Я бы хотел отобразить количество товара на страницах категории. Я попробовал stockRegistry, и он работает просто отлично. Однако, когда он работает в производственной среде, для категории с большим количеством продуктов, он делает ошибку 500 или другие ошибки, которые не имеют ответа от сервера. Я считаю, что причина в том, что stockRegistry создал слишком много запросов, которые вызывают проблему.

Мой код ниже:

class ListProduct extends \Magento\Catalog\Block\Product\ListProduct {
    private $_stockRegistry;

    private $stockHelper;

    public function __construct(
        \Magento\Catalog\Block\Product\Context $context,
        \Magento\Framework\Data\Helper\PostHelper $postDataHelper,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        CategoryRepositoryInterface $categoryRepository,
        \Magento\Framework\Url\Helper\Data $urlHelper,
        \Magento\CatalogInventory\Api\StockRegistryInterface 
        $stockRegistry,
        Stock $stockHelper,
        array $data = []
    )
    {
        $this->_stockRegistry = $stockRegistry;
        $this->stockHelper = $stockHelper;

        parent::__construct(
            $context,
            $postDataHelper,
            $layerResolver,
            $categoryRepository,
            $urlHelper,
            $data
        );
    }


    public function getProductStock($id) {
        return $this->_stockRegistry->getStockItem($id)->getQty();
    }
}

И, конечно, я обновил свой XML-файл для использования этого класса.

Каким образом можно получить количество, отображаемое на страницах категорий, с лучшей производительностью?

1 Ответ

0 голосов
/ 15 ноября 2018

Правильный способ сделать это - получить количества для всех продуктов на странице

namespace Example\CatalogInventory\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Stock extends AbstractDb
{
    /**
     * {@inheritdoc}
     */
    protected function _construct()
    {
        $this->_init('cataloginventory_stock_item', 'item_id');
    }

    /**
     * Retrieve products quantities
     * Return array as key product id, value - qty
     */
    public function getProductsStockQty($productIds, $websiteId, $stockId = \Magento\CatalogInventory\Model\Stock::DEFAULT_STOCK_ID)
    {
        $select = $this->getConnection()->select()
            ->from($this->getMainTable(), ['product_id', 'qty'])
            ->where('product_id IN(?)', $productIds)
            ->where('stock_id=?', (int)$stockId)
            ->where('website_id=?', (int)$websiteId);

        return $this->getConnection()->fetchPairs($select);
    }
}

и использовать их в своем пользовательском блоке:

class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
    /**
     * @var \Example\CatalogInventory\Model\ResourceModel\Stock
     */
    private $stock;

    /**
     * @var array
     */
    private $quantities;

    public function __construct(
        \Magento\Catalog\Block\Product\Context $context,
        \Magento\Framework\Data\Helper\PostHelper $postDataHelper,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository,
        \Magento\Framework\Url\Helper\Data $urlHelper,
        \Example\CatalogInventory\Model\ResourceModel\Stock $stock,
        array $data = []
    ) {
        parent::__construct($context, $postDataHelper, $layerResolver, $categoryRepository, $urlHelper, $data);
        $this->stock = $stock;
    }

    public function getProductStock($productId)
    {
        if (!$this->quantities) {
            $this->quantities = $this->stock->getProductsStockQty(
                $this->getLoadedProductCollection()->getLoadedIds(),
                $this->_storeManager->getStore()->getWebsiteId()
            );
        }

        return $this->quantities[$productId] ?? 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...