Magento 2 додає перевірку спеціальних атрибутів продукту із сценарію встановлення


17
[
    'type' => 'int',
    'бекенд' => '',
    'frontend' => '',
    'label' => 'XXXX',
    'input' => 'текст',
    'frontend_class' => 'валідація-більша від нуля',
    'джерело' => '',
    'global' => \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL,
    'видима' => правда,
    'обов'язково' => правда,
    'user_defined' => помилково,
    'за замовчуванням' => 0,
    'searchchable' => помилково,
    'filterable' => правда,
    'зіставний' => помилковий,
    'visible_on_front' => помилково,
    'used_in_product_listing' => вірно,
    'унікальний' => хибний
]

Я додаю спеціальний атрибут продукту, який працює чудово, але не може додати validate-greater-than-zeroперевірку.

Якщо ми подивимось на будь-які властивості атрибутів, Input Validation for Store Ownerу опціях вибору обмежена кількість перевірок.

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

Це єдині перевірки, застосовані в розділі "Атрибут продукту".


Будь ласка, дивіться мою відповідь, це допоможе вам перевірити значення атрибута.
Маттео Джеффрей

Відповіді:


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табл


EDIT
Якщо ви хочете клас, який робить майже те саме, що ви хочете, ви можете подивитися на SKUперевірку атрибутів, \Magento\Catalog\Model\Product\Attribute\Backend\Sku
я також додав метод у прикладі класу


EDIT
Ще одне рішення (можливо, не найкраще) - створити плагін для функції \Magento\Eav\Helper\Data::getFrontendClassesта додати сюди свій клас frontend, який можна перевірити попереду.


Дякуємо за Вашу відповідь, але чи можна було б застосувати перевірку інтерфейсу.
Аміт Сінгх

Якщо ви подивитеся на рядок атрибутів у eav_attributeтаблиці в стовпці, frontend_classце значення validate-greater-than-zero?
Маттео Джеффрей

Так, але це не працює. Це єдині класи, робота validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum.
Аміт Сінгх

1
Чи можете ви спробувати мою другу редагування , щоб додати свої власні класи фронтену?
Маттео Джеффрей

Я зробив це за допомогою плагіна, дякую за підказку
Amit Singh

12

За допомогою Matthéo Geoffrayцього я і застосував перевірку frontend для спеціальних атрибутів.

[
    '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відповідає лише класу frontend проти обмеженої кількості правил перевірки. Щоб застосувати більше правил перевірки, нам потрібно додати правила за допомогою плагіна.

Для перевірки на стороні сервера зверніться до Matthéo Geoffrayвідповіді.


3

Я не впевнений, що це можливо через встановлення скрипту. Але я впевнений, що це можливо, якщо ви створите функцію "перед плагіном слухача" з функцією beforeSave()і перевірте значення там.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.