La grille de produits d'une page de catégorie (frontend) est rendue via la mise en page dans catalog_category_view.xml .
Disons que j'ai une collection de produits personnalisés (que j'ai obtenue via
ProductRepositoryInterface::getList($searchCriteria) method
dans une classe de bloc personnalisée et souhaitez rendre cette collection. Le résultat rendu doit être affiché sous forme de grille de produit sur le frontend (comme n'importe quelle page de catégorie).
Comment cela peut-il être fait ?
En examinant, catalog_category_view.xml
il existe deux lignes importantes, qui sont responsables du rendu d'une collection de produits:
<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">
Comment puis-je fournir ma collection de produits personnalisée à ces fichiers de modèle, afin qu'ils rendent ma collection?
Corrigez-moi si je me trompe.
Voici à quoi ressemble mon code de bloc:
<?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;
}
}
la source
Réponses:
Vous pouvez essayer ceci:
Mettez à jour votre catalog_category_view.xml
Et appelez yourFile.phtml dans product / list.phtml:
Maintenant, vous pouvez utiliser votre fonction dans votrefichier.phtml comme ceci:
Exemple:
J'espère que cela peut vous aider.
la source
La meilleure approche serait:
Mettez à jour votre
catalog_category_view.xml
et remplacezMagento\Catalog\Block\Product\ListProduct
parMod\Mod1\Block\Main
avant:
après:
Votre
Main
classe DOIT s'étendreMagento\Catalog\Block\Product\ListProduct
Ensuite, vous devrez réécrire la méthode
getLayer()
à votre guise.Créez votre propre nouvelle
Layer
classe qui s'étendraMagento\Catalog\Model\Layer
et jouera avec les collections.et
la source
Fondamentalement, au départ, vous souhaitez créer un contrôleur ou même une page CMS de base afin d'avoir une page pour afficher votre collection.
De là, vous pouvez utiliser votre bloc personnalisé qui crée votre collection combinée avec le fichier modèle list.phtml pour rendre les produits sur votre page.
Ajoutez au-dessus de xml où Vendor \ Module \ Block \ ProductCollection est le code de bloc personnalisé où votre collection est créée en xml pour cette page.
Le fichier list.phtml rassemble la collection de votre bloc avec la ligne de code ci-dessous:
Tant que votre bloc a la fonction getLoadedProductCollection () renvoyant votre collection de produits, le fichier list.phtml parcourra ensuite chaque produit de votre collection en les rendant dans une grille de produits Magento par défaut.
Pour votre code de blocage, essayez de mettre à jour la ligne ci-dessous pour inclure getItems () :
la source
Vous pouvez rendre la collection de produits dans votre fichier phtml comme ceci
la source