ম্যাজেন্টো 2: স্তরযুক্ত নেভিগেশনের জন্য কীভাবে মুখযুক্ত ডেটা কাজ করে?


10

আমি বিভাগ পৃষ্ঠাতে কাস্টম ফিল্টারের জন্য মডিউল তৈরি করেছি স্তরযুক্ত নেভিগেশনে দামের সীমা বাদে প্রতিটি জিনিসই ঠিকঠাক কাজ করছে।

দয়া করে কেউ আমাকে কীভাবে ব্যাখ্যা করতে পারেন যে getgetedData ('দাম') magento2 এ কীভাবে কাজ করে

$productCollection->getFacetedData('price');

এই ফাংশনটি আমার ফিল্টারকৃত সংগ্রহের ভিত্তিতে নয় ডিফল্ট পণ্য সংগ্রহের ভিত্তিতে দামের সীমা দেয়।

এফওয়াইআই: আমি সংগ্রহটি নীচের মতো ফিল্টার করেছি,

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

উত্তর:


7

নীচের কোডটি ম্যাজেন্টো ২.২.৫ এ প্রযোজ্য।

প্রথমে, সাইডবারে, সমস্ত সম্ভাব্য ফিল্টারগুলির জন্য সমস্ত সম্ভাব্য ব্যাপ্তি উত্পাদন করা দরকার। অতিরিক্তভাবে, এটিতে, আপনার দেওয়া রেঞ্জের মধ্যে পাওয়া পণ্য গণনার সংক্ষিপ্তসার থাকবে।

এখানে চিত্র বর্ণনা লিখুন

উদাহরণস্বরূপ, আমি একটি ফিল্টার ব্যবহারের দিকে মনোনিবেশ করব: দাম।

অন্য যে কোনও কিছুর আগে, কোনও প্রদত্ত পণ্যের গুণাবলী স্তরযুক্ত নেভিগেশনের জন্য যোগ্য হওয়ার জন্য, এটি সঠিকভাবে কনফিগার করা উচিত।

চেক করতে Stores -> Attribute -> Product, অ্যাডমিনটিতে ব্রাউজ করুন, তারপরে দামের বৈশিষ্ট্যটি নির্বাচন করুন এবং তা Storefront Propertiesট্যাবটিতে পর্যবেক্ষণ করুন Use in Layered NavigationtoFilterable (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)

এবং এটি একটি পদ্ধতি is

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 50

পরের লাইনটি অত্যন্ত গুরুত্বপূর্ণ

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

ইতিমধ্যে স্তরটির সাথে সম্পর্কিত ইতিমধ্যে উপস্থিত সংগ্রহটি কল করে আরও কমে যায় addFieldToFilter()

সম্ভবত, এই জায়গাতেই বাগগুলি সনাক্ত করার জন্য মনোযোগ দেওয়া উচিত any

শেষ পর্যন্ত, প্রোগ্রামটি getLoadedProduct Colલેક્શન () থেকে কল করে

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

যা কার্যকরভাবে এই অবজেক্টটি আবদ্ধ করা সুরক্ষিত সংগ্রহ প্রদান করে।


ম্যাজেন্টো একটি জটিল অ্যাপ্লিকেশন।

এইগুলিতে একক ক্লিক যা দামের একক পরিসীমা নির্বাচন করেছে, আমরা তিনটি পৃথক মডিউল ইন্টারঅ্যাক্ট করার কোড দেখেছি

  • মডিউল-ক্যাটালগ
  • মডিউল-ক্যাটালগ-অনুসন্ধান
  • মডিউল-স্তরপূর্ণ-গৌণ

মুহুর্তগুলিতে এটি অপ্রতিরোধ্য বোধ করতে পারে তবে এটি আমার কাছে মনে হয়, এই মডিউলগুলির মধ্যে একটি দুর্দান্ত সমন্বয় রয়েছে।

পড়ার জন্য আপনাকে ধন্যবাদ. আমি আশা করি এটি ব্যাখ্যা করে এবং আপনি এখন স্তরযুক্ত নেভিগেশন কিছুটা ভাল বোঝার সাথে সজ্জিত।


খুব বিস্তারিত এবং সুন্দরভাবে উত্তরের জন্য +1। যাইহোক, আপনি কীভাবে মুখযুক্ত ডেটাগুলি কাজ করে তা ব্যাখ্যা করেননি ... মুখযুক্ত ডেটা ফিল্টার গণনা তৈরি করতে ব্যবহৃত হয়।
ইয়োন ট্রিমোরো

হাই @ মারজান, আমার ক্ষেত্রে তৃতীয় স্তরের বিভাগটি ফিল্টারে প্রদর্শিত হচ্ছে না, এখানে আমার প্রশ্ন, magento.stackexchange.com/Qes/270442/…
জাফর পিনজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.