La cuadrícula de productos de una página de categoría (frontend) se representa mediante el diseño en catalog_category_view.xml .
Digamos que tengo una colección de productos personalizada (que obtuve a través de
ProductRepositoryInterface::getList($searchCriteria) method
en una clase de bloque personalizada y desea representar esta colección. El resultado representado debe mostrarse como una cuadrícula de producto en la interfaz (al igual que cualquier página de categoría).
¿Cómo se puede hacer esto?
Al examinar catalog_category_view.xml
hay dos líneas importantes, que son responsables de representar una colección de productos:
<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">
¿Cómo puedo proporcionar mi colección de productos personalizada a estos archivos de plantilla para que representen mi colección?
Corrígeme, si estoy equivocado en esto.
Así es como se ve mi código de bloqueo:
<?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;
}
}
fuente
Respuestas:
Puedes probar esto:
Actualice su catalog_category_view.xml
Y llame a yourFile.phtml en product / list.phtml:
Ahora, puede usar su función en yourfile.phtml de esta manera:
Ejemplo:
Espero que esto le pueda ayudar.
fuente
El mejor enfoque sería:
Actualice su
catalog_category_view.xml
y reemplaceMagento\Catalog\Block\Product\ListProduct
conMod\Mod1\Block\Main
antes de:
después:
Tu
Main
clase DEBE extenderseMagento\Catalog\Block\Product\ListProduct
Luego deberá reescribir el método
getLayer()
a su cuenta.Crea tu propia nueva
Layer
clase que se extenderáMagento\Catalog\Model\Layer
y juega con las colecciones.y
fuente
Básicamente, inicialmente desea crear un controlador o incluso una página básica de CMS para tener una página para mostrar su colección.
Desde allí, puede usar su bloque personalizado que crea su colección combinada con el archivo de plantilla list.phtml para representar los productos en su página.
Agregue xml arriba donde Vendor \ Module \ Block \ ProductCollection es el código de bloque personalizado donde se crea su colección en xml para esa página.
El archivo list.phtml recopila la colección de su bloque con la siguiente línea de código:
Siempre que su bloque tenga la función getLoadedProductCollection () que devuelve su colección de productos, el archivo list.phtml recorrerá cada producto en su colección y los representará en una cuadrícula de productos Magento predeterminada.
Para su código de bloqueo, intente actualizar la siguiente línea para incluir getItems () :
fuente
Puede renderizar la colección de productos en su archivo phtml de esta manera
fuente