아래 코드는 Magento 2.2.5에 적용됩니다.
먼저 사이드 바에서 가능한 모든 필터에 대해 가능한 모든 범위를 생성해야합니다. 또한 여기에는 주어진 범위 내에서 발견 된 제품 수에 대한 개요가 있습니다.
예를 들어 가격이라는 필터를 사용하는 데 중점을 둘 것입니다.
다른 제품보다 먼저 지정된 제품 속성이 계층 탐색에 적합하도록하려면 올바르게 구성해야합니다.
확인하려면 관리자에서 Stores -> Attribute -> Product
를 찾은 다음 가격 속성을 선택하고 Storefront Properties
탭
Use in Layered Navigation
에서Filterable (with results)
이 그림에서 가격 필터의 경우 범위 50.00-59.99
에 10
결과 가 포함 된 것을 볼 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
그 리드받는 호출 단계 __construct
의 Price
IS
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
사실상이 개체가 캡슐화하는 보호 된 컬렉션을 반환합니다.
마 젠토는 복잡한 응용 프로그램입니다.
이 단일 클릭에서 단일 범위의 가격을 선택하면 세 가지 다른 모듈의 코드가 상호 작용하는 것을 볼 수 있습니다
- 모듈 카탈로그
- 모듈 카탈로그 검색
- 모듈 계층 탐색
그것은 순간에 압도적 인 느낌이 들지만,이 모듈 사이에는 좋은 시너지 효과가있는 것 같습니다.
읽어 주셔서 감사합니다. 이것이 설명되기를 바랍니다. 이제 계층 탐색에 대해 약간 더 잘 이해할 수 있습니다.