नीचे दिया गया कोड 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 एक जटिल अनुप्रयोग है।
इसमें उन सिंगल क्लिक को चुना गया है जो कीमतों की एक एकल श्रेणी का चयन करते हैं, हमने तीन अलग-अलग मॉड्यूल से कोड को देखा
- मॉड्यूल-सूची
- मॉड्यूल-सूची-खोज
- मॉड्यूल स्तरित नेविगेशन
यह क्षणों पर भारी लग सकता है, लेकिन यह मुझे लगता है, इस मॉड्यूल के बीच एक अच्छा तालमेल है।
पढ़ने के लिए धन्यवाद। मुझे आशा है कि यह व्याख्या करता है और अब आप स्तरित नेविगेशन की थोड़ी बेहतर समझ से लैस हैं।