Hinzufügen von benutzerdefinierten Feldern zu sales_flat_order

14

Ich habe viel gegoogelt, probiert und geirrt, aber ich kann keine Lösung für das Problem finden.

  1. Die Möglichkeit, die Felder und die Reihenfolge von sales_order_grid zu ändern. und
  2. Die Möglichkeit, zwei benutzerdefinierte Felder in diesem Raster anzuzeigen (filterbar).

Ersteres (Punkt 1) wurde gelöst, indem das Mage_Adminhtml_Block_Widget_GridModul in meinem benutzerdefinierten Modul erweitert wurde (ich weiß über Beobachter Bescheid, aber andere installierte Module haben meine Änderungen mit ihren Beobachtern überschrieben).

Unabhängig davon, letzteres ist mein aktuelles Problem, im Folgenden sind die beiden Methoden aufgeführt, die mich bisher gescheitert sind.

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

Methode 2

Zu diesem Zeitpunkt hatte ich es satt, die gleichen 7 Artikel zu lesen, die mir nicht weitergeholfen haben, und versuchte, EIN Feld zum Laufen zu bringen. Ich habe auch die Fehlerprotokolle in Magento überprüft und festgestellt, dass "$ this-> getTable ()" fehlerhaft war. Daher habe ich es entfernt.

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

Was wirft die Frage auf, was ist der Unterschied zwischen einer Spalte und einem Attribut? Meine ursprüngliche Annahme war, dass eine Spalte zu einer vorhandenen Kerntabelle hinzugefügt wird, während ein Attribut zu den EAV_ * -Tabellen hinzugefügt und entsprechend verknüpft wird.

Asche
quelle
Obwohl diese Tabelle flach ist, ist das Ressourcenmodell für sie EAV, daher muss das Attribut in der EAV-Konfiguration registriert werden, in die geschrieben werden soll. Einige Vertriebsgesellschaften waren früher EAV, wurden jedoch aus Leistungsgründen abgeflacht.
Benmarks

Antworten:

10

Ihre Vermutung ist richtig.
Aber für den sales_Tisch sind sie ein und dasselbe.
Ursprünglich waren die Vertriebsgesellschaften EAV. Sie haben sich ab Version 1.4.0.1 in flache Tabellen verwandelt (glaube ich). Aus Gründen der Abwärtskompatibilität wurden beide Methoden beibehalten.
Für alle anderen Objekte mit flachen Tabellen (CMS-Seiten, Blöcke, Abstimmungen) können Sie nicht addAttributenur verwenden addColumn, sondern für Verkäufe funktioniert es in beide Richtungen.
Wenn Sie vorhaben, eine Erweiterung zu erstellen, die mit Versionen vor 1.4 kompatibel sein muss, dann verwenden Sie addAttribute, sonst sehe ich keinen Sinn darin.

Marius
quelle
Danke für die Info ich finde das echt hilfreich. Wenn ich jetzt darüber nachdenke, nehme ich an, dass der richtige Weg darin besteht, die addColumnMethode anzuwenden ? Auch wenn 'getTable' nicht als sales_flat_order verwendet wird, ist dies genau das. Ich werde das gleich ausprobieren und mit einem Verrückten zurückkehren :)
ash
2
Es stellte sich heraus, dass ich zwei Probleme hatte (eines, das ich übersehen hatte); Man konnte $this->getTable('sales/flat_order')genauso gut eingestellt werden sales_flat_order; der zweite war $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typehätte sein sollen x_payment_method.
Asche