Magento 2 - Візуалізація власної колекції продуктів через list.phtml


16

Сітка продуктів сторінки категорії (фронтальний) відображається за допомогою макета в 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;
}
}

1
Ви запитуєте, як замінити товари на сторінці категорії або як по суті мати іншу версію контролера категорій?
Джош Давенпорт

Пагинація та навігація по шарам ніколи не підходять, якщо ви редагуєте колекцію у list.phtml або відповідному блоці. Тому переконайтесь, що відповідь, яку ви приймаєте, виконує обидва вищезазначені речі.
Вівек Кумар

Відповіді:


1

Ви можете спробувати це:

Оновіть каталог_category_view.xml

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
<block class="Your(Mod)\Namespace(Mod1)\Block\YourBlockFileName(Main)" name="your.category.products.list" template="Magento_Catalog::product/yourFile.phtml" />
</block>

І зателефонуйте до файлу yourFile.phtml у product / list.phtml:

<?php echo $this->getChildHtml('your.category.products.list'); ?>

Тепер ви можете використовувати свою функцію у yourfile.phtml так:

$block->yourfunction();

Приклад:

$block->getLoadedProductCollection();

Сподіваюся, що це може вам допомогти.


1

Найкращим підходом був би:

Оновіть своє catalog_category_view.xmlта замініть Magento\Catalog\Block\Product\ListProductнаMod\Mod1\Block\Main

перед:

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

після:

block class="Mod\Mod1\Block\Main" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

Ваш Mainклас ОБОВ'ЯЗКОВО розширитиMagento\Catalog\Block\Product\ListProduct

Тоді вам потрібно буде переписати метод getLayer()на свій власний.

FYI: ваш клас Mod\Mod1\Block\Mainпотребує певного рефакторингу.

Створіть свій власний новий Layerклас, який буде розширюватись Magento\Catalog\Model\Layerта грати з колекціями.

/**
 * Retrieve current layer product collection
 *
 * @return \Magento\Catalog\Model\ResourceModel\Product\Collection
 */
public function getProductCollection()

і

/**
 * Initialize product collection
 *
 * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
 * @return \Magento\Catalog\Model\Layer
 */
public function prepareProductCollection($collection)

1

По суті, ви хочете створити контролер або навіть основну сторінку CMS, щоб у вас була сторінка для показу вашої колекції.

Звідти ви можете використовувати власний блок, який створює вашу колекцію в поєднанні з файлом шаблону list.phtml для відображення продуктів на вашій сторінці.

{{block class="Vendor\Module\Block\ProductCollection" template="Magento_Catalog::product/list.phtml" name="specialproducts"}} 

Додайте вище xml, де Vendor \ Module \ Block \ ProductCollection - це спеціальний код блоку, де створена ваша колекція, щоб xml для цієї сторінки.

Файл list.phtml збирає колекцію з вашого блоку з рядком коду нижче:

$_productCollection = $block->getLoadedProductCollection();

До тих пір, поки у вашому блоці буде функція getLoadedProductCollection (), яка повертає вашу колекцію продуктів, файл list.phtml потім буде перебирати кожен продукт у вашій колекції, відтворюючи їх у мережу продуктів Magento за замовчуванням.

Для блочного коду спробуйте оновити нижче рядка, щоб включити getItems () :

$list = $this->_productRepository->getList($searchCrit)->getItems();

Я зробив, як ти сказав. Мій блок має функцію 'getLoadedProductCollection ()', яка повертає 'ProductRepositoryInterface :: getList ()'. Але я отримую Error: Uncaught Error: Call to undefined method Magento \ Framework \ Api \ SearchResults :: count () in… Схоже, це не правильний підхід.
Blackpanther0001

дивіться оновлений пост
Blackpanther0001

Можливо, спробуйте змінити $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir Ви пробували з getItems?
harri

Не працює. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); повертає масив ProductInterface [], і цей масив не має функції count (). Неприхована помилка: Виклик до числа функцій члена () на масиві в ... \ list.phtml у рядку 22. У рядку 22 у list.phtml у нас є: $ _productCollection-> count ()
Blackpanther0001,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.