Agregar nueva columna a sales_flat_order_grid

14

¿Cómo puedo agregar una nueva columna a la sales_flat_order_gridtabla y asegurarme de que los valores se inserten correctamente allí?

La "fuente" de la nueva columna es una columna personalizada a la que hemos agregado sales_flat_order, llamémosla foo. AFAICT, hay tres formas foode aparecer en la cuadrícula de pedidos principal:

  1. JOINLa sales_flat_order_gridcolección en sales_flat_order.
    • Problema: los filtros ya no funcionan debido a columnas ambiguas (ya que ambas tablas tienen nombres de columna similares)
  2. Haga que la cuadrícula use sales_flat_orderdatos en lugar de sales_flat_order_grid.
    • Problema: las columnas no están indexadas, por lo que el filtrado es terriblemente lento. Parece una tontería agregar al índice los mismos datos indexados en la sales_flat_order_gridtabla no utilizada .
  3. Agregue una nueva columna sales_flat_order_grid y asegúrese de que el valor se actualice allí

No puedo entender cómo sales_flat_order_gridse está actualizando, por lo tanto, no sé cómo agregar esta nueva columna. ¿Alguna idea?

Colin O'Dell
fuente

Respuestas:

17

La sales_flat_order_gridtabla se actualiza en cada acción de guardar pedido. Puede agregar columnas personalizadas a la tabla en su propia extensión, si agrega un nombre de columna que ya se utiliza en la tabla sales_flat_order, no necesita agregar nada adicional, en cada acción de guardar pedidos las columnas se actualizan (si es necesario) . Si desea insertar datos de una tabla diferente, deberá crear un observador para el sales_order_resource_init_virtual_grid_columnsevento para recopilar y preparar la unión.

Para obtener más detalles y un ejemplo de trabajo, vea mi respuesta en Agregar columna a una cuadrícula (observador) - Columna 'store_id' en donde la cláusula es un problema ambiguo

Vladimir Kerkhoff
fuente
¿Está seguro de que esta actualización se basa únicamente en el nombre de la columna? En mi caso, no funcionó hasta que eliminé y volví a crear el atributo con "grid" => true. Simplemente ALTERAR ambas tablas para agregar una columna idéntica no fue suficiente, ni llamar a updateAttribute () en el atributo existente. (Tengo la idea de esta pregunta: stackoverflow.com/a/11254067/884734 )
Eric Seastrand
Con el atributo grid = true, el script de configuración crea el atributo inob con la tabla slas_flat_order y sales_flat_order_grid. Esto hará que la actualización de un pedido lo guarde en ambas tablas.
Vladimir Kerkhoff
9

He hecho lo mismo Se agregó el campo 'order_type' en orden y se mostró en la cuadrícula. Funciona perfectamente en Magento ver 1.7.0.2

¿Cómo agregar el campo Tipo de orden en la cuadrícula de órdenes de venta en admin?

1) Tenemos que crear un archivo sql de instalación con el siguiente código.

<?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) Anule el archivo Mage_Adminhtml_Block_Sales_Order_Grid y agregue el código siguiente.

<?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) Cree un evento de observador para agregar / actualizar el valor del campo de tipo de orden

Abra su módulo / 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) Cree un archivo de observador de la clase 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
fuente
2

Solía ​​seguir un código similar. Funciona 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();
Rajput orante
fuente