Magento 2 - सूची.phtml के माध्यम से कस्टम उत्पाद संग्रह प्रस्तुत करना


16

एक श्रेणी पृष्ठ (फ्रंटएंड) के उत्पाद ग्रिड को कैटलॉग_कैटरोरी_व्यू.एक्सएमएल में लेआउट के माध्यम से प्रस्तुत किया गया है

कहते हैं कि मेरे पास एक कस्टम उत्पाद संग्रह है (जो मुझे मिला

ProductRepositoryInterface::getList($searchCriteria) method

एक कस्टम ब्लॉक वर्ग में और इस संग्रह को प्रस्तुत करना चाहते हैं। प्रदान किए गए परिणाम को फ्रंटएंड पर उत्पाद ग्रिड के रूप में प्रदर्शित किया जाना चाहिए (किसी भी श्रेणी पृष्ठ की तरह)।

यह कैसे किया जा सकता है ?

में देख कर catalog_category_view.xmlदो महत्वपूर्ण लाइनों, जो एक उत्पाद संग्रह प्रतिपादन के लिए जिम्मेदार हैं देखते हैं:

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

मैं इन टेम्पलेट फ़ाइलों को अपना कस्टम उत्पाद संग्रह कैसे प्रदान कर सकता हूं, इसलिए वे मेरे संग्रह को प्रस्तुत करते हैं?

मुझे सही करें, अगर मैं इस पर गलत हूं।

इस तरह मेरा ब्लॉक कोड दिखता है:

<?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
क्या आप पूछ रहे हैं कि श्रेणी पृष्ठ पर उत्पादों को कैसे बदलें या अनिवार्य रूप से श्रेणी नियंत्रक का दूसरा संस्करण कैसे हो?
जोश डेवनपोर्ट

यदि आप list.phtml या संबंधित ब्लॉक में संग्रह संपादित करते हैं, तो पृष्ठांकन और परत नेविगेशन कभी भी सही नहीं होता है। इसलिए सुनिश्चित करें कि आप जिस उत्तर को स्वीकार कर रहे हैं, वह ऊपर की दोनों चीजों को करता है।
विवेक कुमार

जवाबों:


1

आप यह कोशिश कर सकते हैं:

अपनी सूचीपत्र_श्रेणी_व्यू। 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>

और yourFile.phtml को उत्पाद / list.phtml में कॉल करें:

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

अब, आप इस तरह से अपने फ़ंक्शन का उपयोग अपने ffile.phtml में कर सकते हैं:

$block->yourfunction();

उदाहरण:

$block->getLoadedProductCollection();

आशा है इससे आपको सहायता मिलेगी।


1

सबसे अच्छा तरीका होगा:

अद्यतन अपने catalog_category_view.xmlऔर की जगह Magento\Catalog\Block\Product\ListProductके साथMod\Mod1\Block\Main

इससे पहले:

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

उपरांत:

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

आपका Mainवर्ग जरूरी हैMagento\Catalog\Block\Product\ListProduct

फिर आपको getLayer()अपनी खुद की विधि को फिर से लिखना होगा ।

FYI करें: आपकी कक्षा Mod\Mod1\Block\Mainको कुछ रिफैक्टिंग की आवश्यकता है।

अपनी खुद की नई Layerकक्षा बनाएँ, Magento\Catalog\Model\Layerजो संग्रह के साथ विस्तार और खेल करेगी ।

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

तथा

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

1

मूल रूप से शुरू में आप एक नियंत्रक या एक मूल सीएमएस पृष्ठ बनाना चाहते हैं ताकि आपके पास अपना संग्रह दिखाने के लिए एक पृष्ठ हो।

वहां से आप अपने कस्टम ब्लॉक का उपयोग कर सकते हैं जो आपके पेज पर उत्पादों को प्रस्तुत करने के लिए list.phtml टेम्पलेट फ़ाइल के साथ अपने संग्रह को बनाता है ।

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

Xml के ऊपर जोड़ें जहाँ Vendor \ Module \ Block \ ProductCollection कस्टम ब्लॉक कोड है जहाँ आपका संग्रह उस पेज के लिए xml में बनाया गया है।

List.phtml फ़ाइल कोड की रेखा से नीचे के साथ अपने ब्लॉक से संग्रह बटोरता:

$_productCollection = $block->getLoadedProductCollection();

जब तक आपके ब्लॉक में getLoadedProductCollection () फ़ंक्शन है, तब उत्पादों के आपके संग्रह को list.phtml फ़ाइल लौटाती है, तब आपके उत्पाद के माध्यम से आपके संग्रह में प्रत्येक उत्पाद के माध्यम से एक डिफ़ॉल्ट Magento उत्पाद ग्रिड में लूप होगा।

अपने ब्लॉक कोड के लिए getItems () को शामिल करने के लिए नीचे की पंक्ति को अपडेट करने का प्रयास करें :

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

आपने जैसा कहा था मैंने वैसा ही किया। मेरे ब्लॉक में 'getLoadedProductCollection ()' फंक्शन है जो 'ProductRepositoryInterface :: getList ()' लौटाता है। लेकिन मुझे एक त्रुटि मिलती है: अनकवर्ड एरर: अपरिभाषित विधि पर कॉल करें Magento \ Framework \ Api \ SearchResults :: count () में ... ऐसा लगता है कि यह सही दृष्टिकोण नहीं है।
ब्लैकपैंथर0001 14

अद्यतन पोस्ट देखें
ब्लैकपैंथर 0001 14

हो सकता है कि $ सूची बदलने की कोशिश करें = $ यह -> _ उत्पादप्रकारक-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir क्या आपने getItems के साथ प्रयास किया?
१३

काम नहीं कर रहा। $ सूची = $ यह -> _ उत्पादप्रदान -> गेटलिस्ट ($ सर्चक्रिट) -> getItems (); ProductInterface [] सरणी देता है और इस सरणी की कोई गणना नहीं है () मज़ा है। अनक्रेड्ड एरर: एक सदस्य फंक्शन काउंट पर कॉल करें () एरे पर ... \ list.phtml ऑन लाइन 22. लिस्ट में लाइन 22 पर। एफटीएमएल हमारे पास: $ _productCollection-> काउंट ()
Blackpanther004

-1

आप इस तरह से अपनी phtml फ़ाइल में उत्पाद संग्रह प्रस्तुत कर सकते हैं

$ product_collection = $ block-> getLoadedProductCollection ();


बिल्कुल भी मददगार नहीं है
Blackpanther0001
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.