Magento 2 설치 스크립트에서 사용자 정의 제품 속성 유효성 검사 추가


17
[
    'type'=> 'int',
    'backend'=> '',
    'frontend'=> '',
    'label'=> 'XXXX',
    'input'=> 'text',
    'frontend_class'=> '0보다 큰 검증',
    'source'=> '',
    'global'=> \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL,
    'visible'=> true,
    '필수'=> true,
    'user_defined'=> false,
    'default'=> 0,
    'searchable'=> 거짓,
    'filterable'=> true,
    'comparable'=> false,
    'visible_on_front'=> 거짓,
    'used_in_product_listing'=> true,
    'unique'=> 거짓
]

제대로 작동하지만 validate-greater-than-zero유효성 검사 를 추가 할 수없는 사용자 정의 제품 속성을 추가하고 있습니다 .

속성 속성을 살펴보면 Input Validation for Store Owner선택 옵션에 제한된 수의 유효성 검사가 있습니다.

validate-number, validate-digits, validate-email, validate-url, validate-alpha,validate-alphanum

제품 속성 섹션에 적용되는 유일한 유효성 검사입니다.


내 답변을 참조하십시오. 속성 값을 확인하는 데 도움이 될 것입니다.
Matthéo Geoffray

답변:


13

해결 방법 중 하나는 backend model속성을 저장하기 전 및 / 또는로드 한 후 속성 값을 형식화 / 검증하는 데 사용되는 속성에 속성 을 추가하는 것입니다.

백엔드 클래스를 추가하십시오.

[
    'type' => 'int',
    'backend' => '\Foo\Bar\Model\Attribute\Backend\YourAttribute',
    'frontend' => '',
    'label' => 'XXXX',
    'input' => 'text',
    'frontend_class' => 'validate-greater-than-zero',
    'source' => '',
    'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
    'visible' => true,
    'required' => true,
    'user_defined' => false,
    'default' => 0,
    'searchable' => false,
    'filterable' => true,
    'comparable' => false,
    'visible_on_front' => false,
    'used_in_product_listing' => true,
    'unique' => false
]

다음은 커스텀 클래스의 예입니다 \Foo\Bar\Model\Attribute\Backend\YourAttribute

<?php

namespace Foo\Bar\Model\Attribute\Backend;

/**
 * Class YourAttribute
 */
class YourAttribute extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
{

    /**
     * @var int $minimumValueLength
     */
    protected $minimumValueLength = 0;

    /**
     * @param \Magento\Framework\DataObject $object
     *
     * @return $this
     */
    public function afterLoad($object)
    {
        // your after load logic

        return parent::afterLoad($object);
    }

    /**
     * @param \Magento\Framework\DataObject $object
     *
     * @return $this
     */
    public function beforeSave($object)
    {
        $this->validateLength($object);

        return parent::beforeSave($object);
    }

    /**
     * Validate length
     *
     * @param \Magento\Framework\DataObject $object
     *
     * @return bool
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function validateLength($object)
    {
        /** @var string $attributeCode */
        $attributeCode = $this->getAttribute()->getAttributeCode();
        /** @var int $value */
        $value = (int)$object->getData($attributeCode);
        /** @var int $minimumValueLength */
        $minimumValueLength = $this->getMinimumValueLength();

        if ($this->getAttribute()->getIsRequired() && $value <= $minimumValueLength) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('The value of attribute "%1" must be greater than %2', $attributeCode, $minimumValueLength)
            );
        }

        return true;
    }

    /**
     * Get minimum attribute value length
     * 
     * @return int
     */
    public function getMinimumValueLength()
    {
        return $this->minimumValueLength;
    }
}

그런 종류의 수업의 간단한 예를 원한다면 확인할 수 있습니다.

  • \Magento\Customer\Model\Customer\Attribute\Backend\Website
  • 확장하는 모든 수업 \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
  • 테이블의 backend_model열에 클래스eav_attribute


편집
당신이 원하는 것과 거의 같은 일을하는 클래스를 원한다면 SKU속성 유효성 검사를 볼 수 있습니다 \Magento\Catalog\Model\Product\Attribute\Backend\Sku
. 예제 클래스에 메소드를 추가했습니다.


편집
다른 해결책 (가장 좋은 방법은 아닐 수도 있음)은 함수에서 플러그인을 만들고 \Magento\Eav\Helper\Data::getFrontendClasses앞에서 확인할 수있는 프론트 엔드 클래스를 여기에 추가하는 것입니다.


답장을 보내 주셔서 감사하지만 프런트 엔드 유효성 검사를 적용 할 수 있습니다.
Amit Singh

eav_attribute열의 표에서 속성 줄을 보면 frontend_class그 값이 validate-greater-than-zero?
Matthéo Geoffray

예, 작동하지 않습니다. 이 작품의 유일한 클래스입니다 validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum.
Amit Singh

1
사용자 정의 프론트 엔드 클래스를 추가하기 위해 두 번째 편집 을 시도 할 수 있습니까 ?
Matthéo Geoffray

나는 힌트를 주셔서 감사합니다 플러그인을 사용하여 그것을 해냈습니다
Amit Singh

12

의 도움으로 Matthéo Geoffray사용자 지정 속성에 대한 프런트 엔드 유효성 검사를 적용했습니다.

[
    'type' => 'int',
    'backend' => '',
    'frontend' => '',
    'label' => 'XXXX',
    'input' => 'text',
    'frontend_class' => 'validate-greater-than-zero',
    'source' => '',
    'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
    'visible' => true,
    'required' => true,
    'user_defined' => false,
    'default' => 0,
    'searchable' => false,
    'filterable' => true,
    'comparable' => false,
    'visible_on_front' => false,
    'used_in_product_listing' => true,
    'unique' => false
]

이것은 설치 스크립트의 사용자 정의 속성입니다.

di.xml에 플러그인을 추가했습니다.

<type name="Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules">
      <plugin name="namespace_custom_validation_for_product_attribute" type="Namespace\Module\Model\Plugin\Product\ValidationRules"/>
</type>

플러그인 코드는 다음과 같습니다.

<?php

namespace Namespace\Module\Model\Plugin\Product;

use Closure;

class ValidationRules
{

    /**
     * @param \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules $rulesObject
     * @param callable $proceed
     * @param \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute,
     * @param array $data
     * @return array
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function aroundBuild(
        \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules $rulesObject,
        Closure $proceed,
        \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute,
        array $data
    ){
        $rules = $proceed($attribute,$data);
        if($attribute->getAttributeCode() == 'xyz'){ //custom filter
            $validationClasses = explode(' ', $attribute->getFrontendClass());
            foreach ($validationClasses as $class) {
                $rules[$class] = true;
            }
        }
        return $rules;
    }
}

기본적으로 \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules호출 된 메소드는 mapRules제한된 수의 유효성 검사 규칙에 대해서만 프런트 엔드 클래스와 일치합니다. 더 많은 유효성 검사 규칙을 적용하려면 플러그인을 사용하여 규칙을 추가해야합니다.

서버 측 유효성 검사에 대해서는 Matthéo Geoffray답변을 참조하십시오 .


3

설치 스크립트에서 가능할 수 있는지 잘 모르겠습니다. 그러나 함수를 사용하여 "리스너 플러그인 이전"을 만들고 beforeSave()값을 확인 하면 가능할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.