Magento 2 ইনস্টল স্ক্রিপ্ট থেকে কাস্টম পণ্য বৈশিষ্ট্য বৈধতা যুক্ত করুন


17
[
    'টাইপ' => 'ইনট',
    'ব্যাকএন্ড' => '',
    'সম্মুখভাগ' => '',
    'লেবেল' => 'XXXX',
    'ইনপুট' => 'পাঠ্য',
    'ফ্রন্টএন্ড_ক্লাস' => 'শূন্যের চেয়ে আরও বেশি বৈধতা দিন',
    'উত্স' => '',
    'গ্লোবাল' => \ ম্যাজেন্টো \ ইভা \ মডেল \ সত্তা \ বৈশিষ্ট্য \ স্কোপড্যাট্রিবিউটইনটারফেস :: এসসিপিণ্ডলবাল,
    'দৃশ্যমান' => সত্য,
    'প্রয়োজনীয়' => সত্য,
    'ব্যবহারকারীর_নির্ধারিত' => মিথ্যা,
    'ডিফল্ট' => 0,
    'অনুসন্ধানযোগ্য' => মিথ্যা,
    'ফিল্টারযোগ্য' => সত্য,
    'তুলনীয়' => মিথ্যা,
    'দৃশ্যমান_আর_ফ্রন্ট' => মিথ্যা,
    'Used_in_pr productct_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


সম্পাদনা করুন
আপনি যদি চান এমন ক্লাস চান যা আপনি প্রায় একই জিনিসটি করতে চান তবে আপনি SKUবৈশিষ্ট্যটির বৈধতাটি একবার দেখে নিতে পারেন \Magento\Catalog\Model\Product\Attribute\Backend\Sku
আমি উদাহরণ ক্লাসেও এই পদ্ধতিটি যুক্ত করেছি


সম্পাদনা করুন
আরেকটি সমাধান (সম্ভবত সেরা নয়) হ'ল ফাংশনটিতে একটি প্লাগইন তৈরি করা \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()এবং সেখানে মানটি পরীক্ষা করেন তবে এটি সম্ভব possible

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.