【问题标题】:Custom Attribute for quote table is not saving value报价表的自定义属性不保存价值
【发布时间】:2020-10-14 12:02:29
【问题描述】:

我正在尝试将 custom_attribute 添加到 quote 表名称为 is_requested。这项工作很好,列已创建。这是升级方案

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

class UpgradeSchema implements UpgradeSchemaInterface
{

    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        $setup->getConnection()
            ->addColumn(
                $setup->getTable('quote'),
                'is_requested',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                    'length' => 255,
                    'nullable' => true,
                    'default' => 0,
                    'comment' => 'Requested Quote'
                ]
            );
        $setup->endSetup();
    }
}

现在的问题是当我尝试通过此代码添加价值时

Magento\Quote\Model\QuoteFactory $quote;

$quote = $this->quote->create();
$quote->setCustomAttribute('is_requested', '1')->save();

值未保存在quote 表中。

【问题讨论】:

    标签: magento2


    【解决方案1】:

    您应该通过 InstallData 或 UpgradeData 类添加自定义属性。 Schema 类用于创建自定义表。

    首先将以下内容添加到'Setup/InstallData.php'

    namespace [Vendor]\[Module]\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;
    use Magento\Quote\Setup\QuoteSetupFactory;
    use Magento\Sales\Setup\SalesSetupFactory;
    
    class InstallData implements InstallDataInterface {
        private $eavSetupFactory;
        private $quoteSetupFactory;
        private $salesSetupFactory;
    
        public function __construct(EavSetupFactory $eavSetupFactory, SalesSetupFactory $salesSetupFactory, QuoteSetupFactory $quoteSetupFactory)
        {
            $this->eavSetupFactory = $eavSetupFactory;
            $this->quoteSetupFactory = $quoteSetupFactory;
            $this->salesSetupFactory = $salesSetupFactory;
        }
    
        public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
        {
            $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
            $quoteSetup = $this->quoteSetupFactory->create(['setup' => $setup]);
            $salesSetup = $this->salesSetupFactory->create(['setup' => $setup]);
    
            $eavSetup->addAttribute(
                \Magento\Catalog\Model\Product::ENTITY,
                'is_requested',
                [
                    'type' => 'int',
                    'label' => 'Is Requested',
                    'input' => 'boolean',
                    'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
                    'visible' => false,
                    'required' => false,
                    'user_defined' => false,
                    'default' => '',
                    'searchable' => false,
                    'filterable' => false,
                    'comparable' => false,
                    'enabled' => false,
                    'visible_on_front' => false,
                    'used_in_product_listing' => false,
                    'unique' => false,
                    'apply_to' => ''
                ]
            );
    
            $attributeOptions = [
                'type'     => 'int',
                'visible'  => true,
                'required' => false
            ];
            $quoteSetup->addAttribute('quote_item', 'is_requested', $attributeOptions);
            $salesSetup->addAttribute('order_item', 'is_requested', $attributeOptions);
    
        }
    }
    

    在您的模块中创建文件“etc/events.xml”(如果尚不存在)并添加此代码。

    <?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="sales_quote_item_set_product">
            <observer name="set_item_custom_attributes" instance="[Vendor]\[Module]\Observer\SetItemCustomAttributes" />
        </event>
    </config>
    

    然后在你的模块中的'Observer/SetItemCustomAttributes.php'处创建观察者并添加以下代码。

    namespace [Vendor]\[Module]\Observer;
    
    use Magento\Framework\Event\ObserverInterface;
    
    class SetItemCustomAttributes implements ObserverInterface
    {
        /**
         * @param \Magento\Framework\Event\Observer $observer
         * @return void
         * @SuppressWarnings(PHPMD.UnusedFormalParameter)
         */
        public function execute(\Magento\Framework\Event\Observer $observer)
        {
            $quoteItem = $observer->getQuoteItem();
            $product = $observer->getProduct();
            $quoteItem->setIsRequested($product->getAttributeText('is_requested'));
        }
    }
    

    然后将以下内容添加到模块中的“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">
        <type name="Magento\Quote\Model\Quote\Item\ToOrderItem">
            <plugin name="iefd_delivery_quote_to_order_item" type="[Vendor]\[Module]\Plugin\IsRequestedQuoteToOrderItem"/>
        </type>
    </config>
    

    最后创建 'Plugin/IsRequestedQuoteToOrderItem.php' 并添加以下代码。

    namespace [Vendor]\[Module]\Plugin;
    
    class IsRequestedQuoteToOrderItem
    {
        public function aroundConvert(
            \Magento\Quote\Model\Quote\Item\ToOrderItem $subject,
            \Closure $proceed,
            \Magento\Quote\Model\Quote\Item\AbstractItem $item,
            $additional = []
        ) {
            /** @var $orderItem \Magento\Sales\Model\Order\Item */
            $orderItem = $proceed($item, $additional);
            $orderItem->setIsRequested($item->getIsRequested());
            return $orderItem;
        }
    }
    

    【讨论】:

    • 感谢您的简短回答。但 eav 属性仅适用于 entity_type,并且报价表没有实体类型,我不想为某些实体(产品或客户)添加属性,我只是在表中添加列并使用 setData() 方法添加值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多