您应该通过 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;
}
}