2012-02-17 18 views
7

eklemeden önce ben kurulum açılır yaniMagento değişim Özel Seçenek değeri arabası

Boyutu olarak Magento ürünüm için özel bir seçenek var javascript kullanarak her seçenek.

Küçük - Bel 30 Göğüs 36, Uzunluk 42 ...
Orta - Bel 32, Göğüs 38, Uzunluk 44 ...
Büyük - Bel 34, Göğüs 40, Uzunluk 48 ...

Sepete ürün eklediğimde, sepetteki Boyut başlığını (Küçük, Orta veya Büyük) aldım ancak bu ek bilgileri (Bel 30, Göğüs 36, Uzunluk 42 ...) de göstermek istiyorum.

Bunu yapmanın en iyi yolu nedir? Şimdiden teşekkürler.

+0

Eğer bir şekilde bu ek verileri kaydetme musunuz? Sipariş için Yönetici'yi kontrol ettiğinizde bel, göğüs, uzunluk vb. Gösteriliyor mu? – seanbreeden

+0

Üzgünüm, yeterince açık olmasaydım. Sadece phtml dosyasında kodlanmış javascript varsa bu bilgiyi gösteriyorum. örneğin (val == small) ve sonra Bel 30, Göğüs 36, Uzunluk 42 ... göster. Şimdi bu ekstra bilgiyi her bir öğe için saklanabilmesi için sıraya eklemek istiyorum. – Farrukh

cevap

0

Admin -> Catalog -> Attributes -> Manage Attributes adresine gidin. Özniteliğinizi listeden bulun. Sizin durumunuzda, muhtemelen size. Tıklayın ve Manage Labels/Options'a gidin. Buradan her bir değere ek bilgi ekleyebilirsiniz. Etiketi "Küçük Bel 30, Göğüs 36, Uzunluk 42" olarak değiştirebilir ve değiştirmek istediğiniz her bir özellik değeri için tekrarlayabilirsiniz.

+1

Sean, cevabınız için teşekkürler, ancak özniteliği değil, bu özel bir seçenektir. Ne yazık ki, bu yöntemi takip edemiyorum çünkü diğer konuların da günlüğü var. Özel seçeneğin değerini problemli bir şekilde değiştirmek için bana rehberlik ederseniz, hayatımı çok daha kolaylaştıracak. – Farrukh

28

Özel seçenekler yalnızca alıntıda seçenek kimliği ve değerleri olarak saklanır. Her seçenek oluşturulduğunda, temel olarak veritabanından yeniden yüklenir.
Değerleri değiştirirseniz, bunları kaydetmeniz gerekir ve bu onları herkes için ayarlar.

Bu, bir olay gözlemcisi kullanarak, anında değiştirilen değerle ek bir özel seçenek ekleyerek bu soruna geçici bir çözüm buluyorum. Bunun için ek seçenekler kullanıyorum.
Sonra özgün özel seçeneği, alıntı öğesinden kaldırırım.

Kalanın boyutu 1,4'e kadar Magento ile ilgiliydi, ancak o zamandan beri ek seçenekleri sipariş öğesine manuel olarak kopyalamanız ve bir öğenin yeniden düzenlenmesi durumunda yeniden ayarlanması gerektiğine dikkat etmeniz gerekiyor.

Burada örnek bir gözlemci yapılandırması var.

<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> 

dinlenme gözlemci sınıfta ele alınır.

/** 
* 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); 
     } 
    } 

Bu kısaca olduğunu. Aynı ürünün sepete tekrar eklenmesi gibi özel durumların kontrolünü ve hata kontrolünü ekleyin.
Bu özel ürün seçenekleriyle çalışmaya başlamanızı umarım. Onlara aşina olduktan sonra yarı kötü değil.

+0

Yardım için teşekkürler Vinai. Bunu deneyeceğim. – Farrukh

+0

Bu yaklaşıma göre biraz farklı bir twist ve daha fazla ayrıntıya dayanan bir başka cevap daha var: http://stackoverflow.com/a/9496266/485589 – Vinai

+0

sales_quote_collect_totals_before'de ekleme seçeneği ayarlamamda yardımcı olacaktır. Çünkü benim sales_convert_quote_item_to_order_item çağırmıyor. Tüm –

-1

Sadece Vinai'nin mükemmel çözümüne küçük bir düzeltme eklemek için. Çözüm, ürüne göre bir fiyat teklifi alma mantığını kırar.

Mage_Sales_Model_Quote_Item öğesindeki getItemByProduct işlevi, quoteProduct ürününü temsil eden işlevi temsil eden işlevi çağırır. Her iki nesne de aynı seçenekler listesine sahipse, aksi halde yanlış olan alıntı nesnesini döndürür.

Her iki nesne de artık özel seçeneklerimizi eklediğimizden farklı seçenekler sunduğundan, işlev false değerini döndürecektir.

Bu sorunu çözmenin bir yolu, Mage_Sales_Model_Quote_Item sınıfını yeniden yazıp, özel seçenek kodunuzu yapıcıdaki $ _notRepresentOptions yerel değişkenine eklemektir.

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(); 
} 

}