마 젠토 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
카테고리 페이지에서 제품을 교체하는 방법 또는 본질적으로 다른 버전의 카테고리 컨트롤러를 갖는 방법을 묻고 있습니까?
Josh Davenport

list.phtml 또는 해당 블록에서 컬렉션을 편집하면 페이지 매김 및 레이어 탐색이 제대로 이루어지지 않습니다. 따라서 귀하가 수락하는 답변이 위의 두 가지 모두를 수행하는지 확인하십시오.
Vivek Kumar

답변:


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\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()자신 의 방법 을 다시 작성해야합니다 .

참고 : 수업 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"}} 

Vendor \ Module \ Block \ ProductCollection 이 xml에 추가 되면 컬렉션이 해당 페이지에 대해 xml로 생성되는 사용자 지정 블록 코드입니다.

list.phtml의 파일은 코드의 라인 아래로 블록에서 컬렉션을 수집합니다 :

$_productCollection = $block->getLoadedProductCollection();

블록 에 제품 컬렉션을 반환 하는 getLoadedProductCollection () 함수 가있는 경우 list.phtml 파일은 컬렉션의 각 제품을 반복하여 기본 Magento 제품 그리드에 렌더링합니다.

블록 코드의 경우 getItems () 를 포함하도록 아래 행을 업데이트하십시오 .

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

나는 당신이 말한대로했습니다. 내 블록에는 'ProductRepositoryInterface :: getList ()'를 반환하는 'getLoadedProductCollection ()'함수가 있습니다. 그러나 오류가 발생했습니다 : 잡히지 않는 오류 : 정의되지 않은 메소드 Magento \ Framework \ Api \ SearchResults :: count ()에서 ...이 올바른 접근 방식이 아닌 것 같습니다.
shahir hajir

업데이트 된 게시물을 참조
샤히 hajir

아마도 $ 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-> 수 ()
샤히 hajir

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.