Adicionando campos personalizados ao sales_flat_order

14

Eu tenho pesquisado bastante no Google, tentativa e erro, mas não consigo encontrar uma solução para o problema.

  1. A capacidade de alterar os campos e a ordem do sales_order_grid; e
  2. A capacidade de exibir dois campos personalizados nesta grade (filtrável).

O primeiro (ponto 1) foi resolvido estendendo o Mage_Adminhtml_Block_Widget_Gridmódulo personalizado (eu sei sobre observadores, outros módulos instalados estavam substituindo minhas alterações pelos observadores).

Independentemente disso, o último é o meu problema atual, abaixo estão os dois métodos que me falharam até agora.

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

A essa altura, eu estava cansado de ler os mesmos 7 artigos que não ajudavam, então tentei fazer UM campo funcionar; Também verifiquei os logs de erro no Magento e constatei que "$ this-> getTable ()" estava incorreto e, portanto, o removi.

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

O que leva a pergunta: qual é a diferença entre uma coluna e um atributo? Minha suposição inicial era que, uma coluna é adicionada a uma tabela principal existente enquanto um atributo é adicionado às tabelas EAV_ * e relacionado adequadamente.

cinza
fonte
Mesmo que essa tabela seja plana, o modelo de recurso para ela é EAV, portanto, o atributo deve ser registrado na configuração do EAV para a qual é gravado. Várias entidades de vendas costumavam ser EAV, mas foram achatadas por razões de desempenho.
benmarks

Respostas:

11

Sua presunção está correta.
Mas para a sales_mesa eles são o mesmo.
Inicialmente, as entidades de vendas eram EAV. Eles mudaram para tabelas simples, começando com a versão 1.4.0.1 (eu acho). E para compatibilidade com versões anteriores, ambos os métodos foram mantidos.
Para quaisquer outras entidades de tabela plana (páginas cms, blocos, pesquisas), você não pode usar addAttributeapenas addColumn, mas para vendas, ele funciona nos dois sentidos.
Se você planeja criar uma extensão que deva ser compatível com as versões anteriores à 1.4, use-a addAttribute; caso contrário, não vejo sentido nela.

Marius
fonte
Obrigado pela informação, acho isso realmente útil. Na verdade, agora pensando nisso, suponho que o caminho certo é usar o addColumnmétodo? Embora também não esteja usando 'getTable', pois o sales_flat_order é exatamente isso. Vou tentar que em breve, e retornar com uma virdict :)
ash
2
Acontece que eu tive dois problemas (um que eu esqueci); Um deles $this->getTable('sales/flat_order')pode ser definido como sales_flat_order; o segundo foi $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typedeveria ter sido x_payment_method.
ash