Magento изменение типа атрибута в бэкэнде

можно ли изменить тип атрибута после его создания. Я хочу изменить тип определенного атрибута на Multi select list. Тип этого атрибута в настоящее время является "выпадающим". На самом деле, когда я создаю атрибуты, не было необходимости в multi select, когда я создал его изначально, но теперь клиент хочет изменить его на "Multi select".

пожалуйста, помогите мне, я не могу создавать новые атрибуты, удаляя старые, так как есть некоторые данные и определенная часть дизайн жестко закодирован и зависит от определенных значений атрибута.

4 ответов


Да, это возможно программно, благодаря методу Mage_Eav_Model_Entity_Setup::updateAttribute($entityTypeId, $id, $field, $value=null, $sortOrder=null)

Это невозможно с управлением атрибутами в Magento Backend, потому что это имеет последствия с существующими данными. В вашем случае переход от select к multiselect должен быть в порядке, но сделайте резервную копию базы данных и проверьте, правильно ли отображается ваш продукт.

программно, лучший способ сделать это из сценария установки обновления. Я не знаю ваш модуль, но вот некоторая информация сделать его.

сценарий установки обновления запускается, когда вы предоставляете новую версию номера вашему модулю, и вы предоставляете сценарий установки со старым и новым номером версии в качестве имени файла.

1) вот заголовок конфигурации.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) вам нужно иметь в конфигурации.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.РНР (mysql4-тпир-старый.версия.номер-новый.версия.число.в 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 и в конечном итоге очистить кэш


4.Я думаю, что update использует поля базы данных, i.e вход должен 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'
));

вы можете попробовать Mage_Eav_Model_Entity_Setup::updateAttribute метод.


сначала вам нужно обновить тип ввода атрибута до 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;