Magento 2 - Rendern Sie eine benutzerdefinierte Produktsammlung über list.phtml


15

Das Produktraster einer Kategorieseite (Frontend) wird über das Layout in catalog_category_view.xml gerendert .

Nehmen wir an, ich habe eine benutzerdefinierte Produktkollektion (die ich über erhalten habe

ProductRepositoryInterface::getList($searchCriteria) method

in einer benutzerdefinierten Blockklasse und möchten diese Auflistung rendern. Das gerenderte Ergebnis sollte wie jede Kategorieseite als Produktgitter im Frontend angezeigt werden.

Wie geht das?

Bei der Betrachtung catalog_category_view.xmlgibt es zwei wichtige Zeilen, die für das Rendern einer Produktkollektion verantwortlich sind:

<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">

Wie kann ich diesen Vorlagendateien meine benutzerdefinierte Produktsammlung zur Verfügung stellen, damit sie meine Sammlung rendern?

Korrigieren Sie mich, wenn ich mich irre.

So sieht mein Blockcode aus:

<?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
Fragen Sie sich, wie Sie Produkte auf einer Kategorieseite ersetzen oder wie Sie im Wesentlichen eine andere Version des Kategoriereglers verwenden können?
Josh Davenport

Paginierung und Ebenennavigation werden nie richtig, wenn Sie die Sammlung in der Datei list.phtml oder im entsprechenden Block bearbeiten. Stellen Sie also sicher, dass die von Ihnen akzeptierte Antwort beide oben genannten Punkte erfüllt.
Vivek Kumar

Antworten:


0

Sie können dies versuchen:

Aktualisieren Sie Ihre 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>

Rufen Sie in product / list.phtml die Datei yourFile.phtml auf:

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

Jetzt können Sie Ihre Funktion in yourfile.phtml wie folgt verwenden:

$block->yourfunction();

Beispiel:

$block->getLoadedProductCollection();

Hoffe das kann dir helfen.


0

Der beste Ansatz wäre:

Aktualisieren Sie Ihre catalog_category_view.xmlund ersetzen Sie Magento\Catalog\Block\Product\ListProductdurchMod\Mod1\Block\Main

Vor:

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

nach:

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

Ihre MainKlasse muss erweitert werdenMagento\Catalog\Block\Product\ListProduct

Dann müssen Sie die Methode getLayer()nach Ihren Wünschen umschreiben .

Zu Ihrer Information: Ihre Klasse Mod\Mod1\Block\Mainmuss umgestaltet werden.

Erstellen Sie Ihre eigene neue LayerKlasse, die erweitert wird, Magento\Catalog\Model\Layerund spielen Sie mit den Sammlungen.

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

und

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

0

Grundsätzlich möchten Sie zunächst einen Controller oder sogar eine einfache CMS-Seite erstellen, damit Sie eine Seite haben, auf der Ihre Sammlung angezeigt wird.

Von dort aus können Sie Ihren benutzerdefinierten Block verwenden, der Ihre Sammlung in Kombination mit der Vorlagendatei list.phtml erstellt, um die Produkte auf Ihrer Seite zu rendern.

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

Fügen Sie über xml hinzu, wobei Vendor \ Module \ Block \ ProductCollection der benutzerdefinierte Blockcode ist, in dem Ihre Sammlung für diese Seite in xml erstellt wird.

Die Datei list.phtml sammelt die Sammlung aus Ihrem Block mit der folgenden Codezeile:

$_productCollection = $block->getLoadedProductCollection();

Solange Ihr Block über die Funktion getLoadedProductCollection () verfügt, die Ihre Produktsammlung zurückgibt, durchläuft die Datei list.phtml alle Produkte in Ihrer Sammlung und gibt sie in einem Standard-Magento-Produktraster wieder.

Versuchen Sie für Ihren Blockcode, die folgende Zeile zu aktualisieren, um getItems () einzuschließen :

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

Ich habe getan, wie du gesagt hast. Mein Block hat die Funktion 'getLoadedProductCollection ()', die 'ProductRepositoryInterface :: getList ()' zurückgibt. Aber ich bekomme eine Fehlermeldung: Ungefangener Fehler: Aufruf der undefinierten Methode Magento \ Framework \ Api \ SearchResults :: count () in ... Sieht so aus, als wäre dies nicht der richtige Ansatz.
Shahir Hadschir

siehe aktualisierten Beitrag
Shahir Hadschir

Versuchen Sie vielleicht, $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems () zu ändern.
Harri

@shahirhajir Hast du es mit getItems versucht?
Harri

Funktioniert nicht. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); gibt das Array ProductInterface [] zurück und dieses Array hat keine count () -Funktion. Nicht gefundener Fehler: Rufen Sie eine Mitgliedsfunktion count () für das Array in ... \ list.phtml in Zeile 22 auf. In Zeile 22 in list.phtml haben wir: $ _productCollection-> count ()
shahir hajir

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.