Magento 2에서 고급 배송 제한 설정

게시 됨: 2017-05-17

이 기사에서는 특정 조건이 적용될 때 배송 방법을 숨기는 방법에 대해 설명합니다.

일부 시나리오에서 상점 소유자는 다음과 같은 이유로 배송 옵션을 제한할 수 있습니다.

  • 제품의 치수무게 가 크기 때문에 표준 방식으로 배송될 수 없습니다.
  • 냉동 보관 상태 로 인해 제품을 제 시간에 배송할 수 없습니다.
  • 고객의 위치 (국가, 지역, 도시 )로 인해 배송이 제한됩니다.
  • C art Total 은 구매자가 배송 제안을 받을 수 있는 자격을 허용하지 않습니다.
  • 등.

Magento 배송 옵션의 기본 선택은 많은 유연성을 제공하지 않습니다. 특정 카운티 및 지역 또는 장바구니 합계가 설정 금액 미만인 경우에만 배송을 제한할 수 있습니다.

이것이 충분하지 않다고 생각되면 계속 읽으십시오.

비즈니스 모델, 목표 및 조건에 따라 배송 옵션을 제한할 수 있는 플러그인을 만드는 방법을 알려 드리겠습니다.

노트

Magento 2용 확장을 만드는 데 필요한 특정 단계를 거치지 않을 것입니다. 여기 또는 여기에서 수행하는 방법을 볼 수 있습니다.

주어진 배송 방법을 동적으로 비활성화하려면 확장에 새로운 클래스 세트가 필요합니다. 이것은 2개의 플러그인 입니다. 1차 배송 방법 유효성 검사, 2차 필터링을 담당합니다.

간단히 말해서 유효성 검사를 통과하지 못한 모든 메서드는 " is_disabled "로 표시되고 다음 단계에서 모든 " is_disabled " 메서드는 필터링되어 기본 목록에서 삭제됩니다.

하자 롤.

* 내가 설명할 접근 방식은 Shipping Suite 확장에 사용된 원칙을 기반으로 하므로 공급업체 이름 'Mageworx'와 확장 이름 'ShippingRules'를 사용하겠습니다. 노트! 오류를 방지하려면 해당 오류를 자신의 이름으로 바꿔야 합니다!

먼저 필터링에 사용할 플러그인(클래스)을 만들어 보겠습니다. 방법은 다음과 같습니다.

 > MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append 
 네임스페이스 MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result;

클래스 추가
{
    /**
     * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote
     */
    보호된 $세션;

    /**
     * @param \Magento\Checkout\Model\Session $checkoutSession
     * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession
     * @param \Magento\Framework\App\State $state
     * @internal param 세션 $session
     */
    공개 함수 __construct(
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Backend\Model\Session\Quote $backendQuoteSession,
        \Magento\Framework\App\State $state
    ) {
        if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
            $this->세션 = $backendQuoteSession;
        } 또 다른 {
            $this->세션 = $checkoutSession;
        }
    }

    /**
     * 추가하기 전에 각 배송 방법을 확인하십시오.
     * 유효성 검사에 성공한 경우 규칙 작업을 적용합니다.
     * 일부 규칙을 비활성화로 표시할 수 있습니다. 비활성화된 규칙은 클래스에서 제거됩니다.
     * @MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates 참조
     * 요금 개체에서 이 표시의 값을 확인합니다.
     *
     * 참고: 규칙 및 배송 방법에 문제가 있는 경우 여기에서 디버깅을 시작하십시오.
     *
     * @param \Magento\Shipping\Model\Rate\Result $subject
     * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result
     * @return 배열
     */
    public 함수 beforeAppend($subject, $result)
    {
        if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
            반환 [$ 결과];
        }

        $filtableMethods = [
            'flatrate_flatrate',
            'ups_XDM',
            '업스_XPR',
            'ups_WXS',
            '캐리어_메서드',
            // ... 여기에 메소드 코드 추가
        ];
        $methodCode = $result->getCarrier() . '_' . $결과->getMethod();
        if (!in_array($methodCode, $filtableMethods)) {
            반환 [$ 결과];
        }

        /** @var \Magento\Quote\Model\Quote $quote */
        $quote = $this->session->getQuote();
        $quoteItems = $quote->getAllItems();
        $heavyWeightFlag = 거짓;
        foreach($quoteItems를 $item으로) {
            if ($item->getWeight() > 100) {
                $heavyWeightFlag = 사실;
                계속하다;
            }
        }

        if ($heavyWeightFlag == true) {
            $result->setIsDisabled(true);
        }

        반환 [$ 결과];
    }
}

플러그인 본문에서 3가지 검사를 실행합니다.

1.

!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method

– 진입 지점에서 우리가 필요로 하는 것을 얻도록 합니다. 즉, 배송 방법의 인스턴스입니다. 그렇지 않은 경우에는 그대로 반환합니다.

2.

 !in_array($methodCode, $filtableMethods)

– 다음으로 필터링할 메소드 목록에서 현재 메소드가 있는지 확인합니다. 그렇지 않은 경우 그대로 반환합니다.

삼.

 $heavyWeightFlag == 참

– 마지막이자 주요 확인입니다. 플래그가 실제 값에 적용되면 현재 메서드가 비활성화됩니다. $result->setIsDisabled(true);

장바구니에 추가되고 중량이 100 표준 단위(파운드 또는 킬로)를 초과하는 제품을 하나 이상 필터링하려고 합니다.
필터링에 사용할 수 있는 방법은 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' 입니다. 그것들은 하드 코딩되어 $filtableMethods 배열에 저장됩니다.

우리는 일반적으로 운송업체 코드 ($result->getCarrier()) “ _” .

수표에 필요한 제품은 현재 고객의 견적에서 직접 가져옵니다.
노트

배열 클래스 생성자의 약간의 코드를 사용하면 프런트엔드와 백엔드 모두에서 견적을 정의할 수 있습니다(주문이 관리자 패널에서 생성된 경우).

\Magento\Framework\App\State를 사용하여 현재 어느 영역에 있는지 확인하고 필요한 견적을 선택할 수 있습니다.
1. \Magento\Backend\Model\Session\Quote for Admin
2. 프론트엔드용 \Magento\Checkout\Model\Session

그게 다야!

이제 배송 방법을 검증할 수 있고 다음 단계로 진행할 수 있습니다. 즉, 조건에 따라 잘못된 배송 방법을 비활성화하기 위한 플러그인을 생성합니다.

방법은 다음과 같습니다.

 > MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates 
 /**
 * 저작권 2016 MageWorx. 판권 소유.
 * 라이선스에 대한 자세한 내용은 LICENSE.txt를 참조하십시오.
 */

네임스페이스 MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result;

클래스 GetAllRates
{

    /**
     * 표시된 배송료를 비활성화합니다.
     *
     * 참고: 일부 배송료가 표시되지 않으면 여기에서 디버깅을 시작하세요. 먼저 'is_disabled'를 확인하십시오.
     * 배송료 개체의 매개변수입니다.
     *
     * @param \Magento\Shipping\Model\Rate\Result $subject
     * @param 배열 $result
     * @return 배열
     */
    공개 함수 afterGetAllRates($subject, $result)
    {
        foreach($key => $rate로 $result) {
            if ($rate->getIsDisabled()) {
                설정되지 않은($결과[$키]);
            }
        }

        $ 결과 반환;
    }
}

이 플러그인은 사용 가능한 모든 배송 방법 데이터를 가져오고 각각을 확인하는 데 사용됩니다. 메소드 중 일부에 "is_disabled" 표시가 있는 경우 목록에서 제외하면 유효성 검사기에서 생성된 조건에 해당하는 메소드만 볼 수 있습니다. 이러한 방법은 웹사이트의 모든 페이지(장바구니의 예상 배송 블록 또는 체크아웃 페이지)에서 제외됩니다.

이제 플러그인이 어떻게 작동하는지 확인하려면 파일에 플러그인을 등록해야 합니다.

> MageWorx/ShippingRules/etc/di.xml 
 <?xml 버전="1.0"?>
<config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <유형 이름="Magento\Shipping\Model\Rate\Result">
        <플러그인 이름="mageworx_shippingrules_update_rate_result"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append"
                정렬 주문 = "10"
                비활성화="거짓"/>
        <플러그인 이름="mageworx_shippingrules_update_disabled_or_enabled_rates"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates"
                정렬 주문 = "11"
                비활성화="거짓"/>
    </유형>
</구성>

노트

설명을 위해 플러그인은 2개의 다른 클래스로 나뉩니다. 일반적인 시나리오에서는 1개의 클래스만 사용하여 Magento\Shipping\Model\Rate\Result 클래스의 2가지 다른 메서드를 수정할 수 있습니다.

왜 이런 식으로 작동합니까?

Magento\Shipping\Model\Rate\Result 는 배송 방법 처리를 담당하는 기본 Magento 2 클래스입니다. getAllRates 메소드는 배송 방법 목록을 가져오는 데 사용됩니다.

한편, 배송 방법 추가는 일반적으로 '추가' 방법을 사용하여 수행됩니다. 메서드를 추가하는 동안 유효성을 검사하고 컬렉션에서 제외하면 유효한 메서드 목록을 얻을 수 있습니다.

유효성 검사 자체도 수정할 수 있습니다.

확장 프로그램에는 다양한 조건(예: store_id, customer_group_id, 날짜 시작/끝, 요일 등 )을 가진 사용자 정의 필터 모음을 저장하는 큰 특수 클래스가 있습니다. 또한 배송 방법에 적용해야 하는 작업 모음이 있는 별도의 클래스가 있습니다(예: 활성화 또는 비활성화, 다른 조건에 따라 비용 재작성, 추가 비용 또는 할인 추가 등 ).

디버그에서 첫 번째 플러그인의 결과는 다음과 같습니다(무게가 1단위인 제품의 경우).
1

장바구니에 표시되는 모습입니다(무게 제한을 초과하지 않았기 때문에 ups_WXS는 계속 사용 가능합니다).

2

단, 상품 중량을 101로 변경하면 다음과 같은 배송 방법을 사용할 수 없게 됩니다.

삼

목록에서 제외하면 다시 사용할 수 있습니다.
4

5

결제 시:

f3d3cac03678318af2d569d757fc7e79

노트

다음 코드에서 바로 사용 가능한 모든 시스템 배송 방법 목록을 얻을 수 있습니다.

 /**
 * 반송파 배열을 반환합니다.
 * $isActiveOnlyFlag가 true로 설정되면 활성 이동통신사만 반환됩니다.
 *
 * @param bool $isActiveOnlyFlag
 * @return 배열
 */
공개 함수 getAvailableMethods($isActiveOnlyFlag = false)
{
    $carriers = $this->shippingConfig->getAllCarriers();
    foreach ($carriers as $carrierCode => $carrierModel) {
        if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) {
            계속하다;
        }
        $carrierMethods = $carrierModel->getAllowedMethods();
        if (!$carrierMethods) {
            계속하다;
        }
        foreach ($carrierMethods as $methodCode => $methodTitle) {
            $methods[] = $carrierCode . '_' . $ 메소드 코드;
        }
    }

    반환 !empty($methods) ? $메소드: [];
}

여기서 `$this->shippingConfig``Magento\Shipping\Model\Config` 클래스의 인스턴스입니다. 이 코드를 사용하여 확장 설정에서 배송 방법 선택기에 대한 소스 모델을 만들 수 있습니다(따라서 플러그인에서 하드 코딩할 필요가 없음).

그리고 마지막으로 중요합니다.

배송 방법을 비활성화하기 위한 확장 프로그램을 만들고 싶지 않다면 Magento 2용 Shipping Suite 솔루션을 사용할 수 있습니다.

확장 프로그램을 사용하면 몇 번의 마우스 클릭만으로 필요할 때마다 배송 방법을 제외할 수 있습니다.
1. 다음 조건으로 새 배송 규칙을 생성합니다.

8

2. 목록에서 배송 방법 숨기기 작업을 선택하고 비활성화할 방법을 선택합니다.

9

노트

조건 목록에서 'weight' 속성을 찾을 수 없는 경우 프로모션 규칙에서 사용할 수 있는지 확인하세요.

10

확장 프로그램 을 더욱 개선하는 방법에 대한 질문이나 아이디어가 있는 경우 아래 의견 섹션에서 의견을 공유해 주세요.