Додати новий стовпець у 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оновлюється, тому не знаю, як додати цю нову колонку. Будь-які думки?

Відповіді:


18

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 ver 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.