2012-02-17 3 views
7

У меня есть настройка пользовательских опций для моего продукта в Magento как выпадающий т.е.Magento изменения пользовательского значения параметра, прежде чем добавить в корзину

Размер: Small, Medium, Large

На странице показывает дополнительную информацию каждый вариант с помощью javascript.

Малый - талии 30, Грудь 36, длина 42 ...
Средний - 32 талии, грудь 38, длина 44 ...
Большой - талии 34, Грудь 40, длина 48 ...

Когда я добавляю товар в корзину, я получаю заголовок размера (Маленький, Средний или Большой) в корзине, но я также хочу показать эту дополнительную информацию (Талия 30, Грудь 36, Длина 42 ...) и получить ее в порядке.

Какой лучший способ это сделать? Заранее спасибо.

+0

спасают вас эти дополнительные данные каким-то образом? Когда вы проверяете Admin для заказа, появляются ли пояса, сундук, длина и т. Д.? – seanbreeden

+0

Извините, если бы я не был достаточно ясен. Я просто показываю эту информацию, если javascript жестко закодирован в файле phtml. например, если (val == small), то покажите Waist 30, Chest 36, Length 42 ... Теперь я хочу добавить эту дополнительную информацию в заказ, чтобы она хранилась для каждого элемента. – Farrukh

ответ

0

К Admin -> Catalog -> Attributes -> Manage Attributes. Найдите свой атрибут из списка. В вашем случае это, вероятно, size. Нажмите на нее и перейдите к Manage Labels/Options. Оттуда вы можете добавить дополнительную информацию к каждому значению. Вы можете изменить ярлык на «Small-Waist 30, Chest 36, Length 42» и повторить для каждого значения атрибута, которое вы хотите изменить.

+1

Шон, спасибо за ответ, но его не атрибут, это настраиваемый вариант. К сожалению, я не могу следовать этому методу, потому что есть журнал других проблем. Если вы можете направить меня к проблемному изменению значения настраиваемого параметра, это облегчит мою жизнь. – Farrukh

28

Пользовательские параметры сохраняются только в котировке как идентификаторы параметров и их значения. Каждый раз, когда параметры отображаются, они в основном перезагружаются из базы данных.
Если вы измените значения, вам нужно будет их сохранить, и это установит их для всех.

Это говорит о том, что я обойду проблему, добавив дополнительную настраиваемую опцию с измененным значением «на лету», используя наблюдателя событий. Для этого я использую дополнительные опции.
Затем я удаляю оригинальную пользовательскую опцию из позиции котировки.

До 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); 
     } 
    } 

Это он в двух словах. Добавьте проверку ошибок и позаботьтесь о специальных случаях, например, при необходимости добавьте один и тот же продукт в корзину.
Надеюсь, вам придётся работать с пользовательскими параметрами продукта. Не наполовину плохо, когда вы знакомы с ними.

+0

Спасибо, Винай за помощь. Я попробую это. – Farrukh

+0

Вот еще один ответ, основанный на этом подходе с небольшим разным поворотом и более подробным описанием: http://stackoverflow.com/a/9496266/485589 – Vinai

+0

поможет ли я установить параметр добавления в sales_quote_collect_totals_before. Потому что мой sales_convert_quote_item_to_order_item не звонит. все –

-1

Просто добавьте небольшое исправление в отличное решение Vinai. Решение нарушает логику получения котировки по продукту.

Функция getItemByProduct в Mage_Sales_Model_Quote_Item вызывает функцию представлятьProduct, которая сравнивает параметры предложения и цены. Если оба объекта имеют одинаковый список опций, он возвращает объект quote иначе false.

Поскольку оба объекта имеют разные варианты теперь, когда мы добавили нашу настраиваемую опцию, функция вернет false.

Один из способов решения этой проблемы - переписать класс Mage_Sales_Model_Quote_Item и добавить свой код настраиваемой опции в локальную переменную $ _notRepresentOptions в конструкторе.

class Custom_Options_Model_Sales_Quote_Item extends Mage_Sales_Model_Quote_Item { 

/** 
* Initialize resource model 
* 
*/ 
protected function _construct() 
{   
    $this->_notRepresentOptions = array_merge($this->_notRepresentOptions, array('additional_options')); 

    parent::_construct(); 
} 

}

Смежные вопросы