Как отобразить список товаров в моем пользовательском виджете

Я создаю свой пользовательский модуль для magento 2.3, и у меня возникла проблема с виджетом. Я создал свой тип виджета, и когда я включаю его в домашнюю страницу, я должен увидеть список продуктов, которые я выбрал для отображения. Я хочу использовать... / magento / vendor / magento / module-catalog / view / frontend / templates / product / list.phtml в качестве шаблона

Проблема в том, что класс Widget должен расширять класс Magento \ Framework \ View \ Element \ Template, а для визуализации ProductList мне нужно расширить Magento \ Catalogue \ Block \ Product \ ListProduct.

Может быть, кто-нибудь может дать мне совет, как решить эту проблему.

Вот часть моего кода

файл my-vendor / my-module / Block / Widget / MyWidget.php

class PromotedWidget extends Template implements BlockInterface
{
    public function __construct(
        Context $context,
      \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
         array $data = []
    )
    {
        $this->productCollectionFactory = $productCollectionFactory;
        parent::__construct($context, $data);
    }

    public function getLoadedProductCollection()
    {
        $collection = $this->productCollectionFactory->create();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('necessary_attribute', ['necessary_attribute' => 'attr_value']);
        return $collection;
    }

    public function toHtml()
    {
        $this->setTemplate('Magento_Catalog::product/list.phtml');
        return parent::_toHtml();
    }
}

1 ответ

Я думаю, что не стоит расширять класс Magento \ Catalogue \ Block \ Product \ ListProduct. Если вы хотите загрузить пользовательскую коллекцию продуктов и хотите, чтобы она работала так же, как страница со списком продуктов, я предлагаю вам создать плагин для класса Magento\CatalogSearch\Model\Search\IndexBuilder в вашем пользовательском виджете следующим образом:

Пространство имен \ MODULENAME \ и т.д. \di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\CatalogSearch\Model\Search\IndexBuilder">
        <plugin name="Namespace_Modulename::custom_collection" type="Namespace\Modulename\Plugin\CatalogSearch\Model\Search\IndexBuilder" />
    </type>
</config>

Пространство имен \ MODULENAME \Plugin\CatalogSearch\Model\Search\IndexBuilder.php

<?php
namespace Namespace\Modulename\Plugin\CatalogSearch\Model\Search;

use Magento\Framework\Search\RequestInterface;

class IndexBuilder {    
    protected $_request;
    protected $_categoryHelper;

    public function __construct(
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        \Magento\Catalog\Helper\Category $categoryHelper,
        \Magento\Framework\App\Request\Http $request
    ) {
        $this->_productCollectionFactory    = $productCollectionFactory;
        $this->_categoryHelper              = $categoryHelper;
        $this->_request                     = $request;
    }

    public function aroundBuild($subject, callable $proceed, RequestInterface $request) {
        $select = $proceed($request);

        $collection = $this->_productCollectionFactory->create();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('necessary_attribute', ['necessary_attribute' => 'attr_value']);
        $getProductAllIds = $collection->getAllIds();
        $productUniqueIds = array_unique($getProductAllIds);
        $select->where("search_index.entity_id IN ('" . join("','", $productUniqueIds) . "')");     
        return $select;
    }
}

Кроме того, вы можете обратиться по этой ссылке для более подробной информации.

Другие вопросы по тегам