A grade do produto de uma página de categoria (front-end) é renderizada via layout em catalog_category_view.xml .
Digamos que eu tenho uma coleção de produtos personalizada (que recebi via
ProductRepositoryInterface::getList($searchCriteria) method
em uma classe de bloco personalizada e deseja renderizar essa coleção. O resultado renderizado deve ser exibido como uma grade de produtos no front-end (como qualquer página de categoria).
Como isso pode ser feito ?
Examinando, catalog_category_view.xml
existem duas linhas significativas, responsáveis por renderizar uma coleção de produtos:
<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">
Como posso fornecer minha coleção de produtos personalizada para esses arquivos de modelo, para que eles renderizem minha coleção?
Corrija-me, se eu estiver errado nisso.
É assim que meu código de bloco se parece:
<?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
shahir hajir
fonte
fonte
Respostas:
Você pode tentar isso:
Atualize seu catalog_category_view.xml
E chame yourFile.phtml em product / list.phtml:
Agora, você pode usar sua função em yourfile.phtml assim:
Exemplo:
Espero que isso possa ajudá-lo.
fonte
A melhor abordagem seria:
Atualize
catalog_category_view.xml
e substituaMagento\Catalog\Block\Product\ListProduct
porMod\Mod1\Block\Main
antes:
depois de:
Sua
Main
classe DEVE estenderMagento\Catalog\Block\Product\ListProduct
Então você precisará reescrever o método
getLayer()
por conta própria.Crie sua própria nova
Layer
classe que irá estenderMagento\Catalog\Model\Layer
e brincar com as coleções.e
fonte
Basicamente, inicialmente, você deseja criar um controlador ou até uma página básica do CMS para ter uma página para mostrar sua coleção.
A partir daí, você pode usar seu bloco personalizado, que cria sua coleção combinada com o arquivo de modelo list.phtml para renderizar os produtos em sua página.
Adicione o xml acima, em que Vendor \ Module \ Block \ ProductCollection é o código de bloco personalizado em que sua coleção é criada para xml para essa página.
O arquivo list.phtml reúne a coleção do seu bloco com a linha de código abaixo:
Enquanto seu bloco tiver a função getLoadedProductCollection () retornando sua coleção de produtos, o arquivo list.phtml passará por cada produto da sua coleção, tornando-os em uma grade padrão do Magento.
Para o seu código de bloqueio, tente atualizar a linha abaixo para incluir getItems () :
fonte
Você pode renderizar a coleção de produtos em seu arquivo phtml assim
fonte