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하려면 조인을 수집하고 준비 할 이벤트에 대한 관찰자를 작성해야합니다 .

자세한 내용과 실제 예제 는 그리드에 열 추가 (관찰자)-where 절이 모호한 문제의 'store_id'열에 내 대답을 참조하십시오.


이 업데이트가 열 이름만을 기반으로한다고 확신하십니까? 제 경우에는 "grid"=> true로 속성을 삭제하고 다시 만들 때까지 작동하지 않았습니다. 동일한 열을 추가하기 위해 두 테이블을 모두 변경하는 것만으로는 충분하지 않으며 기존 속성에서 updateAttribute ()를 호출하지도 않았습니다. (이 질문에서 아이디어를 얻었습니다 : stackoverflow.com/a/11254067/884734 )
Eric Seastrand

grid = true 속성을 사용하여 설정 스크립트는 속성 비정형 slas_flat_order 및 sales_flat_order_grid 테이블을 작성합니다. 그러면 주문 업데이트가 두 테이블 모두에 저장됩니다.
Vladimir Kerkhoff

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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.