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.xml
gibt 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;
}
}
magento-2.1
custom
product-collection
render
Shahir Hadschir
quelle
quelle
Antworten:
Sie können dies versuchen:
Aktualisieren Sie Ihre catalog_category_view.xml
Rufen Sie in product / list.phtml die Datei yourFile.phtml auf:
Jetzt können Sie Ihre Funktion in yourfile.phtml wie folgt verwenden:
Beispiel:
Hoffe das kann dir helfen.
quelle
Der beste Ansatz wäre:
Aktualisieren Sie Ihre
catalog_category_view.xml
und ersetzen SieMagento\Catalog\Block\Product\ListProduct
durchMod\Mod1\Block\Main
Vor:
nach:
Ihre
Main
Klasse muss erweitert werdenMagento\Catalog\Block\Product\ListProduct
Dann müssen Sie die Methode
getLayer()
nach Ihren Wünschen umschreiben .Erstellen Sie Ihre eigene neue
Layer
Klasse, die erweitert wird,Magento\Catalog\Model\Layer
und spielen Sie mit den Sammlungen.und
quelle
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.
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:
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 :
quelle
Sie können die Produktsammlung in Ihrer HTML-Datei so rendern
quelle