Magento 2: स्तरित नेविगेशन के लिए मुखर डेटा कैसे काम करता है?


10

मैंने श्रेणी पृष्ठ पर कस्टम फ़िल्टर के लिए मॉड्यूल बनाया है स्तरित नेविगेशन में मूल्य सीमा को छोड़कर हर चीज ठीक काम कर रही है।

कृपया कोई भी मुझे समझा सकता है कि कैसे magF2 में getFacetedData ('मूल्य') काम करता है

$productCollection->getFacetedData('price');

यह फ़ंक्शन मुझे अपने फ़िल्टर किए गए संग्रह के आधार पर डिफ़ॉल्ट उत्पाद संग्रह के आधार पर मूल्य सीमा देता है।

FYI करें: मैंने नीचे के रूप में संग्रह को फ़िल्टर किया है,

$productCollection = $layer->getProductCollection()
->clear()
->addAttributeToSelect(['name','price'])
->addAttributeToFilter('sku', array('in' => ['sku1','sku2']));

जवाबों:


7

नीचे दिया गया कोड Magento 2.2.5 पर लागू होता है।

सबसे पहले, साइडबार में, सभी संभावित फिल्टर के लिए सभी संभावित श्रेणियों का उत्पादन करने की आवश्यकता है। इसके अतिरिक्त, इसके लिए, आपको दिए गए रेंज के भीतर मिलने वाले उत्पाद की गिनती का अवलोकन करना होगा।

यहां छवि विवरण दर्ज करें

उदाहरण के लिए, मैं एक फ़िल्टर का उपयोग करने पर ध्यान केंद्रित करूंगा: कीमत।

किसी और चीज से पहले, किसी उत्पाद विशेषता के लिए स्तरित नेविगेशन के लिए पात्र होने के लिए, इसे ठीक से कॉन्फ़िगर किया जाना चाहिए।

जांच करने के लिए, व्यवस्थापक में ब्राउज़ करें Stores -> Attribute -> Product, फिर मूल्य विशेषता का चयन करें और Storefront Propertiesटैब में देखें कि Use in Layered Navigationक्या सेट हैFilterable (with results)

इस तस्वीर पर हम देखते हैं कि मूल्य फिल्टर के लिए, हम सीमा को देखते हैं 50.00-59.99जिसमें 10परिणाम हैं, और 80+केवल के लिए 1

यह दृश्य अंदर उत्पन्न होता है

/vendor/magento/theme-frontend-luma/Magento_LayeredNavigation/templates/layer/view.phtml

के समान एक कोड है

<?php foreach ($block->getFilters() as $filter): ?>
    <?php if ($filter->getItemsCount()): ?>

जो अंततः ढेर हो जाता है

private function prepareData($key, $count)

और यह एक विधि है

vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php

तो, हमने उस वर्ग की पहचान की है जो मूल्य फ़िल्टरिंग के लिए जिम्मेदार है, और हम देखते हैं कि यह पहले से ही उपलब्ध रेंज का उत्पादन करने के लिए उपयोग किया गया था।


अधिक महत्वपूर्ण स्टैक यह जांचने के लिए है कि किसी विशेष श्रेणी का चयन होने पर क्या होता है।

उदाहरण के लिए, मैं 40.00-49.99 रेंज पर क्लिक करूंगा, जिसमें 4 परिणाम लौटने की उम्मीद है।

पहले ऊपर से विधि _prepareLayout()है

/vendor/magento/module-layered-navigation/Block/Navigation.php

कोड है

protected function _prepareLayout()
{
    foreach ($this->filterList->getFilters($this->_catalogLayer) as $filter) {
        $filter->apply($this->getRequest());
    }
    $this->getLayer()->apply();
    return parent::_prepareLayout();
}

संक्षेप में, यह कहता है, मुझे सभी फ़िल्टर प्राप्त करें और उनमें से फॉर्चून करें apply

अब, GetFilters () अकेले, से एक वस्तु का निर्माण होता है

vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php

एक बुला कदम है कि करने के लिए सुराग __constructके Priceहै

protected function createAttributeFilter(
    \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute,
    \Magento\Catalog\Model\Layer $layer
) {
    $filterClassName = $this->getAttributeFilterClass($attribute);

    $filter = $this->objectManager->create(
        $filterClassName,
        ['data' => ['attribute_model' => $attribute], 'layer' => $layer]
    );
    return $filter;
}

और यह से कोड है

vendor/module-catalog/Model/Layer/FilterList.php

वैसे भी, अगर हम $filter->apply($this->getRequest());ऊपर से कोड पर ध्यान केंद्रित करते हैं, तो इसका मतलब है कि यह कोड निष्पादित हो जाएगा

public function apply(\Magento\Framework\App\RequestInterface $request)
{
    /**
     * Filter must be string: $fromPrice-$toPrice
     */
    $filter = $request->getParam($this->getRequestVar());
    if (!$filter || is_array($filter)) {
        return $this;
    }

    $filterParams = explode(',', $filter);
    $filter = $this->dataProvider->validateFilter($filterParams[0]);
    if (!$filter) {
        return $this;
    }

    $this->dataProvider->setInterval($filter);
    $priorFilters = $this->dataProvider->getPriorFilters($filterParams);
    if ($priorFilters) {
        $this->dataProvider->setPriorIntervals($priorFilters);
    }

    list($from, $to) = $filter;

    $this->getLayer()->getProductCollection()->addFieldToFilter(
        'price',
        ['from' => $from, 'to' =>  empty($to) || $from == $to ? $to : $to - self::PRICE_DELTA]
    );

    $this->getLayer()->getState()->addFilter(
        $this->_createItem($this->_renderRangeLabel(empty($from) ? 0 : $from, $to), $filter)
    );

    return $this;
}

और फिर, इस कोड से है

vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php

यदि मैं चर मानों का बारीकी से पालन करता हूं, फिर से, यह देखते हुए कि मैंने 40.00-49.99 रेंज का चयन किया है, तो $filterदो तत्वों की सरणी सहमति है: [0 => 40, 1 => 50]

इसके बाद इस लाइन को निष्पादित किया जाता है

list($from, $to) = $filter;

जाहिर है, $fromचर अब 40 है, और $toचर अब 50 है।

अगली पंक्ति निर्णायक है

    $this->getLayer()->getProductCollection()->addFieldToFilter(
        'price',
        ['from' => $from, 'to' =>  empty($to) || $from == $to ? $to : $to - self::PRICE_DELTA]
    );

यह वह जगह है जहां पहले से मौजूद लेयर से संबंधित संग्रह, को कॉल करके और कम हो जाता है addFieldToFilter()

शायद, यह वह जगह है जहां बग का पता लगाने के लिए ध्यान दिया जाना चाहिए, यदि कोई हो।

आखिरकार, प्रोग्राम getLoadedProductCollection () से कॉल करता है

vendor/magento/module-catalog/Block/Product/ListProduct.php

जो कि इस वस्तु को संरक्षित संग्रह में वापस लाता है।


Magento एक जटिल अनुप्रयोग है।

इसमें उन सिंगल क्लिक को चुना गया है जो कीमतों की एक एकल श्रेणी का चयन करते हैं, हमने तीन अलग-अलग मॉड्यूल से कोड को देखा

  • मॉड्यूल-सूची
  • मॉड्यूल-सूची-खोज
  • मॉड्यूल स्तरित नेविगेशन

यह क्षणों पर भारी लग सकता है, लेकिन यह मुझे लगता है, इस मॉड्यूल के बीच एक अच्छा तालमेल है।

पढ़ने के लिए धन्यवाद। मुझे आशा है कि यह व्याख्या करता है और अब आप स्तरित नेविगेशन की थोड़ी बेहतर समझ से लैस हैं।


बहुत विस्तृत और अच्छी तरह से समझाया गया उत्तर के लिए +1। हालाँकि, आपने यह नहीं बताया कि कैसे मुखरित डेटा काम करता है ... मुखरित डेटा का उपयोग फ़िल्टर गणनाओं को उत्पन्न करने के लिए किया जाता है।
यॉन ट्रिमोरो

hi @ मेराजन, मेरे मामले में तीसरे स्तर की श्रेणी जो फ़िल्टर में नहीं दिख रही है, यहाँ मेरा सवाल है, magento.stackexchange.com/questions/270442/…
jafar pinjar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.