2012-02-17 37 views
7

tôi đã thiết lập một tùy chọn tùy chỉnh cho sản phẩm của tôi trong Magento như thả xuống tức làMagento thay đổi tùy Lựa chọn giá trị trước khi thêm nó vào giỏ hàng

Kích thước: Small, Medium, Large

Trên trang sản phẩm tôi hiển thị thêm thông tin cho mỗi tùy chọn sử dụng javascript.

nhỏ - eo 30, ngực 36, dài 42 ...
Trung bình - eo 32, ngực 38, dài 44 ...
Lớn - Vòng eo 34, ngực 40, dài 48 ...

Khi tôi thêm sản phẩm vào giỏ hàng, tôi nhận được tiêu đề Kích thước (Nhỏ, Vừa hoặc Lớn) trong giỏ hàng nhưng tôi cũng muốn hiển thị thông tin bổ sung này (Eo 30, Ngực 36, Chiều dài 42 ...) và lưu nó theo thứ tự.

Cách tốt nhất để làm điều đó là gì? Cảm ơn trước.

+0

Bạn tiết kiệm dữ liệu bổ sung bằng cách nào đó? Khi bạn kiểm tra Quản trị viên cho đơn hàng, vòng eo, ngực, chiều dài, v.v ... có xuất hiện không? – seanbreeden

+0

Xin lỗi, nếu tôi chưa đủ rõ ràng. Tôi chỉ hiển thị thông tin này nếu javascript được mã hóa cứng trong tệp phtml. ví dụ: nếu (val == nhỏ) thì hiển thị Eo 30, Ngực 36, Chiều dài 42 ... Bây giờ tôi muốn thêm thông tin bổ sung này vào thứ tự để nó được lưu trữ cho mỗi mục. – Farrukh

Trả lời

0

Đi tới Admin -> Catalog -> Attributes -> Manage Attributes. Tìm thuộc tính của bạn từ danh sách. Trong trường hợp của bạn, có thể là size. Nhấp vào nó và đi đến Manage Labels/Options. Từ đó bạn có thể thêm thông tin bổ sung cho mỗi giá trị. Bạn có thể thay đổi Nhãn thành "Nhỏ - Eo 30, Ngực 36, Chiều dài 42" và lặp lại cho mỗi giá trị thuộc tính mà bạn muốn thay đổi.

+1

Sean, cảm ơn câu trả lời nhưng không phải là thuộc tính, nó là tùy chọn tùy chỉnh. Thật không may, tôi không thể làm theo phương pháp này bởi vì có đăng nhập của các vấn đề khác có liên quan quá. Nếu bạn có thể hướng dẫn tôi thay đổi một cách có vấn đề giá trị của tùy chọn tùy chỉnh, nó sẽ làm cho cuộc sống của tôi dễ dàng hơn nhiều. – Farrukh

28

Tùy chọn tùy chỉnh chỉ được lưu trữ trên báo giá dưới dạng ID tùy chọn và giá trị. Mỗi khi các tùy chọn được trả về, chúng về cơ bản được nạp lại từ cơ sở dữ liệu.
Nếu bạn sửa đổi các giá trị, bạn sẽ cần phải lưu chúng, và điều đó sẽ đặt chúng cho tất cả mọi người.

Điều đó nói rằng, tôi giải quyết vấn đề bằng cách thêm tùy chọn tùy chỉnh bổ sung với giá trị được sửa đổi khi đang di chuyển, sử dụng trình quan sát sự kiện. Đối với điều này tôi sử dụng các tùy chọn bổ sung.
Sau đó, tôi xóa tùy chọn tùy chỉnh gốc khỏi mục báo giá. Lên đến 1,4 Magento đã chăm sóc phần còn lại, nhưng kể từ đó bạn cần phải sao chép các tùy chọn bổ sung cho mục đặt hàng theo cách thủ công, và cũng cần phải cẩn thận nó được thiết lập lại nếu một mục được sắp xếp lại.

Vì vậy, đây là một cấu hình quan sát mẫu.

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

Phần còn lại được xử lý trong lớp quan sát viên.

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

Đây là tóm tắt. Thêm lỗi kiểm tra và chăm sóc các trường hợp đặc biệt như thêm cùng một sản phẩm vào giỏ hàng một lần nữa khi cần thiết.
Hy vọng điều này sẽ giúp bạn bắt đầu làm việc với các tùy chọn sản phẩm tùy chỉnh. Không phải là một nửa xấu một khi bạn làm quen với họ.

+0

Cảm ơn bạn đã giúp Vinai. Tôi sẽ thử cái này. – Farrukh

+0

Đây là một câu trả lời khác dựa trên cách tiếp cận này với một chút khác biệt và chi tiết hơn: http://stackoverflow.com/a/9496266/485589 – Vinai

+0

nó sẽ giúp ích nếu tôi thiết lập tùy chọn bổ sung trong sales_quote_collect_totals_before. Bởi vì sales_convert_quote_item_to_order_item của tôi, nó không gọi. tất cả –

-1

Chỉ cần thêm một sửa chữa nhỏ vào giải pháp tuyệt vời của Vinai. Giải pháp phá vỡ logic khi nhận được một mục báo giá theo sản phẩm.

Hàm getItemByProduct trong Mage_Sales_Model_Quote_Item gọi hàm đại diệnSản phẩm so sánh giữa báo giá và tùy chọn sản phẩm. Nếu cả hai đối tượng có danh sách các tùy chọn giống nhau thì nó trả về đối tượng báo giá sai.

Vì cả hai đối tượng đều có các tùy chọn khác nhau nên chúng tôi đã thêm tùy chọn tùy chỉnh của chúng tôi, hàm sẽ trả về false.

Một cách để giải quyết vấn đề này là viết lại lớp Mage_Sales_Model_Quote_Item và thêm mã tùy chọn tùy chỉnh của bạn vào biến cục bộ $ _notRepresentOptions trong hàm tạo.

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

}

Các vấn đề liên quan