Сохранение дополнительных данных с заказом в Magento

Мне нужно добавить столбец на страницу заказов, что означает добавление столбца в sales_flat_order_grid. Обе эти возможности возможны, однако я не знаю, как добавить значение, чтобы оно сохранялось в моем новом столбце.

Нужно ли регистрировать новый атрибут?
Значение отсутствует в цитате, поэтому, я думаю, мне не нужно регистрироваться в config/global/fieldsets/sales_convert_quote, так как значение не должно быть преобразовано.

Использование Magento Enterprise 1.8.

Ответы

Ответ 1

После многих проб и ошибок - много ошибок - я думаю, что у меня есть это сейчас.

В начале sales_flat_order_grid обновляется в Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords(), следуя следующему маршруту, который я разработал, он проверяет как "основную" таблицу (sales_flat_order), так и основную таблицу + "_grid" (sales_flat_order_grid), берет пересечение их столбцов и строит запрос из этого. Поэтому любой столбец, который вам нужен в таблице сетки, также должен находиться в главной таблице. Это не объект EAV-стиля, поэтому атрибуты не нужно создавать.
Вот моя настройка script:

<?php

/* @var $this Nexxt_Booth_Model_Entity_Setup */
$installer = $this;

$installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'box_num', 'varchar(255)');
$installer->getConnection()->addColumn($installer->getTable('sales_flat_order_grid'), 'box_num', 'varchar(255)');

Затем мне понадобился дополнительный столбец для отображения во всех таблицах заказов в admin. Для этого я перепробовал каждый соответствующий блок.

<?xml version="1.0"?>
<config>
    ....

    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <customer_edit_tab_view_orders>
                    <!-- Recent 5 orders on customer page -->
                        My_Module_Block_Adminhtml_Customer_Edit_Tab_View_Orders
                    </customer_edit_tab_view_orders>
                    <customer_edit_tab_orders>
                    <!-- All orders on customer tab -->
                        My_Module_Block_Adminhtml_Customer_Edit_Tab_Orders
                    </customer_edit_tab_orders>
                    <sales_order_grid>
                    <!-- All orders in Sales menu -->
                        My_Module_Block_Adminhtml_Sales_Order_Grid
                    </sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

В My/Module/Block/Adminhtml/Sales/Order/Grid.php я сделал следующее:

<?php

class My_Module_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid

    protected function _prepareColumns()
    {
        $this->addColumn('box_num', array(
            'header'    => $this->__('Box #'),
            'index'     => 'box_num',
            'width'     => '100px'
        ));
        $this->addColumnsOrder('box_num', 'shipping_name');
        return parent::_prepareColumns();
    }

}

Аналогично, в My/Module/Block/Adminhtml/Customer/Edit/Tab/Orders.php и My/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php я добавил эту функцию:

    protected function _prepareColumns()
    {
        $this->addColumn('box_num', array(
            'header'    => $this->__('Box #'),
            'index'     => 'box_num',
            'width'     => '100px'
        ));
        $this->addColumnsOrder('box_num', (Mage::app()->isSingleStoreMode() ? 'grand_total' : 'store_id'));
        return parent::_prepareColumns();
    }

Наконец, чтобы закончить, в случае sales_convert_quote_to_order я заполнил новое поле. Этот бит не так важен, пока вы добавляете данные в точку до сохранения порядка.

$order->setBoxNum('DATA GOES HERE');

Ответ 2

вам нужно добавить атрибуты, лучший способ сделать это - через обновление или настройку расширений script. Поскольку порядок и цитата основаны на структурах с плоскими таблицами, это действительно означает добавление большего количества полей в эти таблицы.

также см. ALTER TABLE в настройке Magento script без использования SQL

Ответ 3

Кроме того, вы можете использовать это для добавления нового "атрибута" (на самом деле это столбец, потому что он плоский) для обоих: sales_flat и sales_flat_ _grid

$installer->addAttribute('order', 'box_num', array(
'label'    => 'Box Number',
'type'     => 'varchar',
'grid'     => true      // this is important
));

ваш установщик должен быть: Mage_Sales_Model_Entity_Setup для использования ключа сетки.

И помните, если вы добавляете существующий столбецd из sales_flat_order в sales_flat_order_grid, то вам нужно повторно синхронизировать таблицу sales_flat_order_grid:

В Magento, как я могу заполнить новый столбец в sales_order_grid данными из sales_flat_order?