Magento 2はインストールスクリプトからカスタム製品属性検証を追加します


17
[
    「タイプ」=>「int」、
    'backend' => ''、
    'frontend' => ''、
    'label' => 'XXXX'、
    「入力」=>「テキスト」、
    'frontend_class' => 'ゼロより大きい検証'、
    'source' => ''、
    'global' => \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL、
    'visible' => true、
    '必須' => true、
    'user_defined' => false、
    'default' => 0、
    'searchable' => false、
    'filterable' => true、
    '比較可能' => false、
    'visible_on_front' => false、
    'used_in_product_listing' => true、
    'ユニーク' => false
]

正常に機能するカスタム製品属性を追加していvalidate-greater-than-zeroますが、検証を追加できません。

属性プロパティを見るとInput Validation for Store Owner、選択オプションの検証の数が限られています。

validate-numbervalidate-digitsvalidate-emailvalidate-urlvalidate-alphavalidate-alphanum

これらは、製品属性セクションで適用される唯一の検証です。


私の答えをご覧ください。属性値を検証するのに役立ちます。
マテオジェオフレイ

回答:


13

解決策の1つは、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フロントエンドクラスを追加して、前に検証できるようにすることです。


ご返信いただきありがとうございますが、フロントエンドの検証を適用することは可能でしょうか。
アミットシン

eav_attribute列の表の属性行を見るとfrontend_class、値はvalidate-greater-than-zero
マテオジェオフレイ

はい、動作しません。これらの作品だけのクラスですvalidate-numbervalidate-digitsvalidate-emailvalidate-urlvalidate-alphavalidate-alphanum
アミットシン

1
カスタムのフロントエンドクラスを追加するために、2番目の編集を試してもらえますか?
マテオジェオフレイ

Iそれは、ヒントのおかげでプラグインを使用しなかった
アミット・シン

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.