Magento 2 เพิ่มการตรวจสอบคุณสมบัติของผลิตภัณฑ์ที่กำหนดเองจากสคริปต์การติดตั้ง


17
[
    'type' => 'int'
    'backend' => '',
    'frontend' => '',
    'label' => 'XXXX'
    'input' => 'text',
    'frontend_class' => 'ตรวจสอบความถูกต้องมากกว่าศูนย์'
    'source' => '',
    'global' => \ Magento \ Eav \ Model \ Entity \ Attribute \ ScopedAttributeInterface :: SCOPE_GLOBAL
    'visible' => จริง
    'ต้องใช้' => จริง
    'user_defined' => false
    'default' => 0,
    'searchable' => false
    'filterable' => จริง
    'Comparable' => false
    'visible_on_front' => false
    'used_in_product_listing' => จริง
    'unique' => false
]

ฉันกำลังเพิ่มคุณสมบัติผลิตภัณฑ์ที่กำหนดเองซึ่งใช้งานได้ดี แต่ไม่สามารถเพิ่ม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
ฉันยังเพิ่มวิธีการในคลาสตัวอย่าง


แก้ไข
วิธีแก้ไขปัญหาอื่น (อาจไม่ใช่วิธีที่ดีที่สุด) คือการสร้างปลั๊กอินในฟังก์ชัน\Magento\Eav\Helper\Data::getFrontendClassesและเพิ่มคลาสส่วนหน้าของคุณที่นี่ซึ่งสามารถตรวจสอบได้ด้านหน้า


ขอบคุณสำหรับการตอบกลับของคุณ แต่เป็นไปได้ไหมที่จะใช้การตรวจสอบส่วนหน้า
Amit Singh

หากคุณดูที่บรรทัดคุณสมบัติของคุณในeav_attributeตารางในคอลัมน์คุณfrontend_classเป็นค่าvalidate-greater-than-zeroหรือไม่
Matthéo Geoffray

ใช่ แต่มันไม่ทำงาน เหล่านี้เป็นเพียงการเรียนที่ทำงานvalidate-number, validate-digits, validate-email, validate-url, ,validate-alpha validate-alphanum
Amit Singh

1
คุณสามารถลองแก้ไขครั้งที่สองของฉันเพื่อเพิ่มคลาสส่วนหน้าแบบกำหนดเองของคุณ
Matthéo Geoffray

ฉันทำมันโดยใช้ปลั๊กอินขอบคุณสำหรับคำแนะนำ
Amit Singh

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.