Сетка продукта страницы категории (внешний интерфейс) отображается с помощью макета в catalog_category_view.xml .
Допустим, у меня есть собственная коллекция продуктов (которую я получил через
ProductRepositoryInterface::getList($searchCriteria) method
в пользовательском классе блока и хотите визуализировать эту коллекцию. Полученный результат должен отображаться в виде сетки продуктов на веб-интерфейсе (как и на любой странице категории).
Как это может быть сделано ?
При рассмотрении catalog_category_view.xml
есть две важные линии, которые отвечают за рендеринг коллекции продуктов:
<block class="Magento\Catalog\Block\Category\View" name="category.products" template="Magento_Catalog::category/products.phtml">
<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
Как я могу предоставить свою собственную коллекцию продуктов для этих файлов шаблонов, чтобы они отображали мою коллекцию?
Поправь меня, если я не прав в этом.
Вот так выглядит мой блочный код:
<?php
namespace Mod\Mod1\Block;
use Magento\Framework\View\Element\Template;
class Main extends Template
{
protected $_filterBuilder;
protected $_filterGroupArray;
protected $_filterGroupBuilder;
protected $_searchCriteriaBuilder;
protected $_productRepository;
protected $_productFactory;
protected $_list;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Catalog\Model\ProductFactory $productFactory,
array $data = [])
{
$this->_productRepository = $productRepository;
$this->_searchCriteriaBuilder = $searchCriteriaBuilder;
$this->_filterGroupBuilder = $filterGroupBuilder;
$this->_filterBuilder = $filterBuilder;
parent::__construct($context, $data);
}
public function getLoadedProductCollection(){
$searchCrit = $this->buildSearchCriteria('','','','','','5-',1);
$list = $this->_productRepository->getList($searchCrit);
return $list;
}
public function buildSearchCriteria(...){
....
return $searchCriteria;
}
}
magento-2.1
custom
product-collection
render
Шахир Хаджир
источник
источник
Ответы:
Вы можете попробовать это:
Обновите ваш catalog_category_view.xml
И вызовите yourFile.phtml в product / list.phtml:
Теперь вы можете использовать свою функцию в yourfile.phtml следующим образом:
Пример:
Надеюсь, это поможет вам.
источник
Лучший подход будет:
Обновите
catalog_category_view.xml
и заменитеMagento\Catalog\Block\Product\ListProduct
наMod\Mod1\Block\Main
перед:
после:
Ваш
Main
класс ДОЛЖЕН расширятьсяMagento\Catalog\Block\Product\ListProduct
Затем вам нужно будет переписать метод
getLayer()
на свой собственный.Создайте свой собственный новый
Layer
класс, который будет расширятьсяMagento\Catalog\Model\Layer
и играть с коллекциями.и
источник
Вначале вы хотите создать контроллер или даже простую страницу CMS, чтобы у вас была страница для отображения вашей коллекции.
Оттуда вы можете использовать свой пользовательский блок, который создает вашу коллекцию в сочетании с файлом шаблона list.phtml для отображения продуктов на вашей странице.
Добавьте выше xml, где Vendor \ Module \ Block \ ProductCollection - это код пользовательского блока, в котором ваша коллекция создается в формате xml для этой страницы.
List.phtml файл собирает коллекцию из вашего блока с ниже строки кода:
Пока в вашем блоке есть функция getLoadedProductCollection (), возвращающая вашу коллекцию продуктов, файл list.phtml будет затем перебирать каждый продукт в вашей коллекции, отображая их в сетке продуктов Magento по умолчанию.
Для вашего кода блока попробуйте обновить строку ниже, чтобы включить getItems () :
источник
Вы можете визуализировать коллекцию продуктов в вашем phtml-файле следующим образом.
источник