Magento在后端更改属性类型

时间:2011-10-21 12:42:01

标签: magento magento-1.5

是否可以在创建属性后更改其类型。 我想将某个属性的类型更改为多选列表。这些属性的类型目前是“下拉”。 实际上当我创建属性时,我最初创建它时不需要多选,但是,现在客户想要将其更改为“多选”。

请帮帮我,我不能通过删除旧属性来创建新属性,因为有一些数据,并且设计的某些部分是硬编码的,并且取决于某些属性值。

4 个答案:

答案 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;