web-dev-qa-db-ja.com

Magento-ユーザー入力に基づく見積/注文製品アイテム属性

概要

製品に保存されない、または通常の製品属性のように製品編集ページに表示されない製品属性を作成します。代わりに、注文/見積品目に保存し、注文、請求書などに表示する必要があります。また、カートに製品を追加する前に、フロントエンドで顧客が構成できる必要があります。

詳細

  • カスタムオプションと同様に、フロントエンド製品ページにフォーム要素を追加する必要があります。
    • nlikeカスタムオプション、これはactual製品属性ではありません。管理製品ページまたは属性セットには表示されません。
    • 顧客は有効な値を提供する必要があります。サーバー側の検証を行える必要があります。
    • Htmlを生成する.phtmlテンプレートが必要です。現在、私はapp/design/frontend/base/default/catalog/product/view/type/default.phtmlを満足のいく(design ) 結果。しかし、その価値をキャプチャし、検証し、最終的に保存する方法はわかりません。
  • このフォーム要素の値は、見積/注文製品アイテムとともに保存する必要があります。
    • この値は、すべての請求書、注文、販売メールに表示される必要があります。
    • テンプレートで出力を制御したい、または少なくとも値を表示するために使用される文字列を返すことができるようにしたい

私の質問

  1. 商品がカートに追加されたときに、フロントエンド商品ページの<input>から見積アイテムに値を検証し、最終的に値を保存するにはどうすればよいですか?
  2. この値を注文、請求書、販売メールなどのページに表示するにはどうすればよいですか?
  3. 注文コレクションをフィルタリングして、特定の値に設定された値を持つアイテムを含む注文を取得するにはどうすればよいですか?

更新1

catalog/productなどのイベント中にsales/quote_itemモデル(およびおそらくsales_quote_item_qty_set_after)でこのコードを実行できることを発見しました

$infoBuyRequest = $product->getCustomOption('info_buyRequest');
$buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue()));
$myData = $buyRequest->getMyData();

このようにして、製品ページの<input>から、顧客が提供したカスタムデータを取得できました。

このinfo_buyRequestは、見積品目と注文品目とともに保存されていると思われます。もしそうなら、これは部分的に私の問題1と2を解決しました。しかし、私はまだこのコードを実行するのに適している場所を知りません。バックエンドの注文/見積もり/レポートページに表示します。また、これはデータベースにシリアル化された値として保存されているため、カスタムデータに基づいて見積もり/注文アイテムのコレクションを取得することは最も困難です。

63
Vitamin

Magentoは、製品属性または製品カスタムオプションではないオプションを追加する機能を提供します。それらは製品に設定され、オプションコード_additional_options_でアイテムを引用します。

実行する必要がある2つのステップがあり、それぞれがイベントオブザーバーを介して処理できます。追加のオプションで並べ替えを実行する場合は、3番目のイベントも観察する必要があります。

見積品目にオプションを追加

最初のステップは、イベントオブザーバーを追加して、ロードされた製品がカートに追加される前に追加のオプションを設定することです。 1つのオプションは、_catalog_product_load_after_イベントを使用することです。

_<catalog_product_load_after>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>catalogProductLoadAfter</method>
        </extra_options>
    </observers>
</catalog_product_load_after>
_

イベントオブザーバでは、要求されたページが実際にカートに追加アクションである追加のチェックを追加できます。このオブザーバーメソッドの主なポイントは、特別なオプションの選択を製品モデルの_additional_options_オプションに追加することです。

_public function catalogProductLoadAfter(Varien_Event_Observer $observer)
{
    // set the additional options on the product
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'checkout_cart_add')
    {
        // assuming you are posting your custom form values in an array called extra_options...
        if ($options = $action->getRequest()->getParam('extra_options'))
        {
            $product = $observer->getProduct();

            // add to the additional options array
            $additionalOptions = array();
            if ($additionalOption = $product->getCustomOption('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            // add the additional options array with the option code additional_options
            $observer->getProduct()
                ->addCustomOption('additional_options', serialize($additionalOptions));
        }
    }
}
_

追加のオプションは、製品から見積品目に自動的に移動します。このオブザーバーが配置されると、オプションがカートとチェックアウトレビューに表示されます。

注文アイテムにオプションを追加する

それらを持続させるために、1人の追加のオブザーバーが必要です(Magento 1.5以降のみ)。

_<sales_convert_quote_item_to_order_item>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>salesConvertQuoteItemToOrderItem</method>
        </extra_options>
    </observers>
</sales_convert_quote_item_to_order_item>
_

ここで、見積品目から注文品目にオプションを移動します。

_public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
    $quoteItem = $observer->getItem();
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
        $orderItem = $observer->getOrderItem();
        $options = $orderItem->getProductOptions();
        $options['additional_options'] = unserialize($additionalOptions->getValue());
        $orderItem->setProductOptions($options);
    }
}
_

この時点から、追加オプションは、フロントエンドの顧客の注文履歴と注文メール、および管理インターフェイスの注文ビュー、請求書、出荷、クレジットメモ、PDFに表示されます。

再注文のサポートを追加する

再注文中に新しい注文にオプリオンを引き継ぐには、それらをコピーするように注意する必要があります。 _checkout_cart_product_add_after_イベントを使用する1つの可能性があります。

_<checkout_cart_product_add_after>
    <observers>
        <extra_options>
            <type>singleton</type>
            <class>extra_options/observer</class>
            <method>checkoutCartProductAddAfter</method>
        </extra_options>
    </observers>
</checkout_cart_product_add_after>
_

追加のオプションの解析と追加のオプション配列の構築は、コードの重複を避けるために別の関数に移動する必要がありますが、この例では、明確にするために各メソッドに必要なロジックを残します。

_public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'sales_order_reorder')
    {
        $item = $observer->getQuoteItem();
        $buyInfo = $item->getBuyRequest();
        if ($options = $buyInfo->getExtraOptions())
        {
            $additionalOptions = array();
            if ($additionalOption = $item->getOptionByCode('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            $item->addOption(array(
                'code' => 'additional_options',
                'value' => serialize($additionalOptions)
            ));
        }
    }
}
_

翻訳:

これらのオプションのラベルまたは値を変換するメカニズムはありません。その点で役立つかもしれないいくつかのアイデアを以下に示します。

Quote_item_load_afterイベントオブザーバーで、追加のオプション配列を取得し、$option['print_value'] = $helper->__($option['value']);を設定します。 _print_value_が設定されている場合、Magentoはそれを表示のレンダリングに使用します。
注文アイテムでも同じことができます。

_print_label_のようなものはありませんが、カスタムインデックス(_label_source_多分)を設定し、それをソースとして使用してラベルをオンザフライで設定できます。 $option['label'] = $helper->__($option['label_source']);

それを超えると、おそらくテンプレートの変更(getItemOptions()のgrep)、またはブロッククラスのオーバーライド(grep _additional_options_)に頼らなければなりません。

140
Vinai

カスタム項目を見積アイテムに追加することができます。 注文明細のカスタムフィールドを追加する方法 Magentoで開始します。最近、これらの手順を使用してカスタムフィールドをMagentoの見積もり項目に追加しましたが、コンセプトは良好ですが、その記事にはあまり良くないプラクティスがいくつかあります。私が違うことをしたいこと:

  1. 直接実行するのではなく、セットアップスクリプトを使用してデータベースにフィールドを追加します。
  2. $ _REQUESTに直接アクセスするのではなく、MagentoのRequestオブジェクトを使用します。
  3. Magentoコアを変更するのではなく、拡張機能と書き換えを使用します。
  4. コアを変更するのではなく、拡張機能からconfig.xmlを変更します。

一般に、Magentoコアの変更を避け、モジュールを介してカスタマイズを適用することをお勧めします。これにより、将来のアップグレードが容易/可能になるためです。 moduleCreator の前に独自の拡張機能を作成していない場合は、必要なボイラープレートを生成できます。

11
Jim OHalloran

Magento 1.8での私のソリューション

アイテムを引用するオプションを設定

$quoteItem = $cart->getQuote()->getItemById($itemId);
$quoteItem->addOption(array('label' => 'buymode', 'code' => 'buymode', 'value' => $data['buymode']));
$quoteItem->save();

QuoteItemからのアクセスオプション

$quoteItem->getOptionByCode('buymode')->getValue();

OrderItemへの転送オプション

イベントに登録sales_convert_quote_item_to_order_item

public function onConvertQuoteItemToOrderItem($observer) {
    $orderItem = $observer->getOrderItem();
    $quoteItem = $observer->getItem();
    $options = $orderItem->getProductOptions();
    $options['buymode'] = $quoteItem->getOptionByCode('buymode')->getValue();
    $orderItem->setProductOptions($options);
}

OrderItemからのアクセスオプション

$orderItem->getProductOptionByCode('buymode')
1
wutzebaer