Magento 2 - Kết xuất bộ sưu tập sản phẩm tùy chỉnh qua list.phtml


15

Lưới sản phẩm của trang danh mục (frontend) được hiển thị thông qua bố cục trong catalog_carget_view.xml .

Hãy nói rằng tôi có một bộ sưu tập sản phẩm tùy chỉnh (mà tôi đã nhận được thông qua

ProductRepositoryInterface::getList($searchCriteria) method

trong một lớp khối tùy chỉnh và muốn kết xuất bộ sưu tập này. Kết quả được hiển thị phải được hiển thị dưới dạng lưới sản phẩm trên lối vào (giống như bất kỳ trang danh mục nào).

Điều này có thể giải quyết như thế nào ?

Bằng cách nhìn vào catalog_category_view.xmlcó hai dòng quan trọng, chịu trách nhiệm hiển thị bộ sưu tập sản phẩm:

<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">

Làm cách nào tôi có thể cung cấp bộ sưu tập sản phẩm tùy chỉnh của mình cho các tệp mẫu này để chúng hiển thị bộ sưu tập của tôi?

Đúng tôi, nếu tôi sai về điều này.

Đây là cách mã khối của tôi trông như thế nào:

<?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
Bạn đang hỏi làm thế nào để thay thế các sản phẩm trên một trang danh mục hoặc làm thế nào để có một phiên bản khác của bộ điều khiển danh mục?
Josh Davenport

Phân trang và điều hướng lớp không bao giờ đúng nếu bạn chỉnh sửa bộ sưu tập trong list.phtml hoặc khối tương ứng. Vì vậy, hãy chắc chắn rằng câu trả lời bạn chấp nhận thực hiện cả hai điều trên.Regards.
Vivek Kumar

Câu trả lời:


0

Bạn có thể thử điều này:

Cập nhật danh mục của bạn_carget_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>

Và gọi yourFile.phtml trong sản phẩm / list.phtml:

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

Bây giờ, bạn có thể sử dụng chức năng của mình trong yourfile.phtml như thế này:

$block->yourfunction();

Thí dụ:

$block->getLoadedProductCollection();

Hy vọng điều này có thể giúp bạn.


0

Cách tiếp cận tốt nhất sẽ là:

Cập nhật catalog_category_view.xmlvà thay thế Magento\Catalog\Block\Product\ListProductbằngMod\Mod1\Block\Main

trước:

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

sau:

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

MainLớp học của bạn PHẢI mở rộngMagento\Catalog\Block\Product\ListProduct

Sau đó, bạn sẽ cần phải viết lại phương thức getLayer()cho riêng bạn.

FYI: lớp của bạn Mod\Mod1\Block\Maincần một số tái cấu trúc.

Tạo Layerlớp mới của riêng bạn sẽ mở rộng Magento\Catalog\Model\Layervà chơi xung quanh với các bộ sưu tập.

/**
 * 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)

0

Về cơ bản ban đầu bạn muốn tạo một bộ điều khiển hoặc thậm chí một trang CMS cơ bản để bạn có một trang để hiển thị bộ sưu tập của mình.

Từ đó, bạn có thể sử dụng khối tùy chỉnh tạo bộ sưu tập của mình kết hợp với tệp mẫu list.phtml để hiển thị các sản phẩm trên trang của bạn.

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

Thêm xml ở trên, trong đó Vendor \ Module \ Block \ ProductCollection là mã khối tùy chỉnh nơi bộ sưu tập của bạn được tạo thành xml cho trang đó.

Tệp list.phtml tập hợp bộ sưu tập từ khối của bạn với dòng mã bên dưới:

$_productCollection = $block->getLoadedProductCollection();

Miễn là khối của bạn có hàm getLoaded ProducttCollection () trả về bộ sưu tập sản phẩm của bạn, tệp list.phtml sẽ lặp qua từng sản phẩm trong bộ sưu tập của bạn hiển thị chúng trong lưới sản phẩm Magento mặc định.

Đối với mã khối của bạn, hãy thử cập nhật dòng dưới đây để bao gồm getItems () :

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

Tôi đã làm như bạn nói. Khối của tôi có hàm 'getLoaded ProducttCollection ()' trả về 'ProductRep repositoryInterface :: getList ()'. Nhưng tôi gặp phải một lỗi: Uncaught Error: Gọi đến phương thức không xác định Magento \ Framework \ Api \ SearchResults :: Count () trong ... Có vẻ như đây không phải là phương pháp đúng.
shahir hajir

xem bài cập nhật
shahir hajir

Có thể thử thay đổi $ list = $ this -> _ productRep repository-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir Bạn đã thử với getItems chưa?
harri

Không làm việc. $ list = $ this -> _ sản phẩmRep repository-> getList ($ searchCrit) -> getItems (); trả về mảng ProductInterface [] và mảng này không có chức năng đếm (). Uncaught Error: Gọi tới hàm thành viên đếm () trên mảng trong ... \ list.phtml trên dòng 22. Trên dòng 22 trong list.phtml, chúng tôi có: $ _productCollection-> Count ()
shahir hajir

-1

Bạn có thể kết xuất bộ sưu tập sản phẩm trong tệp phtml của mình như thế này

$ product_collection = $ block-> getLoaded ProducttCollection ();


Không hữu ích chút nào
shahir hajir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.