마 젠토 2 :다면 데이터의 계층 탐색 방법은?


10

카테고리 페이지에서 맞춤 필터 모듈을 만들었습니다. 계층 탐색의 가격 범위를 제외하고 모든 것이 잘 작동합니다.

누구든지 getFacetedData ( 'price')가 magento2에서 어떻게 작동하는지 설명 할 수 있습니다.

$productCollection->getFacetedData('price');

이 기능은 필터링 된 컬렉션이 아닌 기본 제품 컬렉션을 기준으로 가격 범위를 제공합니다.

참고 : 다음과 같이 컬렉션을 필터링했습니다.

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

답변:


7

아래 코드는 Magento 2.2.5에 적용됩니다.

먼저 사이드 바에서 가능한 모든 필터에 대해 가능한 모든 범위를 생성해야합니다. 또한 여기에는 주어진 범위 내에서 발견 된 제품 수에 대한 개요가 있습니다.

여기에 이미지 설명을 입력하십시오

예를 들어 가격이라는 필터를 사용하는 데 중점을 둘 것입니다.

다른 제품보다 먼저 지정된 제품 속성이 계층 탐색에 적합하도록하려면 올바르게 구성해야합니다.

확인하려면 관리자에서 Stores -> Attribute -> Product를 찾은 다음 가격 속성을 선택하고 Storefront PropertiesUse in Layered Navigation에서Filterable (with results)

이 그림에서 가격 필터의 경우 범위 50.00-59.9910결과 가 포함 된 것을 볼 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)

이 방법은

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

그 리드받는 호출 단계 __constructPriceIS

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입니다.

다음 줄은 중요합니다

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

이것은 레이어와 관련된 이미 존재하는 컬렉션이을 호출하여 더 줄어드는 곳 addFieldToFilter()입니다.

아마도 버그가 있다면이를 감지하기 위해주의를 기울여야 할 곳입니다.

결국 프로그램은 다음에서 getLoadedProductCollection ()을 호출합니다.

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

사실상이 개체가 캡슐화하는 보호 된 컬렉션을 반환합니다.


마 젠토는 복잡한 응용 프로그램입니다.

이 단일 클릭에서 단일 범위의 가격을 선택하면 세 가지 다른 모듈의 코드가 상호 작용하는 것을 볼 수 있습니다

  • 모듈 카탈로그
  • 모듈 카탈로그 검색
  • 모듈 계층 탐색

그것은 순간에 압도적 인 느낌이 들지만,이 모듈 사이에는 좋은 시너지 효과가있는 것 같습니다.

읽어 주셔서 감사합니다. 이것이 설명되기를 바랍니다. 이제 계층 탐색에 대해 약간 더 잘 이해할 수 있습니다.


매우 상세하고 잘 설명 된 답변은 +1입니다. 그러나 패싯 데이터의 작동 방식에 대해서는 설명하지 않았습니다. 패싯 데이터는 필터 수를 생성하는 데 사용됩니다.
Yonn Trimoreau

안녕 @Marjan, 내 경우에는 필터에 표시되지 않는 세 번째 수준 범주입니다, 여기 내 질문 magento.stackexchange.com/questions/270442/…
jafar pinjar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.