Добавить новый столбец в sales_flat_order_grid

14

Как я могу добавить новый столбец в sales_flat_order_gridтаблицу и убедиться, что значения там правильно вставлены?

«Источник» для нового столбца - это пользовательский столбец, к которому мы добавили sales_flat_order, давайте назовем его foo. AFAICT, есть три способа попасть fooв основную сетку заказов:

  1. JOINsales_flat_order_gridсбор на sales_flat_order.
    • Проблема: фильтры больше не работают из-за неоднозначных столбцов (поскольку обе таблицы имеют одинаковые имена столбцов)
  2. Используйте сетку sales_flat_orderдля данных вместо sales_flat_order_grid.
    • Проблема: столбцы не индексируются, поэтому фильтрация ужасно медленная. Кажется глупым добавлять в индекс те же данные, проиндексированные в неиспользованныхsales_flat_order_grid таблице.
  3. Добавьте новый столбец sales_flat_order_grid и убедитесь, что значение обновляется там

Я не могу понять, как sales_flat_order_gridобновляется, поэтому я не знаю, как добавить этот новый столбец. Есть предположения?

Колин О'Делл
источник

Ответы:

17

sales_flat_order_gridТаблица обновляется при каждом заказе Сохранить действие. Вы можете добавить пользовательские столбцы в таблицу в своем собственном расширении, если вы добавляете имя столбца, которое уже используется в таблице sales_flat_order, вам не нужно добавлять ничего лишнего, при каждом действии сохранения заказа столбцы обновляются (при необходимости) , Если вы хотите вставить данные из другой таблицы, вам нужно создать наблюдателя для sales_order_resource_init_virtual_grid_columnsсобытия, чтобы собрать и подготовить объединение.

Для получения более подробной информации и рабочего примера см. Мой ответ в « Добавление столбца к сетке (наблюдатель)» - столбец «store_id», где предложение является неоднозначным вопросом

Владимир Керхофф
источник
Вы уверены, что это обновление основано исключительно на имени столбца? В моем случае это не сработало, пока я не удалил и не создал заново атрибут с помощью «grid» => true. Недостаточно просто изменить обе таблицы, чтобы добавить идентичный столбец, и не вызывать updateAttribute () для существующего атрибута. (Я получил идею из этого вопроса: stackoverflow.com/a/11254067/884734 )
Эрик Сеастранд
С атрибутом grid = true сценарий установки создает атрибут в таблице slas_flat_order и в таблице sales_flat_order_grid. Это заставит обновление заказа сохранить его в обеих таблицах.
Владимир Керхофф
9

Я сделал то же самое. Добавил поле order_type в порядок и отобразил его в сетке. Он отлично работает в Magento версии 1.7.0.2

Как добавить поле Тип заказа в сетке заказов на продажу в админке?

1) Мы должны создать один установочный файл sql с кодом ниже.

<?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) Переопределите файл Mage_Adminhtml_Block_Sales_Order_Grid и добавьте в него код ниже.

<?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) Создать одно событие наблюдателя для добавления / обновления значения поля типа заказа

Откройте ваш модуль / 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) Создайте один файл наблюдателя класса 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

Я использовал следующий похожий код. Работает нормально.

$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();
Прафул Раджпут
источник