Добавление пользовательских полей в sales_flat_order

14

Я занимался поиском, пробой и ошибкой, но не могу найти решение проблемы.

  1. Возможность изменения полей и порядка sales_order_grid; и
  2. Возможность отображения двух пользовательских полей в этой сетке (фильтруется).

Первый (пункт 1) был решен путем расширения Mage_Adminhtml_Block_Widget_Gridв моем пользовательском модуле (я знаю о наблюдателях, но другие установленные модули переопределяли мои изменения со своими наблюдателями).

Несмотря на это, последняя моя проблема, ниже приведены два метода, которые до сих пор подводили меня.

Способ 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();

Способ 2

К этому моменту я устал читать те же 7 статей, которые не помогли, поэтому я попытался заставить работать ОДНО поле; Я также проверил журналы ошибок в Magento и обнаружил, что «$ this-> getTable ()» был ошибочным, поэтому я удалил его.

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

Что заставляет задаться вопросом: в чем разница между столбцом и атрибутом? Я исходил из того, что столбец добавляется в существующую базовую таблицу, а атрибут добавляется в таблицы EAV_ * и соответствующим образом связывается.

ясень
источник
Несмотря на то, что эта таблица плоская, модель ресурсов для нее - EAV, следовательно, атрибут должен быть зарегистрирован в конфигурации EAV для записи. Несколько торговых объектов раньше были EAV, но были сглажены по соображениям производительности.
отметки

Ответы:

11

Ваше предположение верно.
Но для sales_таблицы они одно и то же.
Первоначально субъектами продаж были EAV. Они превратились в плоские столы, начиная с версии 1.4.0.1 (я думаю). И для обратной совместимости оба метода были сохранены.
Для любых других объектов с плоскими таблицами (страницы CMS, блоки, опросы) вы не можете использовать addAttributeтолько addColumn, но для продаж это работает в обоих направлениях.
Если вы планируете сделать расширение, которое должно быть совместимо с версиями до 1.4, используйте его addAttribute, иначе я не вижу в этом смысла.

Мариус
источник
Спасибо за информацию, я считаю это действительно полезным. На самом деле, сейчас, думая об этом, я полагаю, что правильный способ заключается в использовании addColumnметода? Хотя также не используется getTable в качестве sales_flat_order, это просто так. Я попробую это в ближайшее время и вернусь с вирдиктом :)
пепел
2
Оказывается, у меня было две проблемы (одну я упустил из виду); Один из них $this->getTable('sales/flat_order')может быть также установлен sales_flat_order; второй был $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typeдолжен был быть x_payment_method.
ясень