Aggiunta di campi personalizzati a sales_flat_order


14

Ho fatto una buona quantità di ricerche su google, tentativi ed errori, ma non riesco a trovare una soluzione al problema.

  1. La possibilità di modificare i campi e l'ordine di sales_order_grid; e
  2. La possibilità di visualizzare due campi personalizzati su questa griglia (filtrabile).

Il primo (punto 1) è stato risolto estendendo il Mage_Adminhtml_Block_Widget_Gridmio modulo personalizzato (conosco gli osservatori, ma altri moduli installati stavano sostituendo le mie modifiche con i loro osservatori).

Indipendentemente da ciò, quest'ultimo è il mio problema attuale, di seguito sono riportati i due metodi che finora mi hanno deluso.

Metodo 1

<?php
/*  @var $this Mage_Sales_Model_Mysql4_Setup  */
$this->startSetup();
$connection = $this->getConnection();

/**
 * Create the payment method dropdown field, because this field _may_ be
 * used for searching we will create an index for it.
 */
$connection->addColumn(
    $this->getTable('sales/order_grid'),
    'x_payment_method',
    "ENUM('PayPal', 'SagePay') DEFAULT NULL"
);
$connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');

/**
 * Create the order channel field to identify where the order was originally
 * generated from. Also add an index for this field for additional filtering.
 */
$connection->addColumn(
    $this->getTable('sales/order_grid'),
    'x_sale_channel',
    "ENUM('Amazon', 'Play', 'eBay', 'Website') NOT NULL DEFAULT 'Website'"
);
$connection->addKey($this->getTable('sales/order_grid'), 'x_sale_channel','x_sale_channel');

$this->endSetup();

Metodo 2

A questo punto ero stanco di leggere gli stessi 7 articoli che non mi hanno aiutato, quindi ho cercato di far funzionare UN campo; Ho anche verificato i log degli errori in Magento e ho trovato "$ this-> getTable ()" errato, quindi l'ho rimosso.

<?php
/*  @var $this Mage_Sales_Model_Mysql4_Setup  */
$this->startSetup();
$connection = $this->getConnection();

/**
 * Create the payment method dropdown field, because this field _may_ be
 * used for searching we will create an index for it.
 */
$this->addAttribute('sales_flat_order', 'x_test_option', array(
    'label' => 'X Test Option',
    'type' => 'varchar',
    'input' => 'select',
    'visible' => true,
    'required' => false,
    'position' => 1,
    'visible_on_front'  => false,
    'option' => array('value' => array('web', 'test 1', 'test 2')),
    'default' => array('web'),
));

$this->endSetup();

Ciò che fa sorgere la domanda, qual è la differenza tra una colonna e un attributo? La mia presunzione iniziale era che, una colonna veniva aggiunta a una tabella core esistente mentre un attributo veniva aggiunto alle tabelle EAV_ * e opportunamente correlato.


Anche se quella tabella è piatta, il modello di risorsa è EAV, quindi l'attributo deve essere registrato nella configurazione EAV per essere scritto. Diverse entità di vendita erano in precedenza EAV, ma erano state appiattite per motivi di prestazioni.
benmarks

Risposte:


11

La tua presunzione è corretta.
Ma per il sales_tavolo sono la stessa cosa.
Inizialmente le entità di vendita erano EAV. Sono cambiati in tabelle piane a partire dalla versione 1.4.0.1 (credo). E per compatibilità con le versioni precedenti entrambi i metodi sono stati mantenuti.
Per qualsiasi altro piatto presentato le entità (pagine CMS, blocchi, sondaggi), non è possibile utilizzare addAttribute, solo addColumn, ma per le vendite funziona in entrambe le direzioni.
Se hai intenzione di creare un'estensione che deve essere compatibile con le versioni precedenti alla 1.4, allora usa addAttribute, altrimenti non vedo alcun punto in essa.


Grazie per le informazioni, lo trovo davvero utile. In realtà, ora a pensarci, suppongo che il modo giusto sia usare il addColumnmetodo? Anche se non si utilizza 'getTable' come sales_flat_order è proprio questo. Lo proverò a breve, e tornerò con un virdict :)
ash

2
Si scopre che ho avuto due problemi (uno che ho trascurato); Uno $this->getTable('sales/flat_order')poteva anche essere impostato su sales_flat_order; il secondo era $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typeavrebbe dovuto essere x_payment_method.
cenere
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.