Fügen Sie sales_flat_order_grid eine neue Spalte hinzu

14

Wie kann ich der sales_flat_order_gridTabelle eine neue Spalte hinzufügen und sicherstellen, dass die Werte dort richtig eingefügt werden?

Die "Quelle" für die neue Spalte ist eine benutzerdefinierte Spalte, die wir hinzugefügt haben. sales_flat_orderNennen wir sie foo. AFAICT, es gibt drei Möglichkeiten, um fooim Hauptauftragsraster zu erscheinen:

  1. JOINdie sales_flat_order_gridSammlung auf sales_flat_order.
    • Problem: Filter funktionieren aufgrund mehrdeutiger Spalten nicht mehr (da beide Tabellen ähnliche Spaltennamen haben)
  2. Lassen Sie das Raster statt sales_flat_orderfür Daten verwenden sales_flat_order_grid.
    • Problem: Spalten werden nicht indiziert, daher ist das Filtern furchtbar langsam. Es erscheint unsinnig, dieselben Daten, die in der nicht verwendeten sales_flat_order_gridTabelle indiziert sind, zu indexieren .
  3. Fügen Sie eine neue Spalte hinzu sales_flat_order_grid und stellen Sie sicher, dass der Wert dort aktualisiert wird

Ich kann nicht herausfinden, wie sales_flat_order_griddie Aktualisierung durchgeführt wird. Daher kann ich diese neue Spalte nicht hinzufügen. Irgendwelche Gedanken?

Colin O'Dell
quelle

Antworten:

17

Die sales_flat_order_gridTabelle wird bei jeder Aktion zum Speichern von Bestellungen aktualisiert. Sie können der Tabelle in Ihrer eigenen Erweiterung benutzerdefinierte Spalten hinzufügen. Wenn Sie einen Spaltennamen hinzufügen, der bereits in der Tabelle sales_flat_order verwendet wird, müssen Sie bei jeder Aktion zum Speichern von Bestellungen keine zusätzlichen Spalten hinzufügen. Die Spalten werden aktualisiert (falls erforderlich). . Wenn Sie Daten aus einer anderen Tabelle einfügen möchten, müssen Sie einen Beobachter für das sales_order_resource_init_virtual_grid_columnsEreignis erstellen , um den Join zu sammeln und vorzubereiten.

Weitere Details und ein funktionierendes Beispiel finden Sie in meiner Antwort unter Hinzufügen einer Spalte zu einem Raster (Beobachter) - Spalte 'store_id' in where-Klausel ist ein mehrdeutiges Problem

Vladimir Kerkhoff
quelle
Sind Sie sicher, dass dieses Update ausschließlich auf dem Spaltennamen basiert? In meinem Fall hat es nicht funktioniert, bis ich das Attribut mit "grid" => true gelöscht und neu erstellt habe. Das einfache ÄNDERN beider Tabellen, um eine identische Spalte hinzuzufügen, reichte weder aus, noch wurde updateAttribute () für das vorhandene Attribut aufgerufen. (Ich hatte die Idee von dieser Frage: stackoverflow.com/a/11254067/884734 )
Eric Seastrand
Mit dem Attribut grid = true erstellt das Setup-Skript das Attribut in der Tabelle slas_flat_order und sales_flat_order_grid. Dadurch wird die Aktualisierung eines Auftrags in beiden Tabellen gespeichert.
Vladimir Kerkhoff
9

Ich habe das Gleiche getan. Das Feld 'order_type' wurde in der Reihenfolge hinzugefügt und im Raster angezeigt. Es funktioniert perfekt in Magento Version 1.7.0.2

Wie füge ich ein Feld für den Auftragstyp im Kundenauftragsraster in admin hinzu?

1) Wir müssen eine Installations-SQL-Datei mit folgendem Code erstellen.

<?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) Überschreiben Sie die Datei Mage_Adminhtml_Block_Sales_Order_Grid und fügen Sie den folgenden Code hinzu.

<?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) Erstellen Sie ein Beobachterereignis, um den Feldwert für den Auftragstyp hinzuzufügen / zu aktualisieren

Öffnen Sie Ihr Modul / 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) Erstellen Sie eine Beobachterdatei der Klasse 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
quelle
2

Ich habe folgenden ähnlichen Code verwendet. Es funktioniert gut.

$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
quelle