概要
製品に保存されない、または通常の製品属性のように製品編集ページに表示されない製品属性を作成します。代わりに、注文/見積品目に保存し、注文、請求書などに表示する必要があります。また、カートに製品を追加する前に、フロントエンドで顧客が構成できる必要があります。
詳細
私の質問
<input>
から見積アイテムに値を検証し、最終的に値を保存するにはどうすればよいですか?更新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を解決しました。しかし、私はまだこのコードを実行するのに適している場所を知りません。バックエンドの注文/見積もり/レポートページに表示します。また、これはデータベースにシリアル化された値として保存されているため、カスタムデータに基づいて見積もり/注文アイテムのコレクションを取得することは最も困難です。
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
_)に頼らなければなりません。
カスタム項目を見積アイテムに追加することができます。 注文明細のカスタムフィールドを追加する方法 Magentoで開始します。最近、これらの手順を使用してカスタムフィールドをMagentoの見積もり項目に追加しましたが、コンセプトは良好ですが、その記事にはあまり良くないプラクティスがいくつかあります。私が違うことをしたいこと:
一般に、Magentoコアの変更を避け、モジュールを介してカスタマイズを適用することをお勧めします。これにより、将来のアップグレードが容易/可能になるためです。 moduleCreator の前に独自の拡張機能を作成していない場合は、必要なボイラープレートを生成できます。
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')