解决Magento 2新增产品属性自动新增至默认AttributeSet问题

当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以上

上一篇:Magento 2 –更改配置使后台用户登入不受限制 下一篇:Magento 2商品排序方式设定教学