Dodawanie niestandardowych pól do Sales_flat_order

14

Robiłem sporo google, prób i błędów, ale nie mogę znaleźć rozwiązania problemu.

  1. Możliwość zmiany pól i kolejności Sales_order_grid; i
  2. Możliwość wyświetlania dwóch niestandardowych pól w tej siatce (filtrowalnych).

Ten pierwszy (punkt 1) został rozwiązany poprzez rozszerzenie Mage_Adminhtml_Block_Widget_Gridmodułu niestandardowego (wiem o obserwatorach, ale inne zainstalowane moduły zastępowały moje zmiany ich obserwatorami).

Niezależnie od tego, ten drugi problem jest moim obecnym problemem, poniżej są dwie metody, które do tej pory mnie zawiodły.

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

Metoda 2

W tym momencie miałem już dość czytania tych samych 7 artykułów, które nie pomogły, więc próbowałem uruchomić JEDEN teren; Sprawdziłem także dzienniki błędów w Magento i stwierdziłem, że „$ this-> getTable ()” było błędne, więc go usunąłem.

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

Co nasuwa pytanie, jaka jest różnica między kolumną a atrybutem? Moje wstępne założenie było takie, że kolumna jest dodawana do istniejącej tabeli podstawowej, podczas gdy atrybut jest dodawany do tabel EAV_ * i odpowiednio powiązany.

popiół
źródło
Mimo że ta tabela jest płaska, jej modelem zasobów jest EAV, dlatego atrybut musi zostać zarejestrowany w konfiguracji EAV, aby można go było zapisać. Kilka podmiotów handlowych było kiedyś EAV, ale zostały spłaszczone ze względu na wydajność.
zyskuje

Odpowiedzi:

11

Twoje domniemanie jest prawidłowe.
Ale dla sales_stołu są one takie same.
Początkowo jednostkami sprzedaży były EAV. Zmienili się na płaskie tabele, zaczynając od wersji 1.4.0.1 (tak myślę). Dla zachowania zgodności wstecznej obie metody zostały zachowane.
W przypadku innych płaskich zgłoszona podmioty (strony cms, bloki, polls) nie można używać addAttribute, tylko addColumn, ale do sprzedaży to działa w obie strony.
Jeśli planujesz zrobić rozszerzenie, które musi być kompatybilne z wersjami wcześniejszymi niż 1.4, użyj addAttribute, w przeciwnym razie nie widzę w tym sensu.

Marius
źródło
Dzięki za informacje, uważam to za bardzo pomocne. Właściwie, teraz myśląc o tym, przypuszczam, że właściwym sposobem jest użycie addColumnmetody? Chociaż nie używa się również „getTable”, ponieważ Sales_flat_order jest po prostu tym. Postaram się, że wkrótce i powrót z virdict :)
popiół
2
Okazuje się, że miałem dwa problemy (jeden przeoczyłem); Można było $this->getTable('sales/flat_order')równie dobrze ustawić jeden sales_flat_order; drugi był $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typepowinno być x_payment_method.
popiół