カスタムオプションは、オプションIDと値としてのみ引用符に格納されます。オプションがレンダリングされるたびに、基本的にデータベースからリロードされます。
値を変更する場合は、値を保存する必要があります。値を設定すると、すべてのユーザーに設定されます。
つまり、イベントオブザーバを使用して、修正された値を追加したカスタムオプションをオンザフライで追加することで、この問題を回避します。このために私は追加オプションを使用します。
次に、元のカスタムオプションを引用品目から削除します。
最大1.4 Magentoは残りの部分を処理しましたが、その後は追加オプションを手動で注文アイテムにコピーする必要があります。また、アイテムが並べ替えられた場合には再度設定するように注意する必要があります。
ここでは、オブザーバの設定例を示します。
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>checkoutCartProductAddAfter</method>
</customoptions>
</observers>
</checkout_cart_product_add_after>
<sales_convert_quote_item_to_order_item>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</customoptions>
</observers>
</sales_convert_quote_item_to_order_item>
</events>
</frontend>
残りはオブザーバークラスで処理されます。
/**
* Add additional options to order item product options (this is missing in the core)
*
* @param Varien_Event_Observer $observer
*/
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);
}
}
/**
* Manipulate the custom product options
*
* @param Varien_Event_Observer $observer
* @return void
*/
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$item = $observer->getQuoteItem();
$infoArr = array();
if ($info = $item->getProduct()->getCustomOption('info_buyRequest')) {
$infoArr = unserialize($info->getValue());
}
// Set additional options in case of a reorder
if ($infoArr && isset($infoArr['additional_options'])) {
// An additional options array is set on the buy request - this is a reorder
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($infoArr['additional_options'])
));
return;
}
$options = Mage::helper('catalog/product_configuration')->getCustomOptions($item);
foreach ($options as $option)
{
// The only way to identify a custom option without
// hardcoding ID's is the label :-(
// But manipulating options this way is hackish anyway
if ('Size' === $option['label'])
{
$optId = $option['option_id'];
// Add replacement custom option with modified value
$additionalOptions = array(array(
'code' => 'my_code',
'label' => $option['label'],
'value' => $option['value'] . ' YOUR EXTRA TEXT',
'print_value' => $option['print_value'] . ' YOUR EXTRA TEXT',
));
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($additionalOptions),
));
// Update info_buyRequest to reflect changes
if ($infoArr &&
isset($infoArr['options']) &&
isset($infoArr['options'][$optId]))
{
// Remove real custom option
unset($infoArr['options'][$optId]);
// Add replacement additional option for reorder (see above)
$infoArr['additional_options'] = $additionalOptions;
$info->setValue(serialize($infoArr));
$item->addOption($info);
}
// Remove real custom option id from option_ids list
if ($optionIdsOption = $item->getProduct()->getCustomOption('option_ids')) {
$optionIds = explode(',', $optionIdsOption->getValue());
if (false !== ($idx = array_search($optId, $optionIds))) {
unset($optionIds[$idx]);
$optionIdsOption->setValue(implode(',', $optionIds));
$item->addOption($optionIdsOption);
}
}
// Remove real custom option
$item->removeOption('option_' . $optId);
}
}
これは一言で言えば、エラーチェックを追加し、必要に応じてカートに同じ製品を再度追加するような特殊なケースを処理します。
希望すると、これでカスタム製品オプションの使用を開始できます。一度あなたがそれらに精通すると、半分悪くはありません。
あなたは何とか、この追加データを保存していますか?注文の管理者を確認するときに、腰、胸、長さなどが表示されますか? – seanbreeden
申し訳ありませんが、私は十分に明確でなかった場合。私はphtmlファイルでハードコードされているjavascriptの場合、この情報を表示します。たとえば、(val == small)then Waist 30、Chest 36、Length 42 ... を表示します。この追加情報を注文に追加して、アイテムごとに保存するようにします。 – Farrukh