Magento 2 menambahkan validasi atribut produk khusus dari skrip instalasi

17
[
    'type' => 'int',
    'backend' => '',
    'frontend' => '',
    'label' => 'XXXX',
    'input' => 'teks',
    'frontend_class' => 'validasi-lebih besar dari nol',
    'sumber' => '',
    'global' => \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL,
    'terlihat' => benar,
    'wajib' => benar,
    'user_defined' => false,
    'default' => 0,
    'dicari' => salah,
    'filterable' => true,
    'sebanding' => salah,
    'visible_on_front' => false,
    'used_in_product_listing' => true,
    'unik' => salah
]

Saya menambahkan atribut produk khusus yang berfungsi dengan baik, tetapi tidak dapat menambahkan validate-greater-than-zerovalidasi.

Jika kita melihat properti atribut apa pun di Input Validation for Store Ownersana ada sejumlah validasi dalam opsi tertentu.

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

Ini adalah satu-satunya validasi yang diterapkan di bagian atribut Produk.

Amit Singh
sumber
Silakan lihat jawaban saya, ini akan membantu Anda untuk memvalidasi nilai atribut Anda.
Matthéo Geoffray

Jawaban:

13

Salah satu solusinya adalah menambahkan backend modelke atribut Anda yang digunakan untuk memformat / memvalidasi nilai atribut Anda sebelum menyimpan dan / atau setelah memuat.

Tambahkan kelas backend:

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

Ini adalah contoh kelas khusus Anda \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;
    }
}

Jika Anda menginginkan contoh sederhana dari kelas semacam itu, Anda dapat memeriksanya

  • \Magento\Customer\Model\Customer\Attribute\Backend\Website
  • semua kelas yang diperluas \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
  • kelas-kelas menjadi backend_modelkolom dalam eav_attributetabel


EDIT
Jika Anda ingin kelas yang melakukan hal yang hampir sama seperti yang Anda inginkan, Anda dapat melihat SKUvalidasi atribut. \Magento\Catalog\Model\Product\Attribute\Backend\Sku
Saya juga menambahkan metode di kelas contoh


EDIT
Solusi lain (mungkin bukan yang terbaik) adalah membuat plugin pada fungsi \Magento\Eav\Helper\Data::getFrontendClassesdan menambahkan kelas frontend Anda di sini yang dapat divalidasi di depan.

Matthéo Geoffray
sumber
Terima kasih atas balasan Anda, tetapi apakah mungkin untuk menerapkan validasi frontend.
Amit Singh
Jika Anda melihat garis atribut Anda dalam eav_attributetabel di kolom frontend_classapakah Anda nilainya validate-greater-than-zero?
Matthéo Geoffray
Ya tapi tidak berhasil. Ini adalah satu-satunya kelas yang bekerja validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum.
Amit Singh
1
Bisakah Anda mencoba edit kedua saya , untuk menambahkan kelas antarmuka kustom Anda?
Matthéo Geoffray
Saya melakukannya menggunakan plugin, terima kasih atas petunjuknya
Amit Singh
12

Dengan bantuan Matthéo Geoffray, inilah yang saya lakukan untuk menerapkan validasi frontend untuk atribut khusus.

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

Ini adalah atribut khusus dalam skrip instalasi.

Saya menambahkan plugin di 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>

Ini adalah kode 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;
    }
}

Pada dasarnya \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules, metode yang dipanggil mapRuleshanya cocok dengan kelas frontend terhadap sejumlah aturan validasi yang terbatas. Untuk menerapkan lebih banyak aturan validasi, kita perlu menambahkan aturan menggunakan plugin.

Untuk validasi sisi server, Silakan merujuk ke Matthéo Geoffrayjawaban.

Amit Singh
sumber
3

Saya tidak yakin itu bisa dilakukan dari skrip instalasi. Tapi saya yakin itu mungkin jika Anda akan membuat "sebelum plugin pendengar" dengan fungsi beforeSave()dan memeriksa nilai di sana.

Fred Orosko Dias
sumber