Magento 2 - Rendre la collection de produits personnalisés via list.phtml


16

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.xmlil 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;
}
}

1
Demandez-vous comment remplacer des produits sur une page de catégorie ou comment avoir essentiellement une autre version du contrôleur de catégorie?
Josh Davenport

La pagination et la navigation par calque ne se produisent jamais correctement si vous modifiez la collection dans list.phtml ou le bloc correspondant. Assurez-vous donc que la réponse que vous acceptez fait les deux choses ci-dessus.
Vivek Kumar

Réponses:


1

Vous pouvez essayer ceci:

Mettez à jour votre 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>

Et appelez yourFile.phtml dans product / list.phtml:

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

Maintenant, vous pouvez utiliser votre fonction dans votrefichier.phtml comme ceci:

$block->yourfunction();

Exemple:

$block->getLoadedProductCollection();

J'espère que cela peut vous aider.


1

La meilleure approche serait:

Mettez à jour votre catalog_category_view.xmlet remplacez Magento\Catalog\Block\Product\ListProductparMod\Mod1\Block\Main

avant:

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

après:

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

Votre Mainclasse DOIT s'étendreMagento\Catalog\Block\Product\ListProduct

Ensuite, vous devrez réécrire la méthode getLayer()à votre guise.

Pour info: votre classe a Mod\Mod1\Block\Mainbesoin d'une refactorisation.

Créez votre propre nouvelle Layerclasse qui s'étendra Magento\Catalog\Model\Layeret jouera avec les collections.

/**
 * Retrieve current layer product collection
 *
 * @return \Magento\Catalog\Model\ResourceModel\Product\Collection
 */
public function getProductCollection()

et

/**
 * Initialize product collection
 *
 * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
 * @return \Magento\Catalog\Model\Layer
 */
public function prepareProductCollection($collection)

1

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.

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

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:

$_productCollection = $block->getLoadedProductCollection();

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 () :

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

J'ai fait comme tu l'as dit. Mon bloc a la fonction 'getLoadedProductCollection ()' qui retourne 'ProductRepositoryInterface :: getList ()'. Mais j'obtiens une erreur: erreur non interceptée: appel à la méthode non définie Magento \ Framework \ Api \ SearchResults :: count () dans ... On dirait que ce n'est pas la bonne approche.
shahir hajir

voir le post mis à jour
shahir hajir

Essayez peut-être de changer $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir Avez-vous essayé avec getItems?
harri

Ca ne fonctionne pas. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); renvoie le tableau ProductInterface [] et ce tableau n'a pas de fonction count (). Erreur non interceptée: appel à une fonction membre count () sur le tableau dans ... \ list.phtml à la ligne 22. À la ligne 22 dans list.phtml, nous avons: $ _productCollection-> count ()
shahir hajir

-1

Vous pouvez rendre la collection de produits dans votre fichier phtml comme ceci

$ product_collection = $ block-> getLoadedProductCollection ();


Pas du tout utile
shahir hajir
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.