Salvataggio di dati aggiuntivi con un ordine in Magento

Devo aggiungere una colonna alla pagina degli ordini che significa aggiungere una colonna a sales_flat_order_grid . Entrambi sono possibili, tuttavia non so come aggiungere un valore in modo che venga salvato nella mia nuova colonna.

Devo registrare anche un nuovo attributo?
Il valore non è presente nella citazione quindi suppongo di non aver bisogno di registrarmi sotto config/global/fieldsets/sales_convert_quote poiché il valore non è lì da convertire.

Uso di Magento Enterprise 1.8.

Dopo un sacco di tentativi ed errori – un sacco di errori – penso di averlo adesso.

Per cominciare, il sales_flat_order_grid viene aggiornato in Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords() , seguendo la traccia che ho elaborato ispeziona sia la tabella “principale” ( sales_flat_order ) che la tabella principale + “_grid” ( sales_flat_order_grid ), prende l’intersezione della loro colonne e costruisce una query da quella. Quindi, qualsiasi colonna di cui hai bisogno nella tabella della griglia deve trovarsi anche nella tabella principale. Non è un’ quadro in stile EAV, quindi non è necessario creare attributi.
Ecco il mio script di installazione:

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

Successivamente, avevo bisogno della colonna aggiuntiva da mostrare in tutte le tabelle degli ordini in admin. Per fare questo ho scavalcato ogni blocco rilevante.

   ....       My_Module_Block_Adminhtml_Customer_Edit_Tab_View_Orders    My_Module_Block_Adminhtml_Customer_Edit_Tab_Orders    My_Module_Block_Adminhtml_Sales_Order_Grid       

In My/Module/Block/Adminhtml/Sales/Order/Grid.php ho fatto quanto segue:

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

Allo stesso modo, in My/Module/Block/Adminhtml/Customer/Edit/Tab/Orders.php e My/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php ho aggiunto questa funzione:

  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(); } 

Infine, per finire, nell’evento sales_convert_quote_to_order ho popolato il nuovo campo. Questo bit non è così importante, purché si aggiungano i dati in un punto prima che l’ordine venga salvato.

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

devi aggiungere attributi, il modo migliore per farlo è tramite l’aggiornamento delle estensioni o lo script di installazione. Poiché l’ordine e il preventivo sono basati su strutture di tabelle piatte, significa davvero aggiungere più campi a tali tabelle

vedi anche ALTER TABLE nello script di installazione di Magento senza usare SQL

Inoltre, puoi usare questo per aggiungere il nuovo “attributo” (in realtà è una colonna perché è piatta) per entrambi, il sales_flat e il sales_flat_ _grid

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

il tuo programma di installazione deve essere: Mage_Sales_Model_Entity_Setup per l’utilizzo della chiave di griglia.

E ricorda che se aggiungi un columnd esistente da sales_flat_order a sales_flat_order_grid, devi risincronizzare la tabella sales_flat_order_grid:

In Magento, come faccio a popolare una nuova colonna in sales_order_grid con i dati di sales_flat_order?