Comment ajouter une nouvelle colonne à une table existante dans Magento par programme?

23

Comment puis-je ajouter une nouvelle colonne à la table principale Magento existante via le script d'installation? (sans utiliser du SQL pur)

Je veux utiliser la méthode Magento qui utilise des méthodes d'alias pour créer un script d'installation.

Jusqu'à présent, j'ai suivi quelques tutoriels. Mais semble ne pas fonctionner correctement. Cette ALTER TABLE StackOverflow dans le script d'installation de Magento sans utiliser de réponse SQL était quelque peu similaire à ma question. Mais quel est le contenu à mettre dans le confg.xmlfichier du module ? Dois-je simplement définir le modèle de ressource, le modèle et les données de configuration seraient suffisants?

La partie pertinente du config.xml(de mon module) est la suivante.

<config>
 . . . 
<global>
        <models>
            <mymodule>
                <class>Mynamespace_Mymodule_Model</class>
                <resourceModel>mymodule_resource</resourceModel>
            </mymodule>
            <mymodule_resource>
                <class>Mynamespace_Mymodule_Model_Resource</class>
            </mymodule_resource>
        </models>
        <resources>
            <mymodule_setup>
                <setup>
                    <module>Mynamespace_Mymodule</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </mymodule_setup>
            <mymodule_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </mymodule_read>
            <mymodule_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </mymodule_write>
        </resources>
. . . .
</config>

Et mon script d'installation est le suivant.

$installer = $this;
$installer->startSetup();

$installer->getConnection()
        ->addColumn($installer->getTable('sales_flat_order'),'custom_value', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
        'nullable'  => false,
), 'Title');
$installer->endSetup();

Mais j'obtiens l'erreur suivante.

SQLSTATE [42S02]: table ou vue de base introuvable: 1146 La table '255.sales_flat_order' n'existe pas

Toute suggestion pour résoudre ce problème serait appréciée.

Sukeshini
la source
Le nom de la base de données est-il 255?
Fabian Blechschmidt
non. le nom de la base de données est autre chose.
Sukeshini

Réponses:

44

sales_flat_orderest le nom complet du tableet vous devez donc utiliser l'alias dans$installer->getTable()

En $installer->getTable()paramètre commemodule_alias/table_alias.

Dans ce cas, essayez avec

$installer->getTable('sales/order')

Lorsque vous écrivez ceci, il renverra le nom de la table sales_flat_order

car

module_alias = sales

table_alias = order

MODIFIER

Vous pouvez utiliser le script ci-dessous pour ajouter une nouvelle colonne. Cela fonctionne bien dans mon système

$installer = $this;
$installer->startSetup();

$installer->getConnection()
->addColumn($installer->getTable('sales/order'),'custom_value', array(
    'type'      => Varien_Db_Ddl_Table::TYPE_TEXT,
    'nullable'  => false,
    'length'    => 255,
    'after'     => null, // column name to insert new column after
    'comment'   => 'Title'
    ));   
$installer->endSetup();

J'utilise Varien_Db_Ddl_Table::TYPE_TEXTinsted of Varien_Db_Ddl_Table::TYPE_VARCHARcar TYPE_VARCHARest obsolète

Tu peux vérifier @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Et si vous spécifiez le type TYPE_TEXTmais définissez la longueur pour dire que 255Magento créera une MySQLcolonne de VARCHARtype.

Keyur Shah
la source
essayé cela, même si je reçois la même réponse
Sukeshini
@Sukeshini vérifier mon montage ....
Keyur Shah
Merci beaucoup. Cela a fonctionné parfaitement et +1 pour l'effort que vous avez fait pour résoudre mon problème.
Sukeshini
heureux d'apprendre que cela fonctionne pour vous @Sukeshini
Keyur Shah
@KeyurShah comment ajouter un nouveau champ dans une table personnalisée?
Butterfly
5

Vous abusez de la méthode addColumn:

public function addColumn($tableName, $columnName, $definition, $schemaName = null)

le quatrième paramètre est schemaName, dans votre appel, le quatrième paramètre est 255.

->addColumn($installer->getTable('sales_flat_order'),'custom_value', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
    'nullable'  => false,
), 'Title')

Si vous utilisez les bons paramètres, cela devrait fonctionner.

Fabian Blechschmidt
la source
1
TYPE_VARCHAR est obsolète, nous devons donc utiliser TYPE_TEXT selon Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes., Corrigez-moi si je me trompe. @Fabian
Keyur Shah
Vous avez raison. TYPE_TEXT avec une longueur <255 maxi automatiquement un varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Merci d'avoir signalé les endroits manqués. et +1
Sukeshini
4

Je me rends compte que c'est une question relativement «ancienne», mais comme Google la trouve encore assez facilement, j'ai décidé d'ajouter ce morceau d'information.

En ce qui concerne votre question, si vous souhaitez modifier le tableau des ventes / commandes, cela ne doit pas être fait par les scripts d'installation / configuration traditionnels. Le Mage_Catalogmodule utilise une Resource_Setupclasse différente , à savoir Mage_Sales_Model_Resource_Setup.

Si vous souhaitez ajouter des attributs au modèle de vente / commande, afin de vous assurer que tout est ajouté et traité correctement, ajoutez votre attribut comme ceci:

<?php

// Start setup
/** @var Mage_Sales_Model_Resource_Setup $installer */
$installer = new Mage_Sales_Model_Resource_Setup('core_setup');
$installer->startSetup();

// Gather info
$entityType = 'order'; // Adding attribute to this entity type (must be written out in text, not the entity type ID!! That'll not work.
$attributeName = 'my_attribute_code'; // Your attribute code/name

// Add attribute, very few parameters are accepted.
$installer->addAttribute($entityType, $attributeName, array(
    'type'              => 'varchar'
));

// End setup
$installer->endSetup();

Si vous vous demandez pourquoi , alors la réponse est dans la addAttribute()fonction de la Mage_Sales_Model_Resource_Setupclasse:

/**
 * Add entity attribute. Overwrited for flat entities support
 *
 * @param int|string $entityTypeId
 * @param string $code
 * @param array $attr
 * @return Mage_Sales_Model_Resource_Setup
 */
public function addAttribute($entityTypeId, $code, array $attr)
{
    if (isset($this->_flatEntityTables[$entityTypeId]) &&
        $this->_flatTableExist($this->_flatEntityTables[$entityTypeId]))
    {
        $this->_addFlatAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr);
        $this->_addGridAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr, $entityTypeId);
    } else {
        parent::addAttribute($entityTypeId, $code, $attr);
    }
    return $this;
}
Wesley Vestjens
la source
Good Catch .. Je ne sais jamais que nous pouvons utiliser addAttributepour le module Sales_Order
Rajeev K Tomy
C'est en fait la réponse la plus correcte.
fantasticrice
J'utilisais l' $thisinstallateur, votre réponse m'a indiqué la bonne direction. Merci beaucoup!
Dr Gianluigi Zane Zanettini