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或相应块中编辑集合,则分页和图层导航将永远无法正确进行。因此,请确保您接受的答案做到了以上两个方面。
Vivek Kumar

Answers:


1

您可以尝试以下方法:

更新您的catalog_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>

并在product / list.phtml中调用yourFile.phtml:

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

现在,您可以像下面这样在yourfile.phtml中使用函数:

$block->yourfunction();

例:

$block->getLoadedProductCollection();

希望这可以帮到你。


1

最好的方法是:

更新您的catalog_category_view.xml并替换Magento\Catalog\Block\Product\ListProductMod\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()为您自己的方法。

仅供参考:您的班级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是在其中为该页面创建集合的自定义块代码。

list.phtml文件从块合集下面的代码行:

$_productCollection = $block->getLoadedProductCollection();

只要您的块具有getLoadedProductCollection()函数,即可返回您的产品集合,则list.phtml文件将在您的集合中循环遍历产品中的每个产品,从而在默认的Magento产品网格中呈现它们。

对于您的块代码,请尝试更新以下行以包含getItems()

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

我照你说的做了 我的代码块具有“ getLoadedProductCollection()”函数,该函数返回“ ProductRepositoryInterface :: getList()”。但是我收到一个错误:未捕获的错误:调用未定义的方法Magento \ Framework \ Api \ SearchResults :: count()在...看来这不是正确的方法。
shahir hajir

看到更新的帖子
shahir hajir 17/09/21

也许尝试更改$ list = $ this-> _ productRepository-> getList($ searchCrit)-> getItems();
哈里

@shahirhajir您尝试过getItems吗?
哈里

不工作 $ list = $ this-> _ productRepository-> getList($ searchCrit)-> getItems(); 返回ProductInterface []数组,此数组没有count()函数。未捕获的错误:在第22行的... \ list.phtml中的数组上调用成员函数count()在list.phtml的第22行中,我们有:$ _productCollection-> count()
shahir hajir

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.