วิธีบันทึกฟิลด์ที่กำหนดเองในตารางฐานข้อมูลที่กำหนดเองขณะแก้ไขผลิตภัณฑ์จากแบ็คเอนด์


11

ฉันได้สร้างโมดูลที่กำหนดเองเพื่อแสดงแท็บที่กำหนดเองในแบบฟอร์มผลิตภัณฑ์ในส่วนหลัง ฉันใช้นี้วิธีการแก้ปัญหา

ตอนนี้บนแท็บฉันกำลังเพิ่มเขตข้อมูลที่กำหนดเองเพื่อบันทึกในตารางฐานข้อมูลที่กำหนดเอง พูด<input type="text" name="my_new_field" value="123">

สร้างตัวควบคุมที่กำหนดเองสำหรับผลิตภัณฑ์ของผู้ดูแลระบบด้วยเช่นกัน

ใน etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Controller\Adminhtml\Product\Save" type="Namespace\Module\Controller\Adminhtml\Rewrite\Product\Save" />
</config>

และใน Controller / Adminhtml / Rewrite / Product / Save.php

<?php

    namespace Namespace\Module\Controller\Adminhtml\Rewrite\Product;

    class Save extends \Magento\Catalog\Controller\Adminhtml\Product\save
    {

        public function execute()
        {
            echo "hello"; print_r($_POST); die;

            return parent::execute();
        }
    }

ตอนนี้ในฟังก์ชั่นที่ฉันคาดหวังว่าค่าโพสต์ของexecute my_new_fieldแต่ฉันไม่ได้รับมัน หลังจากได้รับแล้วฉันจะใช้แบบสอบถามที่กำหนดเองเพื่อบันทึกข้อมูลในตารางที่กำหนดเอง

ฉันกำลังทำอะไรผิดหรือฉันควรใช้วิธีอื่น?

อัปเดต: 26 สิงหาคม

ฉันใช้แบบฟอร์ม Ajax เพื่อบันทึกข้อมูลจากแท็บผลิตภัณฑ์เนื่องจากฉันมีข้อ จำกัด ด้านเวลา ฉันยอมรับคำตอบของ @ william-oakley ขณะนี้ @mageworx เพิ่มในคำตอบของเขาว่านี่ไม่ใช่วิธีมาตรฐานในการทำเช่นนี้

ฉันต้องการใช้การใช้มาตรฐานรูปแบบ UI ในการพัฒนาต่อไป ดังนั้นคำถามของฉันคือวิธีเพิ่มแท็บที่กำหนดเองในการแก้ไขผลิตภัณฑ์โดยใช้มาตรฐานฟอร์ม UI และบันทึกฟิลด์ที่กำหนดเองในตารางที่กำหนดเองหรือในอีกวิธีหนึ่ง


1
สวัสดีคุณสามารถใช้ไฟล์ CatalogProductSaveBefore.php ใน Observer เพื่อบันทึก feild ที่กำหนดเองนี้
Payal Patel

คำตอบ:


14

คุณสามารถใช้ช่องป้อนข้อมูล "เปล่า" คุณเพียงแค่ต้องเพิ่มแอตทริบิวต์ต่อไปนี้:

data-form-part="product_form"

ดังนั้น:

<input data-form-part="product_form" type="text" name="my_new_field" value="123">

จากนั้นคุณจะสามารถรับข้อมูล POST สำหรับอินพุตของคุณ


7

วิธีการแก้ปัญหาข้างต้นไม่ถูกต้องอย่างสมบูรณ์ คุณกำลังเพิ่มเขตข้อมูลเป็นองค์ประกอบ html "เปล่า" และรูปแบบผลิตภัณฑ์เป็นรูปแบบ UI ที่มีลักษณะเฉพาะของตัวเอง คลาสพิเศษ ( vendor/magento/module-ui/view/base/web/js/form/form.js) รับผิดชอบการรวบรวมฟิลด์และการตรวจสอบความถูกต้องเมื่อส่งแบบฟอร์ม นอกจากนี้คลาสนี้ควรพลาดฟิลด์ที่ไม่เกี่ยวข้องกับฟอร์ม UI นี้หรือไม่additional fieldsเหมือนกับฟิลด์ทั้งหมดของคุณ คุณควรใช้การตั้งชื่อต่อไปนี้เพื่อให้แน่ใจว่าเขตข้อมูลของคุณจะถูกส่งไปยังตัวควบคุม:

input type="text" name="product[my_new_field]" value="123"

แต่สิ่งนี้ไม่ถูกต้องอย่างสมบูรณ์เพราะโซลูชันที่ถูกต้องไม่เบี่ยงเบนไปจากมาตรฐานการใช้งานรูปแบบ UI และใช้องค์ประกอบและส่วนประกอบดั้งเดิม ในกรณีนี้คุณไม่ควรกังวลเกี่ยวกับสิ่งนี้เพราะทุกอย่างจะถูกดำเนินการโดยอัตโนมัติ

คุณสามารถตรวจสอบวิธีการหลักในการจัดเก็บข้อมูลแบบฟอร์ม UI เพื่อทำความเข้าใจกระบวนการ:

/**
 * Submits form
 *
 * @param {String} redirect
 */
submit: function (redirect) {
    var additional = collectData(this.additionalFields),
        source = this.source;

    _.each(additional, function (value, name) {
        source.set('data.' + name, value);
    });

    source.save({
        redirect: redirect,
        ajaxSave: this.ajaxSave,
        ajaxSaveType: this.ajaxSaveType,
        response: {
            data: this.responseData,
            status: this.responseStatus
        },
        attributes: {
            id: this.namespace
        }
    });
},

อย่างที่คุณเห็นจากรหัสนี้รูปแบบ html ที่มีทุกฟิลด์จะไม่ถูกส่ง อย่างไรก็ตามthis.sourceและthis.additionalFieldsจะถูกส่ง แต่องค์ประกอบของคุณไม่รวมอยู่ในองค์ประกอบเนื่องจากมีการประกาศอย่างไม่ถูกต้อง

อัปเดตตั้งแต่ 08.23.2016

นี่คือตัวอย่างเกี่ยวกับวิธีเพิ่ม fieldset จากบล็อกของเรา คุณสามารถอ่านบทความเต็มโดยใช้ลิงค์ด้านล่าง:

แหล่งที่มา: วิธีง่ายๆในการเพิ่มชุดข้อมูลที่มีเขตข้อมูลลงในรูปแบบ UI :

เพิ่มเนื้อหา: เมตาดาต้ารูปแบบ UI และประเภทเสมือนสำหรับการเพิ่ม

app/code/Vendor/Product/etc/adminhtml/di.xmlสร้างไฟล์ เราจะวางโมดิฟายเออร์ภายใน:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
        <arguments>
            <argument name="modifiers" xsi:type="array">
                <item name="custom-fieldset" xsi:type="array">
                    <item name="class" xsi:type="string">Vendor\Product\Ui\DataProvider\Product\Form\Modifier\CustomFieldset</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                </item>
            </argument>
        </arguments>
    </virtualType>
</config>

ตอนนี้ให้สร้างไฟล์ตัวดัดแปลง ( app/code/Vendor/Product/Ui/DataProvider/Product/Form/Modifier/CustomFieldset.php) ด้วยชุดฟิลด์ที่กำหนดเองสำหรับหน้าแก้ไขผลิตภัณฑ์และเติมด้วยฟิลด์:

<?php
namespace Vendor\Product\Ui\DataProvider\Product\Form\Modifier;

use Magento\Catalog\Model\Locator\LocatorInterface;
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier;
use Magento\Framework\Stdlib\ArrayManager;
use Magento\Framework\UrlInterface;
use Magento\Ui\Component\Container;
use Magento\Ui\Component\Form\Fieldset;
use Magento\Ui\Component\Form\Element\DataType\Number;
use Magento\Ui\Component\Form\Element\DataType\Text;
use Magento\Ui\Component\Form\Element\Input;
use Magento\Ui\Component\Form\Element\Select;
use Magento\Ui\Component\Form\Element\MultiSelect;
use Magento\Ui\Component\Form\Field;

class CustomFieldset extends AbstractModifier
{

    // Components indexes
    const CUSTOM_FIELDSET_INDEX = 'custom_fieldset';
    const CUSTOM_FIELDSET_CONTENT = 'custom_fieldset_content';
    const CONTAINER_HEADER_NAME = 'custom_fieldset_content_header';

    // Fields names
    const FIELD_NAME_TEXT = 'example_text_field';
    const FIELD_NAME_SELECT = 'example_select_field';
    const FIELD_NAME_MULTISELECT = 'example_multiselect_field';

    /**
     * @var \Magento\Catalog\Model\Locator\LocatorInterface
     */
    protected $locator;

    /**
     * @var ArrayManager
     */
    protected $arrayManager;

    /**
     * @var UrlInterface
     */
    protected $urlBuilder;

    /**
     * @var array
     */
    protected $meta = [];

    /**
     * @param LocatorInterface $locator
     * @param ArrayManager $arrayManager
     * @param UrlInterface $urlBuilder
     */
    public function __construct(
        LocatorInterface $locator,
        ArrayManager $arrayManager,
        UrlInterface $urlBuilder
    ) {
        $this->locator = $locator;
        $this->arrayManager = $arrayManager;
        $this->urlBuilder = $urlBuilder;
    }

    /**
     * Data modifier, does nothing in our example.
     *
     * @param array $data
     * @return array
     */
    public function modifyData(array $data)
    {
        return $data;
    }

    /**
     * Meta-data modifier: adds ours fieldset
     *
     * @param array $meta
     * @return array
     */
    public function modifyMeta(array $meta)
    {
        $this->meta = $meta;
        $this->addCustomFieldset();

        return $this->meta;
    }

    /**
     * Merge existing meta-data with our meta-data (do not overwrite it!)
     *
     * @return void
     */
    protected function addCustomFieldset()
    {
        $this->meta = array_merge_recursive(
            $this->meta,
            [
                static::CUSTOM_FIELDSET_INDEX => $this->getFieldsetConfig(),
            ]
        );
    }

    /**
     * Declare ours fieldset config
     *
     * @return array
     */
    protected function getFieldsetConfig()
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Fieldset Title'),
                        'componentType' => Fieldset::NAME,
                        'dataScope' => static::DATA_SCOPE_PRODUCT, // save data in the product data
                        'provider' => static::DATA_SCOPE_PRODUCT . '_data_source',
                        'ns' => static::FORM_NAME,
                        'collapsible' => true,
                        'sortOrder' => 10,
                        'opened' => true,
                    ],
                ],
            ],
            'children' => [
                static::CONTAINER_HEADER_NAME => $this->getHeaderContainerConfig(10),
                static::FIELD_NAME_TEXT => $this->getTextFieldConfig(20),
                static::FIELD_NAME_SELECT => $this->getSelectFieldConfig(30),
                static::FIELD_NAME_MULTISELECT => $this->getMultiSelectFieldConfig(40),
            ],
        ];
    }

    /**
     * Get config for header container
     *
     * @param int $sortOrder
     * @return array
     */
    protected function getHeaderContainerConfig($sortOrder)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => null,
                        'formElement' => Container::NAME,
                        'componentType' => Container::NAME,
                        'template' => 'ui/form/components/complex',
                        'sortOrder' => $sortOrder,
                        'content' => __('You can write any text here'),
                    ],
                ],
            ],
            'children' => [],
        ];
    }

    /**
     * Example text field config
     *
     * @param $sortOrder
     * @return array
     */
    protected function getTextFieldConfig($sortOrder)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Example Text Field'),
                        'formElement' => Field::NAME,
                        'componentType' => Input::NAME,
                        'dataScope' => static::FIELD_NAME_TEXT,
                        'dataType' => Number::NAME,
                        'sortOrder' => $sortOrder,
                    ],
                ],
            ],
        ];
    }

    /**
     * Example select field config
     *
     * @param $sortOrder
     * @return array
     */
    protected function getSelectFieldConfig($sortOrder)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Options Select'),
                        'componentType' => Field::NAME,
                        'formElement' => Select::NAME,
                        'dataScope' => static::FIELD_NAME_SELECT,
                        'dataType' => Text::NAME,
                        'sortOrder' => $sortOrder,
                        'options' => $this->_getOptions(),
                        'visible' => true,
                        'disabled' => false,
                    ],
                ],
            ],
        ];
    }

    /**
     * Example multi-select field config
     *
     * @param $sortOrder
     * @return array
     */
    protected function getMultiSelectFieldConfig($sortOrder)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Options Multiselect'),
                        'componentType' => Field::NAME,
                        'formElement' => MultiSelect::NAME,
                        'dataScope' => static::FIELD_NAME_MULTISELECT,
                        'dataType' => Text::NAME,
                        'sortOrder' => $sortOrder,
                        'options' => $this->_getOptions(),
                        'visible' => true,
                        'disabled' => false,
                    ],
                ],
            ],
        ];
    }

    /**
     * Get example options as an option array:
     *      [
     *          label => string,
     *          value => option_id
     *      ]
     *
     * @return array
     */
    protected function _getOptions()
    {
        $options = [
            1 => [
                'label' => __('Option 1'),
                'value' => 1
            ],
            2 => [
                'label' => __('Option 2'),
                'value' => 2
            ],
            3 => [
                'label' => __('Option 3'),
                'value' => 3
            ],
        ];

        return $options;
    }
}

ภาพตัวอย่าง

การบันทึกข้อมูลจะเกิดขึ้นภายในไฟล์คอนโทรลเลอร์ของผลิตภัณฑ์ vendor/magento/module-catalog/Controller/Adminhtml/Product/Save.php ในวิธีดำเนินการหลัก หากทุกอย่างถูกต้องแล้วข้อมูลของเราจะแสดงอย่างถูกต้องในข้อมูลอินพุตของวิธีนี้:

ภาพตัวอย่าง

หมายเหตุหากผลิตภัณฑ์ของคุณไม่มีคุณลักษณะเหล่านั้นตั้งแต่ต้นคุณควรบันทึกด้วยตนเอง คุณสามารถทำได้ในผู้สังเกตการณ์

ก่อนอื่นให้ประกาศใน app/code/Vendor/Product/etc/adminhtml/events.xmlไฟล์ (เรากำลังใช้ขอบเขต adminhtml เพราะแบบฟอร์มไม่มีอยู่ในส่วนหน้า):

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_product_save_after">
        <observer name="save_example_data" instance="Vendor\Product\Observer\ProductSaveAfter" />
    </event>
</config>

จากนั้นสร้างคลาสของผู้สังเกตการณ์ที่เราชี้ไปที่แอตทริบิวต์ของอินสแตนซ์ - app/code/Vendor/Product/Observer/ProductSaveAfter.php:

<?php
namespace Vendor\Product\Observer;

use \Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Event\Observer as EventObserver;
use Vendor\Product\Ui\DataProvider\Product\Form\Modifier\CustomFieldset;

class ProductSaveAfter implements ObserverInterface
{

    /**
     * @param EventObserver $observer
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /** @var \Magento\Catalog\Model\Product $product */
        $product = $observer->getEvent()->getProduct();
        if (!$product) {
            return;
        }

        $exampleTextField = $product->getData(CustomFieldset::FIELD_NAME_TEXT);
        $exampleSelectField = $product->getData(CustomFieldset::FIELD_NAME_SELECT);
        $exampleMultiSelectField = $product->getData(CustomFieldset::FIELD_NAME_MULTISELECT);

        // Manipulate data here
    }
}

ข้อมูลในผู้สังเกตการณ์:

ภาพตัวอย่าง

ตอนนี้คุณสามารถเรียกรุ่นของคุณเองจากผู้สังเกตการณ์และบันทึกข้อมูลไว้ในนั้นหรือแก้ไขตามที่คุณต้องการ

ระวัง! หากการบันทึกแบบจำลองของคุณเชื่อมต่อกับการบันทึกผลิตภัณฑ์อาจทำให้เกิดการเรียกซ้ำ


คุณช่วยแนะนำฉันจะเพิ่มเขตข้อมูลฟอร์ม UI ได้อย่างไร
HungryDB

1
@HungryDB เราได้อัปเดตคำตอบข้างต้นแล้วและเพิ่มลิงก์ไปยังบทความจากบล็อกของเรา คุณสามารถอ่านวิธีการสร้างชุดข้อมูลที่นั่นได้
MageWorx

3
ขอบคุณสำหรับคำตอบ @mageworx ฉันตัดสินใจใช้วิธีการ ajax form เพื่อบันทึกข้อมูลเนื่องจากฉันมีข้อ จำกัด ด้านเวลา แน่นอนฉันจะลองวิธีการของคุณเมื่อฉันได้รับเวลา
HungryDB

ดังนั้นฉันจะบันทึกข้อมูลเหล่านี้ไปยังฐานข้อมูลได้อย่างไร
Chi

ขอบคุณสำหรับคำตอบ. วิธีนี้ใช้งานได้ ฉันได้เพิ่มฟิลด์เลือกแบบกำหนดเองและค่าจะถูกบันทึกลงในตารางของฉันโดยใช้ผู้สังเกตการณ์ แต่ในการแก้ไขผลิตภัณฑ์เดียวกันค่าของฉันจะไม่ปรากฏตามที่เลือก กรุณาช่วย .
Vindhuja

2

หากต้องการบันทึกฟิลด์ผลิตภัณฑ์ในตารางที่กำหนดเองคุณสามารถปฏิบัติตามตรรกะของราคาระดับ Magento จะบันทึกราคาระดับด้วยความช่วยเหลือของรูปแบบที่กำหนดเองแบ็กเอนด์ของราคาระดับ เราสามารถทำตามตรรกะเดียวกันสำหรับฟิลด์ที่กำหนดเองของเรา / attibute สำหรับการบันทึกคุณสมบัติในตารางที่กำหนดเองคุณจะต้องสร้างแอททริบิวต์ที่กำหนดเองและจัดทำโมเดลแบ็กเอนด์ โมเดลแบ็กเอนด์จะกลั่นแกล้งและบันทึกและกู้คืนแอ็ตทริบิวต์ คุณสามารถทำตามขั้นตอนด้านล่าง

ขั้นตอนที่ 1 สร้างคุณลักษณะของผลิตภัณฑ์

<?php 
namespace Magentoins\TestAttribute\Setup; 
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;


class InstallData implements InstallDataInterface

{    
    private $eavSetupFactory; 
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        /**
         * Add attributes to the eav/attribute
         */

        $eavSetup->addAttribute(
            \Magento\Catalog\Model\Product::ENTITY,
            'test_attribute',
            [
                'type' => 'int',
                'backend' => 'Magentoins\TestAttribute\Model\Product\Attribute\Backend\TestAttribute',
                'frontend' => '',
                'label' => 'Test Attribute',
                'input' => '',
                'class' => '',
                'source' => '',
                'global' => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL,
                'visible' => true,
                'required' => false,
                'user_defined' => false,
                'default' => 0,
                'searchable' => false,
                'filterable' => false,
                'comparable' => false,
                'visible_on_front' => false,
                'used_in_product_listing' => true,
                'unique' => false,
                'apply_to' => ''
            ]
        );
    }
}

ขั้นตอนที่ 2 สร้างแบบจำลองแบ็กเอนด์สำหรับแอตทริบิวต์ที่กำหนดเองของผลิตภัณฑ์ซึ่งจะช่วยในการตรวจสอบความถูกต้องและบันทึกและดึงค่าของคุณสมบัติ

<?php
namespace Magentoins\TestAttribute\Model\Product\Attribute\Backend;

class TestAttribute extends \Magento\Catalog\Model\Product\Attribute\Backend\Tierprice
{
  protected $_productAttributeBackendTestAttribute;
  /**
   * Website currency codes and rates
   *
   * @var array
   */
  protected $_rates;

  protected $_helper;

  protected $eavConfig;

  public function __construct(
      \Magento\Directory\Model\CurrencyFactory $currencyFactory,
      \Magento\Store\Model\StoreManagerInterface $storeManager,
      \Magento\Catalog\Helper\Data $catalogData,
      \Magento\Framework\App\Config\ScopeConfigInterface $config,
      \Magento\Framework\Locale\FormatInterface $localeFormat,
      \Magento\Catalog\Model\Product\Type $catalogProductType,
      \Magento\Customer\Api\GroupManagementInterface $groupManagement,
      \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Tierprice $productAttributeTierprice,
      \Magentoins\TestAttribute\Model\ResourceModel\Product\Attribute\Backend\TestAttribute $productAttributeBackendFixedprices,
      \Magentoins\TestAttribute\Helper\Data $helperData,
      \Magento\Eav\Model\Config $eavConfig
  ) {
    parent::__construct(
        $currencyFactory,
        $storeManager,
        $catalogData,
        $config,
        $localeFormat,
        $catalogProductType,
        $groupManagement,
        $productAttributeTierprice
    );
    $this->_productAttributeBackendTestAttribute = $productAttributeBackendTestAttribute;    

  }

  /**
   * Retrieve resource instance
   *
   */
  protected function _getResource()
  {
    return $this->_productAttributeBackendTestAttribute;
  }

  public function getAttribute()
  {
    $attribute = $this->eavConfig->getAttribute('catalog_product', 'test_attribute');
    return $attribute;
  }
  /**
   * Validate test_attribute data
   *
   */
  public function validate ($object)
  {
    $attribute = $this->getAttribute();
    $attr = $object->getData($attribute->getName());
    if (empty($attr)) {
      return true;
    }    

    return true;
  }

  /**
   * Assign test_attribute to product data   
   */
  public function afterLoad ($object)
  {
    /*$data is from your custom table*/
    $data = $this->_getResource()->loadTestAttributeData($object->getId(), $websiteId);
    $object->setData($this->getAttribute()->getName(), $data);
    $object->setOrigData($this->getAttribute()->getName(), $data);

    $valueChangedKey = $this->getAttribute()->getName() . '_changed';
    $object->setOrigData($valueChangedKey, 0);
    $object->setData($valueChangedKey, 0);

    return $this;
  }

  /**
   * After Save Attribute manipulation 
   */
  public function afterSave ($object)
  {
    $websiteId = $this->_storeManager->getStore($object->getStoreId())->getWebsiteId();
    $isGlobal = $this->getAttribute()->isScopeGlobal() || $websiteId == 0;

    $testAttribute = $object->getData($this->getAttribute()->getName());

    /*Save attribute value in custom table with the help of resource model*/

    $this->_getResource()->saveTestAttributeData($testAttribute);

    return $this;
  }

  public function beforeSave ($object)
  {
    parent::beforeSave($object);        
  }

}

ขั้นตอนที่ 2 โมเดลทรัพยากรสำหรับการบันทึกและดึงค่าคุณสมบัติจากตารางที่กำหนดเอง

<?php
namespace Magentoins\TestAttribute\Model\ResourceModel\Product\Attribute\Backend;

use Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Tierprice;

/**
 * @author
 */
class TestAttribute extends Tierprice
{
    /**
     * Initialize connection and define main table
     *
     * @return void
     */
    protected function _construct()
    {
        $this->_init('magentoins_product_entity_testAttribute', 'value_id');
    }

    /**
     * Load Fixed Prices for product
     *
     * @param int $productId
     * @return Designnbuy_Fixedprices_Model_Mysql4_fixedprices
     */
    public function loadTestAttributeData($productId, $websiteId = null)
    {
        $connection = $this->getConnection();
        $columns = array (
            'test_attribute' => $this->getIdFieldName()            
        );
        $select = $connection->select()
            ->from($this->getMainTable(), $columns)
            ->where('entity_id=?', $productId)
            ->order('order');

        if (!is_null($websiteId)) {
            if ($websiteId == '0') {
                $select->where('website_id=?', $websiteId);
            } else {
                $select->where('website_id IN(?)', array ('0', $websiteId
                ));
            }
        }

        return $connection->fetchAll($select);
    }

    public function saveTestAttributeData(\Magento\Framework\DataObject $attributeObject)
    {
        $connection = $this->getConnection();
        $data = $this->_prepareDataForTable($attributeObject, $this->getMainTable());

        if (!empty($data[$this->getIdFieldName()])) {
            $where = $connection->quoteInto($this->getIdFieldName() . ' = ?', $data[$this->getIdFieldName()]);
            unset($data[$this->getIdFieldName()]);
            $connection->update($this->getMainTable(), $data, $where);
        } else {
            $connection->insert($this->getMainTable(), $data);
        }
        return $this;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.