Agregar campos personalizados a sales_flat_order

14

He estado buscando bastante en Google, prueba y error, pero no puedo encontrar una solución al problema.

  1. La capacidad de cambiar los campos y el orden de sales_order_grid; y
  2. La capacidad de mostrar dos campos personalizados en esta cuadrícula (filtrable).

El primero (punto 1) se resolvió extendiendo el Mage_Adminhtml_Block_Widget_Gridmódulo personalizado (sé sobre observadores, pero otros módulos instalados anulaban mis cambios con sus observadores).

De todos modos, este último es mi problema actual, a continuación se encuentran los dos métodos que me han fallado hasta ahora.

Método 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();

Método 2

En este punto, estaba cansado de leer los mismos 7 artículos que no me ayudaron, así que intenté hacer que UN campo funcionara; También verifiqué los registros de error en Magento y descubrí que "$ this-> getTable ()" era erróneo, por lo que lo eliminé.

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

Lo que hace que uno se pregunte, ¿cuál es la diferencia entre una columna y un atributo? Mi suposición inicial fue que, una columna se agrega a una tabla principal existente mientras que un atributo se agrega a las tablas EAV_ * y se relaciona adecuadamente.

ceniza
fuente
Aunque esa tabla es plana, el modelo de recurso para ella es EAV, por lo tanto, el atributo debe registrarse en la configuración de EAV para poder escribirlo. Varias entidades de ventas solían ser EAV pero fueron aplastadas por razones de rendimiento.
Benmarks

Respuestas:

11

Tu presunción es correcta.
Pero para la sales_mesa son uno y lo mismo.
Inicialmente, las entidades de ventas eran EAV. Cambiaron a tablas planas a partir de la versión 1.4.0.1 (creo). Y por compatibilidad con versiones anteriores, se mantuvieron ambos métodos.
Para cualquier otra entidad con tablas planas (páginas cms, bloques, encuestas) que no puede usar addAttribute, solo addColumn, pero para ventas funciona en ambos sentidos.
Si planea hacer una extensión que tenga que ser compatible con versiones anteriores a la 1.4 addAttribute, úsela, de lo contrario, no veo ningún punto en ello.

Marius
fuente
Gracias por la información, esto me parece realmente útil. En realidad, ahora que lo pienso, supongo que la forma correcta es usar el addColumnmétodo. Si bien tampoco está usando 'getTable' como sales_flat_order, es solo eso. Probaré eso en breve, y volveré con un virdict :)
ash
2
Resulta que tuve dos problemas (uno que pasé por alto); Uno también $this->getTable('sales/flat_order')podría estar configurado para sales_flat_order; el segundo fue $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typedebería haber sido x_payment_method.
ceniza