カート内のアイテムからカスタム オプションを更新したい。アイテム ID があるので、コントローラーにアイテムをロードできます。カートからアイテムを削除し、更新されたオプションで新しいアイテムを追加できますが、それは私が望むものではありません。
カート内の既存のアイテムを直接更新したい。それを行う方法はありますか?
ありがとう!
カート内のアイテムからカスタム オプションを更新したい。アイテム ID があるので、コントローラーにアイテムをロードできます。カートからアイテムを削除し、更新されたオプションで新しいアイテムを追加できますが、それは私が望むものではありません。
カート内の既存のアイテムを直接更新したい。それを行う方法はありますか?
ありがとう!
構成可能な製品で正確な問題が発生しています。
今のところ、Magento は「カート項目の編集」ページに構成可能な製品オプションを表示し、オプションのリストは構成可能な属性を事前に選択せずに生成されることを知っています。この属性は、によって生成されたデータを取得する JavaScript によって設定されます。
<script type="text/javascript">
var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>
ただし、選択した属性は「カート項目の編集」ページにのみ表示されます。手動で呼び出すと、現在の属性の選択が表示されません。
私が知っているように、一部のチェックアウトモジュールは、選択された属性をカートオーバービューにも表示します-そのため、Magento からそのデータを取得することができます (ただし、DB から直接取得したのか、より使いやすい方法で取得したのかはわかりません)。
config.xml 部分
<events>
<checkout_cart_update_items_after>
<observers>
<update_items_specific_option>
<class>mycompany_checkout/observer</class>
<method>updateItemsSpecificOption</method>
</update_items_specific_option>
</observers>
</checkout_cart_update_items_after>
</events>
app/code/local/MyCompany/Observer.php 部分
<?php
class MyCompany_Checkout_Model_Observer
extends Varien_Event_Observer
{
public function updateItemsSpecificOption($observer)
{
$event = $observer->getEvent();
$cart = $event->getCart();
$data = $event->getInfo();
foreach ($data as $itemId => $itemInfo) {
$item = $cart->getQuote()->getItemById($itemId);
if (!$item) {
continue;
}
$optionData = $this->_getSpecificOptionDataFromItem($item);
if(!$optionData) {
continue;
}
$params = clone $item->getBuyRequest();
$options = $params->getOptions() ? $params->getOptions() : array();
$updateItem = false;
if($shouldIRemoveOption) {
unset($options[$optionData['option_id']]);
$updateItem = true;
} elseif($shouldIAddOption) {
$options[$optionData['option_id']] = array($optionData['value_id']);
$updateItem = true;
}
if($updateItem) {
$params->setOptions($options);
$cart->updateItem($itemId, $params);
}
}
}
protected function _getSpecificOptionDataFromItem($item)
{
foreach($item->getProduct()->getOptions() as $option) {
if($this->_isMyNeededOption($option)) {
foreach($option->getValues() as $valueId => $value) {
if($this->_isMyNeededValue($value)) {
return array(
'option_id' => $option->getId(),
'value_id' => $valueId,
'price' => $value->getPrice()
);
}
}
}
}
return false;
}
}
カスタムオプションを変更したい正確な場所がわからないので、カートの更新アクション中にそれを行うオブザーバーがここにあります