Aggiungi una nuova colonna a sales_flat_order_grid


14

Come posso aggiungere una nuova colonna alla sales_flat_order_gridtabella e assicurarmi che i valori siano correttamente inseriti lì?

La "fonte" per la nuova colonna è una colonna personalizzata a cui abbiamo aggiunto sales_flat_order, chiamiamola foo. AFAICT, ci sono tre modi fooper apparire nella griglia dell'ordine principale:

  1. JOINla sales_flat_order_gridcollezione su sales_flat_order.
    • Problema: i filtri non funzionano più a causa di colonne ambigue (poiché entrambe le tabelle hanno nomi di colonna simili)
  2. Utilizzare la griglia sales_flat_orderper i dati anziché sales_flat_order_grid.
    • Problema: le colonne non sono indicizzate, quindi il filtro è terribilmente lento. Sembra sciocco aggiungere all'indice gli stessi dati indicizzati nella sales_flat_order_gridtabella inutilizzata .
  3. Aggiungi una nuova colonna sales_flat_order_grid e assicurati che il valore venga aggiornato lì

Non riesco a capire come sales_flat_order_gridviene aggiornato, quindi non so come aggiungere questa nuova colonna. qualche idea?

Risposte:


17

La sales_flat_order_gridtabella viene aggiornata ad ogni azione di salvataggio dell'ordine. È possibile aggiungere colonne personalizzate alla tabella nella propria estensione, se si aggiunge un nome di colonna già utilizzato nella tabella sales_flat_order non è necessario aggiungere altro, su ogni azione di salvataggio dell'ordine le colonne vengono aggiornate (se necessario) . Se si desidera inserire dati da una tabella diversa, sarà necessario creare un osservatore affinché l' sales_order_resource_init_virtual_grid_columnsevento raccolga e prepari il join.

Per maggiori dettagli e un esempio funzionante vedere la mia risposta in Aggiungi colonna a una griglia (osservatore) - Colonna 'store_id' in cui la clausola è un problema ambiguo


Sei sicuro che questo aggiornamento si basi esclusivamente sul nome della colonna? Nel mio caso, non ha funzionato fino a quando non ho eliminato e ricreato l'attributo con "grid" => true. La semplice modifica di entrambe le tabelle per aggiungere una colonna identica non era sufficiente, né chiamare updateAttribute () sull'attributo esistente. (Ho avuto l'idea da questa domanda: stackoverflow.com/a/11254067/884734 )
Eric Seastrand,

Con l'attributo grid = true lo script di installazione crea l'attributo tra la tabella slas_flat_order e la tabella sales_flat_order_grid. In questo modo l'aggiornamento di un ordine lo salverà su entrambe le tabelle.
Vladimir Kerkhoff,

9

Ho fatto la stessa cosa. Aggiunto il campo 'order_type' in ordine e visualizzato nella griglia. Funziona perfettamente in Magento versione 1.7.0.2

Come aggiungere il campo Tipo di ordine nella griglia degli ordini di vendita in admin?

1) Dobbiamo creare un file sql di installazione con il codice seguente.

<?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) Sostituisci il file Mage_Adminhtml_Block_Sales_Order_Grid e aggiungi il codice sottostante in esso.

<?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) Creare un evento osservatore per aggiungere / aggiornare il valore del campo del tipo di ordine

Apri il tuo modulo / 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) Crea un file osservatore della 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;
    }
}
?>

2

Ho usato il seguente codice simile. Funziona bene.

$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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.