Magento 2 स्थापित स्क्रिप्ट से कस्टम उत्पाद विशेषता सत्यापन जोड़ें


17
[
    'टाइप' => 'इंट',
    'बैकएंड' => '',
    'फ्रंटेंड' => '',
    'लेबल' => 'XXXX',
    'इनपुट' => 'टेक्स्ट',
    'frontend_class' => 'मान्य-अधिक-से-शून्य',
    'स्रोत' => '',
    'वैश्विक' => \ Magento \ Eav \ Model \ Entity \
    'दृश्य' => सत्य,
    'आवश्यक' => सत्य,
    'user_defined' => गलत,
    'डिफ़ॉल्ट' => 0,
    'खोजनीय' => असत्य,
    'फ़िल्टर योग्य' => सत्य,
    'तुलनीय' => असत्य,
    'दृश्यमान_ पाठ' => असत्य,
    '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

ये उत्पाद विशेषता अनुभाग में लागू एकमात्र सत्यापन हैं।


कृपया मेरा उत्तर देखें, यह आपके विशेषता मान को मान्य करने में आपकी सहायता करेगा।
Matthéo Geoffray

जवाबों:


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


संपादित करें
यदि आप एक वर्ग चाहते हैं जो लगभग वही काम करें जो आप चाहते हैं तो आप SKUविशेषता सत्यापन पर एक नज़र डाल सकते हैं \Magento\Catalog\Model\Product\Attribute\Backend\Sku
मैंने उदाहरण वर्ग में विधि भी जोड़ी है


EDIT
एक और समाधान (शायद सबसे अच्छा नहीं है) फ़ंक्शन पर एक प्लगइन बनाने \Magento\Eav\Helper\Data::getFrontendClassesऔर अपने फ्रंटएंड क्लास को यहां जोड़ने के लिए है जिसे सामने सत्यापित किया जा सकता है।


आपके उत्तर के लिए धन्यवाद, लेकिन क्या फ्रंटएंड सत्यापन लागू करना संभव होगा।
अमित सिंह

यदि आप eav_attributeकॉलम में तालिका में अपनी विशेषता लाइन पर एक नज़र डालते हैं, तो क्या आप frontend_classमूल्य हैं validate-greater-than-zero?
मथायो ज्योफ्रे

हाँ, लेकिन यह काम नहीं करता है। ये केवल वर्ग है जो काम करती है validate-number, validate-digits, validate-email, validate-url, validate-alpha, validate-alphanum
अमित सिंह

1
क्या आप अपने कस्टम फ्रंटएंड क्लासेस को जोड़ने के लिए मेरा दूसरा संपादन आज़मा सकते हैं ?
मथायो ज्योफ्रे

मैंने इसे प्लगइन का उपयोग करके किया, संकेत के लिए धन्यवाद
अमित सिंह

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()और चेक मूल्य के साथ बनाएंगे ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.