2012-07-27 39 views
6

Có thể cập nhật giá trị tùy chọn tùy chỉnh sản phẩm từ một đơn đặt hàng không? Tôi biết rằng có thể khi các mặt hàng trong giỏ hàng (trước khi thanh toán), nhưng tôi không chắc chắn nếu nó có thể theo thứ tự.Làm thế nào để cập nhật tùy chọn tùy chỉnh của mục đặt hàng trong Magento?

Ứng dụng của chúng tôi đang bán dịch vụ và chúng tôi có trường hợp khi dữ liệu bắt buộc chỉ có sẵn sau khi thanh toán.

Trả lời

17

Tùy thuộc vào mục đích tùy chỉnh của bạn. Order Order có các tùy chọn tùy chỉnh được lưu trữ dưới dạng mảng tuần tự hóa và bất cứ lúc nào bạn cũng có thể sửa đổi nó.

Không giống như mục báo giá, theo thứ tự mục có tên khác để truy xuất chúng. Phương pháp này được gọi là getProductOptions()

Ngoài ra còn có một phương pháp khác cho phép bạn đặt chúng setProductOptions(array $options).

Dưới đây là một số ví dụ về việc sử dụng phương pháp này trong các trường hợp thử nghiệm khác nhau:

  1. Nếu bạn cần lưu trữ nó chỉ dành cho việc sử dụng mã nội bộ, bạn chỉ có thể thêm tùy chọn vào mảng mảng và đặt nó trở lại:

    $existentOptions = $orderItem->getProductOptions(); 
    $existentOptions['your_custom_option'] = $yourCustomValue; 
    $orderItem->setProductOptions($existentOptions); 
    
  2. Nếu bạn cần để hiển thị tùy chọn tùy chỉnh của bạn trong tài liệu in, bạn cần phải thêm tùy chọn tùy chỉnh của bạn vào tùy chọn đặc biệt các tùy chọn, có cấu trúc cho hiển thị giá trị của nó trên lối vào, tài liệu pdf, danh sách các mặt hàng

    $existentOptions = $orderItem->getProductOptions(); 
    if (!isset($existentOptions['additional_options'])) { 
        // If special options of options array is set before, create it. 
        $existentOptions['additional_options'] = array(); 
    } 
    // Adding visible options value 
    $existentOptions['additional_options'][] = array(
        'label' => 'Your Option Label', 
        'value' => 'Your Option Value', 
        // The last one that is optional (if not set, value is used) 
        'print_value' => 'Your Option Value shown in printed documents' 
    ); 
    $orderItem->setProductOptions($existentOptions); 
    

Cả hai phương pháp thậm chí có thể được kết hợp, nếu bạn cần một lựa chọn đó là có thể nhìn thấy khách hàng và một tùy chọn đó là cần thiết cho mã của bạn.

Cũng đừng quên lưu đơn đặt hàng/đơn đặt hàng của bạn sau khi bạn thực hiện các sửa đổi của mình.

Tư vấn

Nếu bạn lưu trật tự và đã không thay đổi về mô hình trật tự riêng của mình, bạn cần ít nhất thay đổi một số dữ liệu trong nó, để buộc mô hình để lưu tất cả các cơ quan địa. Để làm điều này có thể, bạn thậm chí có thể chỉ cần thiết lập một số thuộc tính không tồn tại.

Trường hợp khi lưu hoạt động sẽ không được áp dụng:

$order->load($id); 
$orderItem->getItemById($itemId); 
$orderItem->setSomething(111); 
$order->save(); // Order Item will not be saved!! 

Trường hợp khi lưu hoạt động sẽ được gọi:

$order->load($id); 
$orderItem->getItemById($itemId); 
$orderItem->setSomething(111); 
$order->setSomeNonExistentProperty(true); 
$order->save(); // Now it will be saved 

Hãy vui vẻ với sự phát triển Magento

+0

Cảm ơn bạn rất nhiều. Tôi đã dành khoảng một tuần cho nhiệm vụ này. Nó hoạt động tốt. Cảm ơn một lần nữa – DRAJI

+0

@ Ivan Chepurnyi: Tôi nghĩ rằng bạn cần phải tiết kiệm cũng từ "$ orderItem-> setProductOptions ($ existentOptions);" tới "$ orderItem-> setProductOptions ($ existentOptions) -> save();" –

0

Bạn có thể làm điều đó trên chức năng addProduct, trước khi đặt hàng.

try { 
     $cart = Mage::getModel('checkout/cart'); 
     $previousItemCount = $cart->getQuote()->getItemsCount(); 

     if ($previousItemCount <= 0) { 
      $cart->init(); 
     } 

     $params = $this->getRequest()->getParams(); 
     $product = Mage::getModel('catalog/product')->load($params['product_id']); 

     $date = explode('/', $params['product_dtinvoice']); 
     $date = array(
      'month' => $date[0], 
      'day' => $date[1], 
      'year' => $date[2], 
     ); 

     $cart->addProduct(
      $product, 
      new Varien_Object(array(
       'product' => $product->getId(), 
       'qty' => 1, 
       'options' => array(
        '4' => array(
         'month' => $date['month'], 
         'day' => $date['day'], 
         'year' => $date['year'] 
        ), 
        '2' => $params['product_ean'], 
        '3' => $params['product_serialnumber'], 
        '1' => $params['product_seller'], 
       ), 
      )) 
     ); 

     $cart->save(); 

     if ($previousItemCount < $cart->getQuote()->getItemsCount()) { 
      $return = array('result' => true, 'msg' => ''); 
     } else { 
      $return = array('result' => false, 'msg' => 'Did not possible to add this product to cart. Please contact the administrator'); 
     } 

     $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($return)); 
    } catch(Exception $e) { 
     Mage::throwException($e->getMessage()); 
    } 
Các vấn đề liên quan