Magento 2: Katmanlı navigasyon için yönlü veriler nasıl çalışır?


10

Katmanlı gezinti fiyat aralığı dışında her şey iyi çalışıyor kategori sayfasında özel filtre modülü oluşturduk.

Lütfen kimse bana getFacetedData ('price') magento2 içinde nasıl çalıştığını açıklayabilir

$productCollection->getFacetedData('price');

Bu işlev, filtrelenmiş koleksiyonuma dayanmayan varsayılan ürün koleksiyonuna göre fiyat aralıkları verir.

Bilginize: Koleksiyonu aşağıdaki gibi filtreledim,

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

Yanıtlar:


7

Aşağıdaki kod Magento 2.2.5 için geçerlidir.

Öncelikle, kenar çubuğunda, olası tüm filtreler için tüm olası aralıkların üretilmesi gerekir. Buna ek olarak, verilen aralıkta bulunan ürün sayısına genel bakışınız olacaktır.

resim açıklamasını buraya girin

Örneğin, bir filtre kullanmaya odaklanacağım: fiyat.

Başka bir şeyden önce, belirli bir ürün özelliğinin katmanlı gezinmeye uygun olması için düzgün yapılandırılması gerekir.

Amacıyla yönetici de, browse kontrol etmek Stores -> Attribute -> Product, ardından fiyat özelliği seçip o gözlemlemek Storefront Propertiessekmesine, Use in Layered NavigationayarlandığındaFilterable (with results)

Bu resimde, fiyat filtresi için, yalnızca ve sonuçları 50.00-59.99içeren aralığın görüldüğünü görüyoruz .1080+1

Bu görüş içeride üretilir

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

Şuna benzer bir kod var:

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

Hangi sonunda birikir

private function prepareData($key, $count)

ve bu bir yöntem

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

Bu nedenle, fiyat filtrelemeden sorumlu sınıfı belirledik ve mevcut aralıkları üretmek için zaten kullanıldığını görüyoruz.


Daha önemli olan yığın, belirli bir aralık seçildiğinde ne olacağını kontrol etmektir.

Örneğin, 4 sonuç döndürmesi beklenen 40.00-49.99 aralığına tıklayacağım.

Birincisi _prepareLayout(),

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

Kod

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

Özünde, bu, bana tüm filtreleri getir ve onlardan her şeyi yap apply.

Şimdi, getFilters () tek başına, sonunda bir nesnenin oluşturulmasına yol açar.

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

O kurşunları bir çağrıda adım __constructait PriceDİR

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

Ve bu kod

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

Her neyse, $filter->apply($this->getRequest());yukarıdan koda geri odaklanırsak , bu kodun çalıştırılacağı anlamına gelir

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

ve tekrar, bu kod

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

Değişken değerlerini yakından takip edersem, 40.00-49.99 aralığını seçtiğim göz önüne alındığında $filter, iki öğeden oluşan dizi dikkate alınır: [0 => 40, 1 => 50]

Bu satır yürütüldükten sonra

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

Açıkçası, $fromdeğişken şimdi 40 ve $todeğişken şimdi 50'dir.

Bir sonraki satır çok önemli

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

Katman ile ilişkilendirilmiş halihazırda mevcut olan koleksiyon addFieldToFilter(),.

Belki de, eğer varsa, hataları tespit etmek için dikkat edilmesi gereken yer burasıdır.

Sonunda, program getLoadedProductCollection () öğesini

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

efect'te bu nesnenin kapsadığı korumalı koleksiyonu döndürür.


Magento karmaşık bir uygulamadır.

Tek bir fiyat aralığını seçen tek tıklamayla, üç farklı modülden gelen kodun etkileşime girdiğini gördük

  • Modül-katalog
  • Modül-katalog arama
  • Modül tabakalı navigasyon

Anlarda bunaltıcı gelebilir, ama bana öyle geliyor ki, bu modüller arasında hoş bir sinerji var.

Okuduğunuz için teşekkürler. Umarım bu açıklar ve artık katmanlı navigasyonu daha iyi anlamanıza yardımcı olursunuz.


Çok ayrıntılı ve güzel açıklanmış cevap için +1. Ancak, yönlü verilerin nasıl çalıştığını açıklamıyorsunuz ... Yönlü veriler filtre sayıları oluşturmak için kullanılır.
Yonn Trimoreau

merhaba @Jarjan, benim durumumda üçüncü seviye kategorisi filtrede gösterilmiyor, işte benim sorum, magento.stackexchange.com/questions/270442/…
jafar pinjar
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.