Mã dưới đây áp dụng cho Magento 2.2.5.
Trước hết, trong thanh bên, tất cả các phạm vi có thể cho tất cả các bộ lọc có thể cần phải được tạo. Ngoài ra, với điều này, bạn sẽ có cái nhìn tổng quan về số lượng sản phẩm được tìm thấy trong phạm vi nhất định.
Ví dụ: tôi sẽ tập trung vào việc sử dụng một bộ lọc: giá cả.
Trước bất cứ điều gì khác, để một thuộc tính sản phẩm nhất định đủ điều kiện cho điều hướng lớp, nó phải được cấu hình đúng.
Để kiểm tra, duyệt trong quản trị viên Stores -> Attribute -> Product
, sau đó chọn thuộc tính price và quan sát rằng trong Storefront Properties
tab,
Use in Layered Navigation
được đặt thànhFilterable (with results)
Trên hình ảnh này, chúng tôi thấy rằng đối với bộ lọc giá, chúng tôi thấy phạm vi từ 50.00-59.99
chứa 10
kết quả và 80+
chỉ dành cho 1
.
Khung nhìn này được tạo ra bên trong
/vendor/magento/theme-frontend-luma/Magento_LayeredNavigation/templates/layer/view.phtml
Có một mã tương tự như
<?php foreach ($block->getFilters() as $filter): ?>
<?php if ($filter->getItemsCount()): ?>
Mà cuối cùng xếp chồng lên đến
private function prepareData($key, $count)
và đây là một phương pháp từ
vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php
Vì vậy, chúng tôi đã xác định lớp chịu trách nhiệm lọc giá và chúng tôi thấy nó đã được sử dụng để sản xuất các phạm vi có sẵn.
Ngăn xếp quan trọng hơn là kiểm tra những gì xảy ra khi một phạm vi cụ thể được chọn.
Ví dụ: tôi sẽ nhấp vào phạm vi 40,00-49,99, dự kiến sẽ trả về 4 kết quả.
Đầu tiên là phương pháp _prepareLayout()
từ
/vendor/magento/module-layered-navigation/Block/Navigation.php
Mã là
protected function _prepareLayout()
{
foreach ($this->filterList->getFilters($this->_catalogLayer) as $filter) {
$filter->apply($this->getRequest());
}
$this->getLayer()->apply();
return parent::_prepareLayout();
}
Về bản chất, điều này nói rằng, hãy cho tôi tất cả các bộ lọc và thuyết minh về chúng apply
.
Bây giờ, một mình getFilters (), cuối cùng dẫn đến việc xây dựng một đối tượng từ
vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php
Một bước gọi đó dẫn đến sự __construct
của Price
là
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;
}
Và đây là mã từ
vendor/module-catalog/Model/Layer/FilterList.php
Dù sao, nếu chúng ta tập trung trở lại $filter->apply($this->getRequest());
mã từ phía trên, điều này có nghĩa là mã này sẽ được thực thi
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;
}
và một lần nữa, mã này là từ
vendor/magento/module-catalog-search/Model/Layer/Filter/Price.php
Nếu tôi theo sát các giá trị biến, một lần nữa, cho rằng tôi đã chọn phạm vi 40,00-49,99, thì đó $filter
là sự kết hợp mảng của hai phần tử: [0 => 40, 1 => 50]
Sau khi dòng này được thực thi
list($from, $to) = $filter;
Rõ ràng, $from
biến bây giờ là 40, và $to
biến bây giờ là 50.
Dòng tiếp theo là rất quan trọng
$this->getLayer()->getProductCollection()->addFieldToFilter(
'price',
['from' => $from, 'to' => empty($to) || $from == $to ? $to : $to - self::PRICE_DELTA]
);
Đây là nơi bộ sưu tập đã có mặt được liên kết với Lớp, được giảm thêm bằng cách gọi addFieldToFilter()
.
Có lẽ, đây là nơi cần chú ý để phát hiện lỗi, nếu có.
Cuối cùng, chương trình gọi getLoaded ProducttCollection () từ
vendor/magento/module-catalog/Block/Product/ListProduct.php
mà trong hoàn hảo trả về bộ sưu tập được bảo vệ mà đối tượng này gói gọn.
Magento là một ứng dụng phức tạp.
Trong một lần nhấp chuột duy nhất đã chọn một phạm vi giá duy nhất, chúng tôi đã thấy mã từ ba mô-đun khác nhau tương tác
- mô-đun danh mục
- mô-đun-danh mục tìm kiếm
- mô-đun lớp điều hướng
Nó có thể cảm thấy áp đảo tại các thời điểm, nhưng dường như với tôi, có một sức mạnh tổng hợp tốt đẹp giữa các mô-đun này.
Cảm ơn bạn đã đọc. Tôi hy vọng điều này không giải thích và bây giờ bạn đã được trang bị hiểu biết tốt hơn một chút về điều hướng lớp.