Magento 2 - list.phtml aracılığıyla özel ürün koleksiyonu oluşturma


16

Bir kategori sayfasının (ön uç) ürün ızgarası catalog_category_view.xml dosyasındaki düzen ile oluşturulur .

Özel bir ürün koleksiyonum olduğunu varsayalım (

ProductRepositoryInterface::getList($searchCriteria) method

özel bir blok sınıfında ve bu koleksiyonu oluşturmak istiyorum. Oluşturulan sonuç, ön uçta bir ürün ızgarası olarak görüntülenmelidir (herhangi bir kategori sayfası gibi).

Bu nasıl yapılabilir?

İçine bakarak catalog_category_view.xmlbir ürünün koleksiyonu render sorumlu olan iki önemli satır var:

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

Özel ürün koleksiyonumu bu şablon dosyalarına nasıl sağlayabilirim, böylece koleksiyonumu oluştururlar?

Beni düzeltin, eğer bu konuda yanılıyorsam.

Benim blok kodu şöyle görünür:

<?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
Bir kategori sayfasındaki ürünlerin nasıl değiştirileceğini veya kategori denetleyicisinin başka bir sürümünün nasıl bulunacağını mı soruyorsunuz?
Josh Davenport

List.phtml veya ilgili blokta koleksiyonu düzenlerseniz sayfalandırma ve katman gezinmesi hiçbir zaman doğru olmaz. Bu yüzden kabul ettiğiniz cevabın yukarıdaki her ikisini de yaptığından emin olun.
Vivek Kumar

Yanıtlar:


1

Bunu deneyebilirsiniz:

Catalog_category_view.xml dosyanızı güncelleyin

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

Ve product / list.phtml dosyasında File.phtml dosyanızı arayın:

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

Şimdi, yourfile.phtml dosyasındaki işlevinizi şu şekilde kullanabilirsiniz:

$block->yourfunction();

Misal:

$block->getLoadedProductCollection();

Umarım bu size yardımcı olabilir.


1

En iyi yaklaşım:

Güncelleme senin catalog_category_view.xmlve değiştirme Magento\Catalog\Block\Product\ListProductileMod\Mod1\Block\Main

önce:

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

sonra:

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

Sizin Mainsınıf uzatmak GEREKİRMagento\Catalog\Block\Product\ListProduct

Sonra yöntemi getLayer()kendi başınıza yeniden yazmanız gerekir .

Bilginize: Sınıfınızın Mod\Mod1\Block\Mainyeniden düzenlenmesi gerekiyor.

Koleksiyonları Layergenişletecek Magento\Catalog\Model\Layerve oynayacak kendi yeni sınıfınızı oluşturun .

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

ve

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

1

Temel olarak başlangıçta bir denetleyici veya hatta temel bir CMS sayfası oluşturmak istersiniz, böylece koleksiyonunuzu gösterecek bir sayfanız olur.

Buradan , ürünleri sayfanızda işlemek için koleksiyonunuzu oluşturan özel bloğunuzu list.phtml şablon dosyasıyla birlikte kullanabilirsiniz.

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

Xml yukarıda ekle Satıcı \ Modülü \ Blok \ ProductCollection koleksiyonunuzu bu sayfa için xml için oluşturulan özel blok kodudur.

List.phtml dosya kod sınırının altında birlikte bloktan koleksiyonu toplar:

$_productCollection = $block->getLoadedProductCollection();

Yani sürece blok olduğu gibi getLoadedProductCollection () ürünlerin koleksiyonunuzu dönen fonksiyonu list.phtml Ardından dosya koleksiyonunda her ürün üzerinden döngü varsayılan bir Magento ürün ızgara onları render edecek.

Blok kodunuz için getItems () öğesini eklemek için aşağıdaki satırı güncellemeyi deneyin :

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

Söylediğin gibi yaptım. Bloğum, 'ProductRepositoryInterface :: getList ()' döndüren 'getLoadedProductCollection ()' işlevine sahiptir. Ama bir hata alıyorum: Yakalanmayan Hata: Magento \ Framework \ Api \ SearchResults :: count () içindeki tanımlanmamış yönteme çağrı ... Bu doğru yaklaşım değil gibi görünüyor.
Blackpanther0001

güncellenmiş yayını görmek
Blackpanther0001

Belki $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir getItems ile denediniz mi?
harri

Çalışmıyor. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); ProductInterface [] dizisini döndürür ve bu dizinin count () işlevi yoktur. Yakalanmayan Hata: Dizide bir üye işlev sayısı () çağrısı ... \ list.phtml satır 22'de. List.phtml adresindeki 22 satırında: $ _productCollection-> count ()
Blackpanther0001

-1

Phtml dosyanızda ürün koleksiyonunu şu şekilde oluşturabilirsiniz

$ product_collection = $ block-> getLoadedProductCollection ();


Hiç yardımcı
olmadı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.