Magento 2 - Rendering della raccolta di prodotti personalizzati tramite list.phtml


16

La griglia del prodotto di una pagina di categoria (frontend) viene visualizzata tramite layout in catalog_category_view.xml .

Diciamo che ho una collezione di prodotti personalizzati (che ho ottenuto tramite

ProductRepositoryInterface::getList($searchCriteria) method

in una classe di blocchi personalizzata e desidera eseguire il rendering di questa raccolta. Il risultato di rendering deve essere visualizzato come griglia del prodotto sul frontend (proprio come qualsiasi pagina di categoria).

Come si può fare ?

Osservando catalog_category_view.xmlci sono due linee significative, che sono responsabili del rendering di una raccolta di prodotti:

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

Come posso fornire la mia raccolta di prodotti personalizzati a questi file modello, in modo che eseguano il rendering della mia raccolta?

Correggimi, se sbaglio su questo.

Ecco come appare il mio codice di blocco:

<?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
Stai chiedendo come sostituire i prodotti in una pagina di categoria o come essenzialmente avere un'altra versione del controller di categoria?
Josh Davenport,

L'impaginazione e la navigazione dei livelli non arrivano mai bene se si modifica la raccolta in list.phtml o nel blocco corrispondente. Quindi assicurati che la risposta che stai accettando faccia entrambe le cose sopra.
Vivek Kumar il

Risposte:


1

Puoi provare questo:

Aggiorna il tuo 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>

E chiama yourFile.phtml in product / list.phtml:

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

Ora puoi usare la tua funzione in yourfile.phtml in questo modo:

$block->yourfunction();

Esempio:

$block->getLoadedProductCollection();

Spero che questo possa aiutarti.


1

L'approccio migliore sarebbe:

Aggiorna il tuo catalog_category_view.xmle sostituiscilo Magento\Catalog\Block\Product\ListProductconMod\Mod1\Block\Main

prima:

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

dopo:

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

La tua Mainclasse DEVE estendereMagento\Catalog\Block\Product\ListProduct

Quindi dovrai riscrivere il metodo getLayer()per conto tuo.

Cordiali saluti: la tua classe ha Mod\Mod1\Block\Mainbisogno di alcuni refactoring.

Crea la tua nuova Layerclasse che si estenderà Magento\Catalog\Model\Layere giocherà con le collezioni.

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

e

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

1

Fondamentalmente inizialmente vuoi creare un controller o anche una pagina CMS di base in modo da avere una pagina per mostrare la tua collezione.

Da lì puoi usare il tuo blocco personalizzato che crea la tua raccolta combinato con il file modello list.phtml per rendere i prodotti sulla tua pagina.

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

Aggiungi sopra xml dove Vendor \ Module \ Block \ ProductCollection è il codice di blocco personalizzato in cui la tua raccolta viene creata in xml per quella pagina.

Il file list.phtml raccoglie la raccolta dal tuo blocco con la seguente riga di codice:

$_productCollection = $block->getLoadedProductCollection();

Finché il blocco ha la funzione getLoadedProductCollection () che restituisce la tua raccolta di prodotti, il file list.phtml eseguirà il ciclo attraverso ogni prodotto della raccolta rendendoli in una griglia di prodotti Magento predefinita.

Per il tuo codice di blocco prova ad aggiornare sotto la riga per includere getItems () :

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

Ho fatto come hai detto. Il mio blocco ha la funzione 'getLoadedProductCollection ()' che restituisce 'ProductRepositoryInterface :: getList ()'. Ma ricevo un errore: errore non rilevato: chiamata al metodo indefinito Magento \ Framework \ Api \ SearchResults :: count () in ... Sembra che questo non sia l'approccio giusto.
Shahir Hajir,

vedi post aggiornato
shahir hajir,

Forse prova a cambiare $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
Harri,

@shahirhajir Hai provato con getItems?
Harri,

Non funziona. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); restituisce la matrice ProductInterface [] e questa matrice non ha alcuna funzione count (). Errore non rilevato: chiamata a un conteggio delle funzioni membro () sull'array in ... \ list.phtml alla riga 22. Sulla riga 22 in list.phtml abbiamo: $ _productCollection-> count ()
shahir hajir

-1

È possibile eseguire il rendering della raccolta prodotti nel file phtml in questo modo

$ product_collection = $ block-> getLoadedProductCollection ();


Non è affatto utile
shahir hajir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.