当Magento使用上有时候需要多个AttributeSet 来管理多种类的产品,但是使用内建的addAttribute 方法带入组参数的时候,会自动新增至每个AttributeSet ,可是偏偏不是每一个AttributeSet 都需要此属性。我们今天就来看看到底是怎么回事!
1.新增属性
通常会写在InstallData.php 内,今天我们就不特别说明新增的部分但是在新增的时候,我们首先要把组选项移除掉,并且加上USER_DEFINED 选项,并给予真值。
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY, 'datetime_example', [ 'label' => 'datetime example' 'group'=> 'example_group' ---這項移除 'user_defined'=> true, ---這項要新增 'type' => 'datetime', 'input' => 'date', 'backend' => Startdate::class, 'required' => false, 'global' => ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'searchable' => false, 'filterable' => false, 'filterable_in_search' => false, 'visible_in_advanced_search' => false, 'comparable' => false, 'visible_on_front' => false, 'used_in_product_listing' => false, 'unique' => false ]
);
2.原始码追踪
大家一定会很好奇为什么会这样自动新增至默认AttributeSet ,原来是因为官方有段程式码这样写:
> vendor / magento / module-eav / Setup / EavSetup.php:826
里面有一个foreach ,会自动新增至所有的AttributeSet ,所以不要官方帮我们新增的话,记得要把group 选项拿掉即可。
if (!empty($attr['group']) || empty($attr['user_defined'])) { $select = $this->setup->getConnection()->select()->from( $this->setup->getTable('eav_attribute_set') )->where( 'entity_type_id = :entity_type_id' ); $sets = $this->setup->getConnection()->fetchAll($select, ['entity_type_id' => $entityTypeId]); foreach ($sets as $set) { if (!empty($attr['group'])) { $this->addAttributeGroup($entityTypeId, $set['attribute_set_id'], $attr['group']); $this->addAttributeToSet( $entityTypeId, $set['attribute_set_id'], $attr['group'], $code, $sortOrder ); } else { $this->addAttributeToSet( $entityTypeId, $set['attribute_set_id'], $this->_generalGroupName, $code, $sortOrder ); } } }
适用版本:
- Magento 2.0以上