조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부)

게시 됨: 2019-12-16

이전 기사에서는 관리자 패널의 인터페이스로 규칙 모델을 생성할 수 있는 코드를 살펴보았습니다. 그것은 모듈의 중요한 부분이었고, 프론트엔드에서 사용하는 방법을 배우지 않으면 그 자체로 쓸모가 없습니다. 따라서 규칙과 조건의 중요성을 파악해야 할 때입니다.

모든 유효성 검사 모델은 개체의 유효성을 검사하는 데 도움이 되는 조건을 상속합니다. 결과적으로 이 유효성 검사를 기반으로 특정 활동을 수행할 수 있습니다. 이 예에서는 장바구니에 'heavy_weight' 속성 값이 1(true)인 항목이 있는지 정의할 수 있는 규칙을 만듭니다. 그러한 품목이 발견되면 '장바구니에 중량이 큰 품목이 있습니다. 배송에 대해 논의하려면 당사에 문의하십시오.'라는 메시지와 함께 블록을 표시합니다. 장바구니 페이지에서

* 규칙 모델을 로드하는 방식이 실제 사례에 100% 맞지 않는다는 점을 이해하는 것이 중요합니다. 이는 규칙 ID 가 로드되어야 하는 규칙을 깔끔하게 지정하기 때문입니다. 이를 기반으로 카트의 항목인 배송 주소로 알려진 개체의 유효성을 검사합니다. 예제로 생성되지 않은 모듈에서 Rules 객체는 현재 환경(예: 상점, 고객 및 해당 그룹, 시간, 날짜 등)과의 호환성에 대해 유효성을 검사하는 특수 클래스로 로드되어야 합니다. 우리는 관련 기사 시리즈에서 이 문제를 확실히 다룰 것입니다. *

중요 참고 사항:

이제 모듈의 코드는 github.com의 공개 저장소에서 무료로 사용할 수 있습니다. 따라서 더 이상 블로그 게시물에서 코드를 복사하여 붙여넣을 필요가 없습니다. 필요한 모든 코드는 여기에서 편리하게 사용할 수 있습니다.

먼저 관리자 패널에서 새 규칙을 만들어 속성 ​​값이 heavy_weight로 지정된 제품을 찾는 데 도움이 됩니다.

조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부) | 메이지웍스 블로그
조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부) | 메이지웍스 블로그

*조건의 속성 목록에 속성이 표시되지 않으면 먼저 이 속성의 구성을 확인하십시오. 프로모션 규칙 조건에 사용 옵션이 비활성화되지 않았는지 확인하기 위해 수행해야 합니다.

그렇게 하려면 상점 > 속성 > 제품으로 이동하십시오. 그런 다음 목록 > 상점 첫화면 특성 >에서 속성을 선택하십시오. 프로모션 규칙 조건에 사용은 '예'로 설정해야 합니다. 자세한 내용은 아래 스크린샷을 참조하세요.

조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부) | 메이지웍스 블로그

내 규칙의 ID는 1입니다. 또한 이 규칙을 사용하여 로드 프로세스를 용이하게 할 것입니다. 이제 새 메시지를 표시하는 새 블록을 추가하여 장바구니 페이지의 레이아웃을 업데이트하겠습니다.

 `app/code/Vendor/Rules/view/frontend/layout/checkout_cart_index.xml` ```xml <?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="checkout.cart.form.before"> <block class="Vendor\Rules\Block\Cart\RuleExample" name="custom_block_with_rules" template="Vendor_Rules::cart/example.phtml"/> </referenceContainer> </body> </page> ```

레이아웃에서 알 수 있듯이 블록과 템플릿이라는 2개의 파일이 더 필요합니다. 생성해 보겠습니다.

 `app/code/Vendor/Rules/view/frontend/templates/cart/example.phtml` ```php <?php /** @var \Vendor\Rules\Block\Cart\RuleExample $block */ ?> <?= $block->getMessage();?> ```

템플릿에서 모든 것이 간단합니다. 즉, 메시지 출력만 가능합니다. 필요한 경우 필요에 따라 레이아웃을 추가할 수 있습니다.

전체 페이지 캐시 페이지에서 이러한 템플릿을 사용할 때 결과도 캐시됩니다. 이러한 페이지에는 다른 접근 방식을 사용해야 하며, 이는 공식 Magento 개발 문서에 자세히 설명되어 있습니다.

이제 예제에서 메인 클래스를 추가할 차례입니다. 다음은 블록 클래스입니다.

 heckout\Model\Session as CheckoutSession; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\View\Element\Template; use Magento\Quote\Model\Quote\Address as QuoteAddress; use Vendor\Rules\Model\Rule; use Vendor\Rules\Model\ResourceModel\Rule\CollectionFactory as RulesCollectionFactory; /** * Class RuleExample */ class RuleExample extends Template { /** * @var RulesCollectionFactory */ private $rulesCollectionFactory; /** * @var string */ private $message; /** * @var CheckoutSession */ private $checkoutSession; /** * RuleExample constructor. * * @param Template\Context $context * @param RulesCollectionFactory $rulesCollectionFactory * @param CheckoutSession $checkoutSession * @param array $data */ public function __construct( Template\Context $context, RulesCollectionFactory $rulesCollectionFactory, CheckoutSession $checkoutSession, array $data = [] ) { $this->rulesCollectionFactory = $rulesCollectionFactory; $this->checkoutSession = $checkoutSession; $this->message = ''; parent::__construct($context, $data); } /** * @return string */ public function getMessage(): string { if ($this->message) { return $this->message; } $shippingAddress = $this->getShippingAddress(); if (!$shippingAddress) { return $this->message; } $rule = $this->getRule(); if ($rule && $rule->validate($shippingAddress)) { $this->message = __( 'You have some heavy weight items in your cart, please contact us to discuss delivery.' ); } return $this->message; } /** * @return Rule|null */ private function getRule(): ?Rule { /** @var \Vendor\Rules\Model\ResourceModel\Rule\Collection $rulesCollection */ $rulesCollection = $this->rulesCollectionFactory->create(); $rulesCollection->addFilter('rule_id', 1); /** @var Rule|null $rule */ $rule = $rulesCollection->getFirstItem(); return $rule; } /** * @return QuoteAddress|null */ private function getShippingAddress(): ?QuoteAddress { /** @var \Magento\Quote\Model\Quote $quote */ try { $quote = $this->checkoutSession->getQuote(); } catch (LocalizedException $exception) { return null; } if (!$quote) { return null; } return $quote->getIsVirtual() ? $quote->getBillingAddress() : $quote->getShippingAddress(); } } ```

유효성 검사가 숨겨져 있는 바로 그 부분이므로 이 클래스에 대해 조금 더 자세히 살펴보겠습니다. 템플릿에서 사용하는 공개 메서드가 하나만 있습니다. 그것은 `getMessage()` 메소드입니다. 메서드 내에서 올바른 규칙이 지정되고(장바구니를 확인함) 배송 주소(확인을 위해 사용됨)가 지정됩니다.

우리는 표준 프론트엔드 기능을 사용하여 배송 주소를 얻습니다. 즉, 체크아웃 세션에서 요청합니다. ID를 기반으로 하는 필터를 사용하여 컬렉션에서 규칙을 채웁니다. (이 글의 시작 부분에서 언급했듯이 이것이 최선의 수단은 아니며 단지 예로서 사용될 수 있습니다. 가장 적합한 방식으로 규칙을 얻는 방법을 설명하십시오.) 우리 블록에 2개의 필수 객체가 있는 경우 규칙의 `$rule->validate($shippingAddress)` 메서드가 반환할 항목, 즉 true 또는 false를 확인하는 것만 남았습니다. 결과에 따라 템플릿의 장바구니 페이지에 표시될 메시지를 생성하거나 생성하지 않습니다. 규칙 모델 내에서 다음과 같이 작동합니다.

 ```php /** * Validate rule conditions to determine if rule can run * * @param \Magento\Framework\DataObject $object * @return bool */ public function validate(\Magento\Framework\DataObject $object) { return $this->getConditions()->validate($object); } ```

이 메서드는 `Vendor\Rules\Model\Rule` 클래스 규칙이 상속되는 `Magento\Rule\Model\AbstractModel` 추상 클래스에 이미 존재합니다. 사용자 지정 유효성 검사가 필요한 경우 부모 메서드를 호출하거나 호출하지 않고 항상 'validate' 자체 메서드를 클래스 규칙에 추가할 수 있습니다.

프론트엔드에서 결과적으로 얻을 수 있는 것은 다음과 같습니다.

*T1 Blue 제품의 heavy_weight 속성 값은 1입니다.

![장바구니에 담긴 유효한 상품]

조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부) | 메이지웍스 블로그

*T1 Red 제품의 heavy_weight 속성 값은 0입니다.

![장바구니에 담긴 유효한 상품]

조건 모델 및 필드 세트가 있는 Magento 2 모듈의 예(2부) | 메이지웍스 블로그

스크린샷에서 볼 수 있듯이 블록의 메시지는 장바구니 레이블 아래 T1 Blue 제품에 대해 표시됩니다. 반대로 빨간색의 경우 메시지가 표시되지 않습니다. 이는 규칙이 올바르게 작동함을 의미합니다.


시간을 내어 기사를 읽어주신 모든 분들께 감사드립니다. 질문이 있는 경우 아래 의견에 자유롭게 공유하세요. 기꺼이 도와드리겠습니다.