Magento 2: Làm thế nào dữ liệu mặt hoạt động cho điều hướng lớp?


10

Tôi đã tạo mô-đun cho bộ lọc tùy chỉnh trên trang danh mục, mọi thứ đều hoạt động tốt, ngoại trừ phạm vi giá trong điều hướng lớp.

Xin mọi người có thể giải thích cho tôi cách getFacaveData ('price') hoạt động trong magento2

$productCollection->getFacetedData('price');

Hàm này cung cấp cho tôi phạm vi giá dựa trên bộ sưu tập sản phẩm mặc định không dựa trên bộ sưu tập được lọc của tôi.

FYI: Tôi đã lọc bộ sưu tập như dưới đây,

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

Câu trả lời:


7

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.

nhập mô tả hình ảnh ở đây

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 Propertiestab, 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.99chứa 10kế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ự __constructcủa 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;
}

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ì đó $filterlà 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, $frombiến bây giờ là 40, và $tobiế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.


+1 cho câu trả lời rất chi tiết và độc đáo. Tuy nhiên, bạn không giải thích cách dữ liệu mặt hoạt động ... Dữ liệu mặt được sử dụng để tạo số lượng bộ lọc.
Yonn Trimoreau

xin chào @Marjan, trong trường hợp của tôi, danh mục cấp ba không hiển thị trong bộ lọc, đây là câu hỏi của tôi, magento.stackexchange.com/questions/270442/ Lỗi
jafar pinjar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.