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.
Ö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 Properties
sekmesine,
Use in Layered Navigation
ayarlandığındaFilterable (with results)
Bu resimde, fiyat filtresi için, yalnızca ve sonuçları 50.00-59.99
içeren aralığın görüldüğünü görüyoruz .10
80+
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 __construct
ait Price
Dİ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ı, $from
değişken şimdi 40 ve $to
değ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.