Magento 2 - Render koleksi produk khusus melalui list.phtml

16

Kisi produk dari halaman kategori (frontend) diberikan melalui tata letak di catalog_category_view.xml .

Katakanlah saya memiliki koleksi produk khusus (yang saya dapat via

ProductRepositoryInterface::getList($searchCriteria) method

dalam kelas blok khusus dan ingin merender koleksi ini. Hasil yang diberikan harus ditampilkan sebagai kisi-kisi produk di frontend (sama seperti halaman kategori mana pun).

Bagaimana ini bisa dilakukan?

Dengan melihat catalog_category_view.xmlada dua garis signifikan, yang bertanggung jawab untuk merender koleksi produk:

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

Bagaimana saya bisa memberikan koleksi produk khusus saya ke file template ini, sehingga mereka membuat koleksi saya?

Perbaiki saya, jika saya salah dalam hal ini.

Ini adalah bagaimana kode blok saya terlihat:

<?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;
}
}
shahir hajir
sumber
1
Apakah Anda bertanya bagaimana cara mengganti produk pada halaman kategori atau bagaimana dasarnya memiliki versi lain dari pengontrol kategori?
Josh Davenport
Navigasi pagination dan layer tidak pernah benar jika Anda mengedit koleksi di list.phtml atau blok yang sesuai. Jadi, pastikan jawaban yang Anda terima melakukan kedua hal di atas. Salam.
Vivek Kumar

Jawaban:

1

Anda dapat mencoba ini:

Perbarui catalog_category_view.xml Anda

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

Dan hubungi yourFile.phtml di produk / list.phtml:

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

Sekarang, Anda dapat menggunakan fungsi Anda di file.phtml Anda seperti ini:

$block->yourfunction();

Contoh:

$block->getLoadedProductCollection();

Semoga ini bisa membantu Anda.

TriAnhHuynh
sumber
1

Pendekatan terbaik adalah:

Perbarui catalog_category_view.xmldan ganti Magento\Catalog\Block\Product\ListProductdenganMod\Mod1\Block\Main

sebelum:

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

setelah:

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

MainKelas Anda HARUS diperluasMagento\Catalog\Block\Product\ListProduct

Maka Anda perlu menulis ulang metode getLayer()untuk Anda sendiri.

FYI: kelas Anda Mod\Mod1\Block\Mainperlu refactoring.

Buat Layerkelas baru Anda sendiri yang akan diperluas Magento\Catalog\Model\Layerdan bermain-main dengan koleksi.

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

dan

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

Pada dasarnya Anda ingin membuat controller atau bahkan halaman CMS dasar sehingga Anda memiliki halaman untuk menunjukkan koleksi Anda.

Dari sana Anda dapat menggunakan blok khusus yang membuat koleksi Anda digabungkan dengan file template list.phtml untuk membuat produk di halaman Anda.

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

Tambahkan xml di atas tempat Vendor \ Module \ Block \ ProductCollection adalah kode blok khusus tempat koleksi Anda dibuat untuk xml untuk halaman itu.

File list.phtml mengumpulkan koleksi dari blok Anda dengan baris kode di bawah ini:

$_productCollection = $block->getLoadedProductCollection();

Selama blok Anda memiliki fungsi getLoadedProductCollection () mengembalikan koleksi produk Anda, file list.phtml kemudian akan mengulangi setiap produk dalam koleksi Anda, merendernya di kotak produk Magento default.

Untuk kode blok Anda, coba perbarui baris di bawah ini untuk memasukkan getItems () :

$list = $this->_productRepository->getList($searchCrit)->getItems();
harri
sumber
Saya melakukan apa yang Anda katakan. Blokir saya memiliki fungsi 'getLoadedProductCollection ()' yang mengembalikan 'ProductRepositoryInterface :: getList ()'. Tapi saya mendapatkan Error: Uncaught Error: Panggil ke metode tak terdefinisi Magento \ Framework \ Api \ SearchResults :: count () di ... Sepertinya ini bukan pendekatan yang tepat.
shahir hajir
lihat posting terbaru
shahir hajir
Mungkin coba ubah $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
harri
@shahirhajir Apakah Anda mencoba dengan getItems?
harri
Tidak bekerja $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); mengembalikan array ProductInterface [] dan array ini tidak memiliki funtion count (). Uncaught Error: Panggil ke fungsi anggota menghitung () pada larik di ... \ list.phtml on line 22. Pada baris 22 di list.phtml kita memiliki: $ _productCollection-> count ()
shahir hajir
-1

Anda dapat membuat koleksi produk dalam file phtml Anda seperti ini

$ product_collection = $ block-> getLoadedProductCollection ();

Divya Muralidharan
sumber
Tidak membantu sama sekali
shahir hajir