Magento 2 thêm xác thực thuộc tính sản phẩm tùy chỉnh từ tập lệnh cài đặt


17
[
    'loại' => 'int',
    'phụ trợ' => '',
    'lối vào' => '',
    'nhãn' => 'XXXX',
    'đầu vào' => 'văn bản',
    'frontend_group' => 'xác thực-lớn hơn không',
    'nguồn' => '',
    'toàn cầu' => \ Magento \ Eav \ Model \ Entity \ Attribution \ ScopedAttributionInterface :: SCOPE_GLOBAL,
    'hiển thị' => đúng,
    'bắt buộc' => đúng,
    'user_d xác định' => sai,
    'mặc định' => 0,
    'có thể tìm kiếm' => sai,
    'có thể lọc' => đúng,
    'so sánh' => sai,
    'thấy_on_front' => sai,
    'used_in_product_listing' => đúng,
    'độc nhất' => sai
]

Tôi đang thêm thuộc tính sản phẩm tùy chỉnh hoạt động tốt, nhưng không thể thêm validate-greater-than-zeroxác nhận.

Nếu chúng ta xem xét bất kỳ thuộc tính thuộc tính nào Input Validation for Store Ownerthì sẽ có số lượng xác nhận hạn chế trong các tùy chọn được chọn.

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

Đây là những xác nhận duy nhất được áp dụng trong phần thuộc tính Sản phẩm.


Xin vui lòng xem câu trả lời của tôi, nó sẽ giúp bạn xác nhận giá trị thuộc tính của bạn.
Matthéo Geoffray

Câu trả lời:


13

Một trong những giải pháp là thêm một backend modelthuộc tính của bạn, được sử dụng để định dạng / xác thực giá trị thuộc tính của bạn trước khi lưu và / hoặc sau khi tải.

Thêm một lớp phụ trợ:

[
    '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
]

Dưới đây là một ví dụ về lớp tùy chỉnh của bạn \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;
    }
}

Nếu bạn muốn một ví dụ đơn giản về loại lớp đó, bạn có thể kiểm tra

  • \Magento\Customer\Model\Customer\Attribute\Backend\Website
  • tất cả các lớp mở rộng \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
  • các lớp thành backend_modelcột trong eav_attributebảng


EDIT
Nếu bạn muốn một lớp thực hiện gần giống như bạn muốn, bạn có thể xem SKUxác thực thuộc tính, \Magento\Catalog\Model\Product\Attribute\Backend\Sku
tôi cũng đã thêm phương thức trong lớp ví dụ


EDIT
Một giải pháp khác (có thể không phải là giải pháp tốt nhất) là tạo một plugin trên hàm \Magento\Eav\Helper\Data::getFrontendClassesvà thêm lớp frontend của bạn ở đây có thể được xác nhận ở phía trước.


Cảm ơn bạn đã trả lời nhưng có thể áp dụng xác nhận frontend.
Amit Singh

Nếu bạn nhìn vào dòng thuộc tính của bạn trong eav_attributebảng trong cột frontend_classthì bạn có giá trị validate-greater-than-zerokhông?
Matthéo Geoffray

Có nhưng nó không hoạt động. Đây là những lớp học chỉ mà làm việc validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum.
Amit Singh

1
Bạn có thể thử chỉnh sửa thứ hai của tôi , để thêm các lớp lối vào tùy chỉnh của bạn?
Matthéo Geoffray

Tôi đã làm điều đó bằng cách sử dụng plugin, cảm ơn vì gợi ý
Amit Singh

12

Với sự giúp đỡ của Matthéo Geoffray, đây là những gì tôi đã làm để áp dụng xác thực frontend cho các thuộc tính tùy chỉnh.

[
    '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
]

Đây là thuộc tính tùy chỉnh trong tập lệnh cài đặt.

Tôi đã thêm plugin trong 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>

Đây là mã plugin.

<?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;
    }
}

Về cơ bản \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules, phương thức được gọi mapRuleschỉ phù hợp với lớp frontend với số lượng quy tắc xác thực hạn chế. Để áp dụng nhiều quy tắc xác thực hơn, chúng ta cần nối thêm các quy tắc bằng cách sử dụng plugin.

Để xác nhận phía máy chủ, vui lòng tham khảo Matthéo Geoffraycâu trả lời.


3

Tôi không chắc có thể cài đặt được tập lệnh. Nhưng tôi chắc chắn là có thể nếu bạn sẽ tạo "trước plugin người nghe" với chức năng beforeSave()và kiểm tra giá trị ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.