Adicione nova coluna ao sales_flat_order_grid

14

Como posso adicionar uma nova coluna à sales_flat_order_gridtabela e garantir que os valores sejam inseridos corretamente?

A "fonte" da nova coluna é uma coluna personalizada à qual adicionamos sales_flat_order, vamos chamá-lo foo. AFAICT, existem três maneiras foode aparecer na grade principal de pedidos:

  1. JOINa sales_flat_order_gridcoleção para sales_flat_order.
    • Problema: Os filtros não funcionam mais devido a colunas ambíguas (uma vez que ambas as tabelas têm nomes de colunas semelhantes)
  2. Faça com que a grade use sales_flat_orderdados em vez de sales_flat_order_grid.
    • Problema: as colunas não são indexadas, portanto, a filtragem é terrivelmente lenta. Parece bobagem adicionar ao índice os mesmos dados indexados na sales_flat_order_gridtabela não utilizada .
  3. Adicione uma nova coluna sales_flat_order_grid e garanta que o valor seja atualizado lá

Não consigo descobrir como sales_flat_order_gridestá sendo atualizado; portanto, não sei como adicionar esta nova coluna. Alguma ideia?

Colin O'Dell
fonte

Respostas:

17

A sales_flat_order_gridtabela é atualizada a cada ação salva. Você pode adicionar colunas personalizadas à tabela em sua própria extensão. Se você adicionar um nome de coluna que já seja usado na tabela sales_flat_order, não precisará adicionar mais nada; em cada ação de salvar pedidos, as colunas serão atualizadas (se necessário) . Se você deseja inserir dados de uma tabela diferente, será necessário criar um observador para o sales_order_resource_init_virtual_grid_columnsevento para coletar e preparar a associação.

Para obter mais detalhes e um exemplo de trabalho, consulte minha resposta em Adicionar coluna a uma grade (observador) - coluna 'store_id' na cláusula where onde é um problema ambíguo

Vladimir Kerkhoff
fonte
Você tem certeza de que esta atualização é baseada apenas no nome da coluna? No meu caso, não funcionou até eu excluir e recriar o atributo com "grid" => true. Simplesmente ALTERAR ambas as tabelas para adicionar uma coluna idêntica não era suficiente nem chamar updateAttribute () no atributo existente. (Eu tive a idéia de esta pergunta: stackoverflow.com/a/11254067/884734 )
Eric Seastrand
Com o atributo grid = true, o script de configuração cria o atributo dentro da tabela slas_flat_order e da tabela sales_flat_order_grid. Isso fará com que a atualização de um pedido o salve nas duas tabelas.
precisa saber é o seguinte
9

Eu fiz a mesma coisa. Adicionado o campo 'order_type' em ordem e exibido na grade. Está funcionando perfeitamente no Magento ver 1.7.0.2

Como adicionar o campo Tipo de pedido na grade de pedidos de vendas no admin?

1) Temos que criar um arquivo sql de instalação com o código abaixo.

<?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) Substitua o arquivo Mage_Adminhtml_Block_Sales_Order_Grid e inclua o código abaixo nele.

<?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) Crie um evento observador para adicionar / atualizar o valor do campo do tipo de pedido

Abra seu 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) Crie um arquivo observador da 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
fonte
2

Eu usei o seguinte código semelhante. Está funcionando bem.

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