Как отобразить список товаров в моем пользовательском виджете
Я создаю свой пользовательский модуль для 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;
}
}
Кроме того, вы можете обратиться по этой ссылке для более подробной информации.