Ajouter une nouvelle colonne à sales_flat_order_grid

14

Comment puis-je ajouter une nouvelle colonne au sales_flat_order_gridtableau et m'assurer que les valeurs y sont correctement insérées?

La "source" de la nouvelle colonne est une colonne personnalisée à laquelle nous avons ajouté sales_flat_order, appelons-la foo. AFAICT, il y a trois façons food'apparaître dans la grille de commande principale:

  1. JOINla sales_flat_order_gridcollection sur sales_flat_order.
    • Problème: les filtres ne fonctionnent plus en raison de colonnes ambiguës (car les deux tables ont des noms de colonne similaires)
  2. Utilisez la grille sales_flat_orderpour les données au lieu de sales_flat_order_grid.
    • Problème: les colonnes ne sont pas indexées, le filtrage est donc terriblement lent. Il semble idiot d'ajouter index les mêmes données indexées dans la sales_flat_order_gridtable inutilisée .
  3. Ajoutez une nouvelle colonne sales_flat_order_grid et assurez-vous que la valeur y est mise à jour

Je ne peux pas comprendre comment sales_flat_order_gridest mis à jour, donc je ne sais pas comment ajouter cette nouvelle colonne. Des pensées?

Colin O'Dell
la source

Réponses:

17

Le sales_flat_order_gridtableau est mis à jour à chaque action de sauvegarde de commande. Vous pouvez ajouter des colonnes personnalisées à la table dans votre propre extension, si vous ajoutez un nom de colonne déjà utilisé dans la table sales_flat_order, vous n'avez pas besoin d'ajouter quoi que ce soit supplémentaire, à chaque action de sauvegarde de commande les colonnes sont mises à jour (si nécessaire) . Si vous souhaitez insérer des données à partir d'une autre table, vous devrez créer un observateur de l' sales_order_resource_init_virtual_grid_columnsévénement pour collecter et préparer la jointure.

Pour plus de détails et un exemple de travail, voir ma réponse dans Ajouter une colonne à une grille (observateur) - Colonne 'store_id' dans laquelle la clause est un problème ambigu

Vladimir Kerkhoff
la source
Êtes-vous certain que cette mise à jour est basée uniquement sur le nom de la colonne? Dans mon cas, cela n'a fonctionné que lorsque j'ai supprimé et recréé l'attribut avec "grid" => true. Modifier simplement les deux tables pour ajouter une colonne identique n'était pas suffisant, ni appeler updateAttribute () sur l'attribut existant. (J'ai eu l'idée de cette question: stackoverflow.com/a/11254067/884734 )
Eric Seastrand
Avec l'attribut grid = true, le script de configuration crée l'attribut dans la table slas_flat_order et sales_flat_order_grid. Cela permettra à la mise à jour d'une commande de l'enregistrer dans les deux tables.
Vladimir Kerkhoff le
9

J'ai fait la même chose. Ajout du champ 'order_type' dans l'ordre et affichage dans la grille. Il fonctionne parfaitement dans Magento ver 1.7.0.2

Comment ajouter le champ Type de commande dans la grille de commande client dans l'administrateur?

1) Nous devons créer un fichier d'installation SQL avec le code ci-dessous.

<?php 
/* @var $installer Mage_Sales_Model_Entity_Setup */
$installer = $this;
$installer->startSetup();
$installer->run(" 
ALTER TABLE `{$installer->getTable('sales/order')}` ADD `order_type` VARCHAR(255) NOT NULL;
ALTER TABLE `{$installer->getTable('sales/order_grid')}` ADD `order_type` VARCHAR(255) NOT NULL;
ALTER TABLE `{$installer->getTable('sales/quote')}` ADD `order_type` VARCHAR(255) NOT NULL; 
");
$installer->endSetup();
?>

2) Remplacez le fichier Mage_Adminhtml_Block_Sales_Order_Grid et ajoutez le code ci-dessous.

<?php

class Mycompany_Mymodule_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
    protected function _prepareColumns()
    {

        $options = array(
        'ordertypeID1' => 'order type label1',
        'ordertypeID2' => 'order type label2',
        'ordertypeID3' => 'order type label3',
        ); 
        $this->addColumn('order_type', array(
            'header'    =>  Mage::helper('customer')->__('Order Type'),
            'width'     =>  '100',
            'index'     =>  'order_type',
            'type'      =>  'options',
            'options'   =>   $options
        ));
        $this->addColumnsOrder('order_type', 'grand_total');
        return parent::_prepareColumns();
    }
}
?>

3) Créez un événement d'observateur pour ajouter / mettre à jour la valeur du champ du type de commande

Ouvrez votre module / etc / config.xml

<config>
    <adminhtml> 
         <events>
            <adminhtml_sales_order_create_process_data>
                <observers>
                    <modulename>
                        <class>Mycompany_Mymodule_Model_Adminhtml_Observer</class>
                        <method>adminhtml_sales_order_create_process_data</method>
                    </modulename>
                </observers>
            </adminhtml_sales_order_create_process_data>
            <sales_convert_quote_to_order>
                <observers>
                    <modulename>
                        <type>model</type>
                        <class>Mycompany_Mymodule_Model_Adminhtml_Observer</class>
                        <method>sales_convert_quote_to_order</method> 
                    </modulename>
                </observers>
            </sales_convert_quote_to_order>
        </events>  
    </adminhtml>
</config>

4) Créez un fichier d'observateur de la classe Mycompany_Mymodule_Model_Adminhtml_Observer

<?php
class Mycompany_Mymodule_Model_Adminhtml_Observer 
{
    public function adminhtml_sales_order_create_process_data(Varien_Event_Observer $observer)
    { 
        try {
            $requestData = $observer->getEvent()->getRequest();

            if (isset($requestData['order']['order_type'])) {
                $observer->getEvent()->getOrderCreateModel()->getQuote()
                    ->addData($requestData['order']) 
                    ->save();
            } 

        } catch (Exception $e) {
            Mage::logException($e);
        }
        return $this;
    }


    /** 
     *
     * @param Varien_Event_Observer $observer
     * @return Mycompany_Mymodule_Model_Adminhtml_Observer
     */
    public function sales_convert_quote_to_order(Varien_Event_Observer $observer)
    {
        if ($ordertype = $observer->getEvent()->getQuote()->getOrderType()) {
            try {  
                $observer->getEvent()->getOrder()
                    ->setOrderType($ordertype);

            } catch (Exception $e) {
                Mage::logException($e);
            }
        }       

        return $this;
    }
}
?>
Bijal Bhavsar
la source
2

J'ai utilisé le code similaire suivant. Ça marche bien.

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

$installer->run("ALTER TABLE  sales_flat_order ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->run("ALTER TABLE  sales_flat_order_grid ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->run("ALTER TABLE  sales_flat_quote ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->endSetup();
Praful Rajput
la source