Magento 2, kurulum komut dosyasından özel ürün özellik doğrulaması ekle


17
[
    'type' => 'int',
    'arka uç' => '',
    'frontend' => '',
    'label' => 'XXXX',
    'input' => 'metin',
    'frontend_class' => 'sıfırdan büyük onayla',
    'kaynak' => '',
    'global' => \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL,
    'visible' => true,
    'zorunlu' => doğru,
    'user_defined' => yanlış,
    'varsayılan' => 0,
    'aranabilir' => yanlış,
    'filtrelenebilir' => doğru,
    'karşılaştırılabilir' => yanlış,
    'visible_on_front' => yanlış,
    'used_in_product_listing' => doğru,
    'unique' => yanlış
]

İyi çalışan, ancak validate-greater-than-zerodoğrulama ekleyemeyen özel ürün özelliği ekliyorum .

Herhangi bir özellik özelliğine bakarsak, Input Validation for Store Ownerbelirli seçeneklerde sınırlı sayıda doğrulama vardır.

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

Bunlar, Ürün özellik bölümünde uygulanan yalnızca doğrulamalardır.


Lütfen cevabıma bakın, özellik değerinizi doğrulamanıza yardımcı olacaktır.
Matthéo Geoffray

Yanıtlar:


13

Çözümlerden biri, backend modelkaydetmeden önce ve / veya yüklendikten sonra özellik değerinizi biçimlendirmek / doğrulamak için kullanılan özelliğinize a eklemektir .

Bir arka uç sınıfı ekleyin:

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

İşte özel sınıfınıza bir örnek \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;
    }
}

Bu tür bir sınıfa basit bir örnek istiyorsanız, kontrol edebilirsiniz

  • \Magento\Customer\Model\Customer\Attribute\Backend\Website
  • genişleyen tüm sınıflar \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
  • tablodaki backend_modelsütuna sınıflareav_attribute


EDIT
İstediğinizle hemen hemen aynı şeyi yapan bir sınıf istiyorsanız SKUöznitelik doğrulamasına göz atabilirsiniz, \Magento\Catalog\Model\Product\Attribute\Backend\Sku
ayrıca örnek sınıftaki yöntemi de ekledim


EDIT
Başka bir çözüm (belki de en iyisi değil) işlev üzerinde bir eklenti oluşturmak \Magento\Eav\Helper\Data::getFrontendClassesve önden doğrulanabilir ön uç sınıfınızı buraya eklemektir.


Cevabınız için teşekkür ederiz, ancak kullanıcı arabirimi doğrulamasını uygulamak mümkün mü?
Amit Singh

eav_attributeSütundaki tablodaki öznitelik satırınıza bir göz atarsanız frontend_classdeğer validate-greater-than-zeromi?
Matthéo Geoffray

Evet ama işe yaramıyor. Bunlar çalışan tek sınıfları validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum.
Amit Singh

1
Özel ön uç sınıflarınızı eklemek için ikinci düzenlememi deneyebilir misiniz ?
Matthéo Geoffray

Eklenti kullanarak yaptım, ipucu için teşekkürler
Amit Singh

12

Yardımıyla, Matthéo Geoffrayözel özellikler için ön uç doğrulaması uygulamak için yaptığım bu oldu.

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

Bu, kurulum komut dosyasındaki özel özelliktir.

Di.xml dosyasına eklenti ekledim

<type name="Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules">
      <plugin name="namespace_custom_validation_for_product_attribute" type="Namespace\Module\Model\Plugin\Product\ValidationRules"/>
</type>

İşte eklenti kodu.

<?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;
    }
}

Temel olarak \Magento\Catalog\Ui\DataProvider\CatalogEavValidationRules, çağrılan yöntem mapRulesyalnızca sınırlı sayıda doğrulama kuralına karşı ön uç sınıfıyla eşleşir. Daha fazla doğrulama kuralı uygulamak için eklenti kullanarak kural eklememiz gerekir.

Sunucu tarafı doğrulaması için lütfen Matthéo Geoffraycevaba bakınız .


3

Kurulum betiğinden mümkün olabileceğinden emin değilim. Ama eminim fonksiyonu ile "dinleyici eklentisinden önce" oluşturmak beforeSave()ve orada değeri kontrol etmek mümkün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.