Con l'aiuto di Matthéo Geoffray
questo è quello che ho fatto per applicare la convalida del frontend per gli attributi personalizzati.
[
'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
]
Questo è l'attributo personalizzato nello script di installazione.
Ho aggiunto il plugin in 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>
Ecco il codice del 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;
}
}
Fondamentalmente \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules
, il metodo chiamato mapRules
corrisponde solo alla classe frontend con un numero limitato di regole di convalida. Per applicare più regole di convalida dobbiamo aggiungere regole usando il plugin.
Per la convalida lato server, fare riferimento alla Matthéo Geoffray
risposta.