是否可以在创建属性后更改其类型。 我想将某个属性的类型更改为多选列表。这些属性的类型目前是“下拉”。 实际上当我创建属性时,我最初创建它时不需要多选,但是,现在客户想要将其更改为“多选”。
请帮帮我,我不能通过删除旧属性来创建新属性,因为有一些数据,并且设计的某些部分是硬编码的,并且取决于某些属性值。
答案 0 :(得分:17)
是的,可以通过方法Mage_Eav_Model_Entity_Setup::updateAttribute($entityTypeId, $id, $field, $value=null, $sortOrder=null)
Magento后端的属性管理是不可能的,因为它对现有数据有影响。在您的情况下,从select更改为multiselect应该没问题,但是如果您的产品仍然正确显示,请进行数据库备份和测试。
以编程方式,最好的方法是从更新设置脚本中执行此操作。我不知道你的模块,但这里有一些信息要做。
当您为模块提供新的版本号时,将启动更新设置脚本,并提供一个安装脚本,其中包含旧版本号和新版本号作为文件名。
1)这是config.xml模块的标题,将其更改为提供更高版本。例如,新版本是
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Mycompany_Mymodule>
<version>1.0.1</version><!-- the old one was 1.0.0 -->
</Mycompany_Mymodule>
</modules>
...
</config>
2)你需要在config.xml文件中,在以下代码的标签<global>...</global>
之间,请适应你的情况:
<resources> <mymodule_setup><!-- name that you will give to the folder into the sql folder --> <setup> <module>Mycompany_Mymodule</module> <class>Mage_Eav_Model_Entity_Setup</class><!-- You can have a setup class which extends this class --> </setup> <connection> <use>default_setup</use> </connection> </mymodule_setup> </resources>
3)然后,您需要在模块文件夹中使用新旧版本号app / code / local / mycompany / mymodule / sql / mymodule_setup / mysql4-upgrade-1.0.0-1.0.1创建安装脚本。 PHP (mysql4升级-old.version.number-new.version.number.php)
4)在这个新脚本中设置这样的代码,请适应你的情况:
<?php
$installer = $this;
/*@var $installer Mage_Eav_Model_Entity_Setup */
$entityTypeId = $installer->getEntityTypeId('catalog_product');
$idAttributeOldSelect = $this->getAttribute($entityTypeId, 'myold_attribute', 'attribute_id');
$installer->updateAttribute($entityTypeId, $idAttributeOldSelect, array(
'frontend_input' => 'multiselect'
));
5)刷新您的Magento页面并最终刷新缓存
答案 1 :(得分:6)
4.我认为更新使用数据库字段,即输入应该是frontend_input。
<?php
$installer = $this;
/*@var $installer Mage_Eav_Model_Entity_Setup */
$entityTypeId = $installer->getEntityTypeId('catalog_product');
$idAttributeOldSelect = $this->getAttribute($entityTypeId, 'myold_attribute', 'attribute_id');
$installer->updateAttribute($entityTypeId, $idAttributeOldSelect, array(
'frontend_input' => 'multiselect'
));
答案 2 :(得分:0)
您可以尝试Mage_Eav_Model_Entity_Setup::updateAttribute
方法。
答案 3 :(得分:0)
首先,您需要使用下面提到的代码将属性输入类型更新为multiselect:
UPDATE eav_attribute SET
entity_type_id = '4',
attribute_model = NULL,
backend_model = 'eav/entity_attribute_backend_array',
backend_type = 'varchar',
backend_table = NULL,
frontend_model = NULL,
frontend_input = 'multiselect',
frontend_class = NULL
WHERE attribute_id = 'YOUR_ATTRIBUTE_ID_HERE';
现在,将旧表中的属性值复制到新表:
INSERT INTO catalog_product_entity_varchar ( entity_type_id, attribute_id, store_id, entity_id, value)
SELECT entity_type_id, attribute_id, store_id, entity_id, value
FROM catalog_product_entity_int
WHERE attribute_id = YOUR_ATTRIBUTE_ID_HERE;
最后,删除旧值,否则它们将与新设置冲突(旧值将加载,但Magento会将新值保存到varchar表中):
DELETE FROM catalog_product_entity_int
WHERE entity_type_id = 4 and attribute_id = YOUR_ATTRIBUTE_ID_HERE;