2011-10-21 10 views
9

è possibile modificare il tipo di un attributo dopo che è stato creato. Voglio cambiare il tipo di certi attributi nella lista Multi select. Il tipo di questi attributi è attualmente 'Dropdown'. In realtà Quando creo gli attributi, non c'era bisogno di multi-selezione quando l'ho creato in origine, ma ora il cliente vuole cambiarlo in "Selezione multipla".Tipo di attributo modifica Magento nel backend

Please help me out, Non riesco a creare nuovi attributi eliminando quelli vecchi, dato che ci sono alcuni dati e alcune parti del design sono hard coded e dipendono da determinati valori di attributo.

risposta

17

sì è possibile a livello di codice grazie al metodo Mage_Eav_Model_Entity_Setup::updateAttribute($entityTypeId, $id, $field, $value=null, $sortOrder=null)

Non è possibile con la dirigenza Abilità in Magento backend perché ha conseguenze con i dati esistenti. Nel tuo caso, passare da select a multiselect dovrebbe essere ok ma fare un backup del database e testare se il tuo prodotto è ancora visualizzato correttamente.

A livello di codice, il modo migliore è farlo da uno script di installazione aggiornamento. Non conosco il tuo modulo ma qui ci sono alcune informazioni per farlo.

Uno script di installazione di aggiornamento viene avviato quando si fornisce una nuova versione di numero al modulo e si fornisce uno script di installazione con il numero di versione vecchio e nuovo come nome file.

1) Ecco l'intestazione di un modulo config.xml, modificarlo per fornire una versione superiore. Ad esempio, la nuova versione è

<?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) è necessario avere nel file config.xml, tra i tag <global>...</global> il seguente codice, si prega di adattarsi alla situazione:

<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) Quindi è necessario creare uno script di installazione nella cartella del modulo con il numero di versione vecchia e nuova app/code/local/mycompany/mymodule/sql/mymodule_setup/mysql4-upgrade-1.0.0-1.0.1.php (mysql4-upgrade-old.version.number-new.version.number.php)

4) E in questo nuovo script impostare un codice come questo, si prega di adattarsi alla situazione:

<?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) Aggiornare la pagina Magento e alla fine svuotare la cache

+0

grazie per una risposta così dettagliata, proverò la soluzione suggerita da voi ... – Ravish

+0

@mushin ha ragione. Vuoi ''frontend_input'' nella chiamata' updateAttribute() ', non'' input''. (Testato su Magento 1.9.0.1) –

+0

@TylerV. se controlli la classe 'Mage_Eav_Model_Entity_Setup :: _ prepareValues' vedrai che' input' funzionerà –

0

Si può provare il metodo Mage_Eav_Model_Entity_Setup::updateAttribute.

6

4.I pensare aggiornamento usa i campi del database, per esempio input dovrebbe 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' 
)); 
+0

Quando ho seguito questo ho anche dovuto impostare ''backend_type' => 'varchar', 'backend_model' => 'eav/entity_attribute_backend_array'' – clockworkgeek

+0

I provato questo non funziona? –

0

In primo luogo è necessario aggiornare il tipo di ingresso attributo MultiSelect utilizzando il codice qui sotto indicati:

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'; 

Ora, copiare i valori degli attributi dalla vecchia tabella per il nuovo:

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; 

Infine, rimuovere i vecchi valori altrimenti saranno in conflitto con il nuovo setup (i vecchi valori verranno caricati, ma Magento salverà i nuovi valori nella tabella varchar):

DELETE FROM catalog_product_entity_int 
WHERE entity_type_id = 4 and attribute_id = YOUR_ATTRIBUTE_ID_HERE; 
Problemi correlati