sales_flat_orderへのカスタムフィールドの追加


14

私はかなりの量のグーグル、試行錯誤を行ってきましたが、問題の解決策を見つけることができません。

  1. sales_order_gridのフィールドと順序を変更する機能。そして
  2. このグリッドに2つのカスタムフィールドを表示する機能(フィルター可能)。

前者(ポイント1)はMage_Adminhtml_Block_Widget_Grid、カスタムモジュールを拡張することで解決されました(オブザーバーについては知っていますが、インストールされている他のモジュールは、オブザーバーによる私の変更をオーバーライドしていました)。

とにかく、後者は私の現在の問題です。以下は、これまでに失敗した2つの方法です。

方法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つの記事を読むのにうんざりしていたので、1つのフィールドを動作させようとしました。また、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メソッドを使うことだと思いますか?sales_flat_orderが 'getTable'を使用していないのはまさにそれです。私はすぐにそれを試して、有罪判決で戻ってきます:)

2
私には2つの問題があったことがわかりました(1つは見落としていました)。1つは$this->getTable('sales/flat_order')同様に設定されsales_flat_orderます。2番目は$connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typeあるべきだったx_payment_method
アッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.