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 mapRules
chỉ 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 Geoffray
câu trả lời.