2012-11-21 29 views
11

मुझे अपने कार्ट में कस्टम लाइन के साथ कुछ लाइन आइटम जोड़ना होगा। वाणिज्य उत्पाद की कीमत = 0 के साथ सहेजा जाता है, और मेरे मॉड्यूल कीमत की गणना और गाड़ी/आदेश में पंक्ति वस्तु जोड़ें, लेकिन मुझे नहीं समझ में प्रोग्राम के रूप में मूल्य निर्धारित करने के लिए कैसे।ड्रूपल वाणिज्य लाइन आइटम: कीमत में बदलाव?

मैंने नियमों का उपयोग करने के बारे में पढ़ा है, लेकिन मुझे नियमों को के बिना मूल्य, को सेट/बदलने में सक्षम होने के लिए मेरे मॉड्यूल की आवश्यकता है।

मैंने एक इकाई रैपर के साथ प्रयास किया है, मैंने commerce_product_line_item_new() के साथ बनाई गई लाइन आइटम को बदलने का प्रयास किया है, लेकिन कुछ भी नहीं, जब लाइन आइटम कार्ट में आता है तो हमेशा मूल उत्पाद मूल्य होता है (मेरे मामले में, 0) ।

कैसे प्रोग्राम के रूप में एक लाइन आइटम मूल्य परिवर्तन करने के लिए?

मेरे कोड अब तक लगता है कि:

// For debugging, this function is called by hook_menu() 
function mymodule_test($product_id) 
{ 
    global $user; 
    $user = user_load($user->uid); 

    $order = commerce_cart_order_load($user->uid); 
    $order_wrapper = entity_metadata_wrapper('commerce_order', $order); 

    $product = commerce_product_load($product_id); 

    $line_item = commerce_product_line_item_new(
      $product, 
      1, 
      0, 
      array(
      ), 
      'cover' 
    ); 

    $line_item_wrapper = entity_metadata_wrapper("commerce_line_item", $line_item); 

    $line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
      $line_item_wrapper->commerce_unit_price->value(), 
      'base_price', 
      array(
          'amount' => 1234, 
          'currency_code' => 'EUR', 
          'data' => array(), 
      ), 
      TRUE 
    ); 

    $insert_line_item = commerce_cart_product_add($user->uid, $line_item_wrapper->value(), FALSE); 

    return 'done'; 
} 

अजीब बात है कि मैं commerce_line_item_unit_price_amount() वाणिज्य/मॉड्यूल/LINE_ITEM/commerce_line_item.rules.inc में पाए जाने वाले कोड अनुकूल करने के लिए tryed है, लेकिन यह है परीक्षण:

<?php 
    global $user; 
    $product = commerce_product_load(4); // my commerce product for test 

    $line_item = commerce_product_line_item_new(
     $product, 
     1, 
     0, 
     array(
     ), 
     'cover' // I do have this line_items type 
    ); 

    // manually set amount and component name 
    $amount = 1234; 
    $component_name = 'base_price'; // tryed with discount, nothing change 

    $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item); 
    $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE); 

    // Calculate the updated amount and create a price array representing the 
    // difference between it and the current amount. 
    $current_amount = $unit_price['amount']; 
    $updated_amount = commerce_round(COMMERCE_ROUND_HALF_UP, $amount); 

    $difference = array(
     'amount' => $updated_amount - $current_amount, 
     'currency_code' => $unit_price['currency_code'], 
     'data' => array(), 
    ); 

    // Set the amount of the unit price and add the difference as a component. 
    $wrapper->commerce_unit_price->amount = $updated_amount; 

    $wrapper->commerce_unit_price->data = commerce_price_component_add(
     $wrapper->commerce_unit_price->value(), 
     $component_name, 
     $difference, 
     TRUE 
    ); 

    $insert_line_item = commerce_cart_product_add($user->uid, $line_item, FALSE); 
?> 

अभी भी असफल हो गया है, line_item कार्ट में आता है लेकिन संदर्भित उत्पाद की मूल कीमत के साथ।

कोई विचार?

+0

आप अपने रैपर बचत नहीं कर रहे हैं ... कि समस्या हो सकती है (यानी '$ line_item_wrapper-> बचाने(); ') – Clive

+0

@Clive मुझे लगता है कि मैं वह भी tryed किया था, लेकिन मुझे दे एक और सिर्फ मामले में कोशिश – Strae

+0

ओह, तुम भी' $ order_wrapper' (जब मैं कुछ कर रहा था कि मुझे मिल गया सहेजने की आवश्यकता होगी जाने इसी तरह कुछ महीने पहले) – Clive

उत्तर

18
उन लोगों को जो नियमों का उपयोग और सीधे मूल्य में परिवर्तन करने की आशा नहीं करना चाहती के लिए

// Alter the price in list and single product page. 
function my_module_commerce_product_calculate_sell_price_line_item_alter($line_item){ 

    $price = 100; //1 dollar 
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['amount'] = $price; 

} 

// Alter the price in cart & order. 
function my_module_commerce_cart_line_item_refresh($line_item, $order_wrapper){ 

    $price = 100; //1 dollar 
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['amount'] = $price; 
    // Alter the base_price component. 
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['data']['components']['0']['price']['amount'] = $price; 

} 
+0

हाय टिम, उपरोक्त 'हुक' मेरे मॉड्यूल से ट्रिगर नहीं कर रहा था। एकल उत्पाद पृष्ठ 'हुक' का प्रयास किया। मैं डीसी किकस्टार्ट का उपयोग कर रहा हूँ। – james

+0

क्या आपके पास कीमत निर्धारित करने के लिए कोई अन्य जगह है? आप यह देखने के लिए हुक में kpr ($ line_item) करने का प्रयास कर सकते हैं कि यह कैसा है। –

4

मैं आज सारा दिन इस मुद्दे के माध्यम से संघर्ष किया और अंतिम लाइन आइटम की कीमतों में फेरबदल करने के लिए सही रास्ता पता लगा। समस्या यह है कि, यदि आप लाइन आइटम मूल्य को कस्टम मान में सफलतापूर्वक बदलते हैं, तो अगले पृष्ठ पर रीफ्रेश करें कि कार्ट मूल आइटम मूल्य से मेल खाने के लिए लाइन आइटम रीसेट कर देगा। विवरण के लिए commerce_cart_order_refresh() फ़ंक्शन पर नज़र डालें। यह फ़ंक्शन हर बार निष्पादित होता है जब पृष्ठ पर ऑर्डर/कार्ट लोड होता है और इसके आसपास कोई रास्ता नहीं है।

ऐसा लगता है कि या तो उपयोग नियम या hook_commerce_cart_line_item_refresh() समारोह को लागू करने के लिए है एक लाइन आइटम मूल्य परिवर्तन करने के लिए उचित तरीके से। किसी भी तरह से, ड्रूपल कॉमर्स को कार्ट/ऑर्डर लोड होने पर हर बार परिवर्तन तर्क लागू करने में सक्षम होना चाहिए।

मैं लाइन आइटम जहां मैं कस्टम कीमत मूल्य मैं चाहता था संग्रहीत में एक कस्टम फ़ील्ड बना दी। जब मैंने गाड़ी को ताज़ा किया जाता है तो मैंने कस्टम मूल्य मूल्य को उत्पाद मूल्य मूल्य पर प्रतिलिपि बनाने के लिए एक मूल्य निर्धारण नियम का उपयोग किया।

निम्न ब्लॉग पोस्ट यह पता लगाना में काफी मददगार था। यह आपको दिखाता है कि लाइन आइटम प्रकार में कस्टम फ़ील्ड कैसे जोड़ना है और कस्टम मूल्य को इकाई मूल्य में कॉपी करने के लिए मूल्य निर्धारण नियम कैसे सेट करें।

http://commerceguys.com/blog/using-custom-line-items-provide-donation-feature-drupal-commerce

+1

साझा करने के लिए धन्यवाद! ड्रूपल कॉमर्स शक्तिशाली और लचीला है, लेकिन मुझे अभी भी नहीं पता है कि कीमतों में बदलाव इतने सख्त तरीके से नियमों से क्यों जुड़ा हुआ है। – Strae

+0

क्या आप अंतिम कोड पोस्ट कर सकते हैं? – MSD

+0

@MichaelStevens मैंने एक उदाहरण पोस्ट किया है जो इस फ़ंक्शन को लागू करता है। – mpoplin

1

हाल ही में मैं वाणिज्य में एक दान के फार्म को लागू करने के लिए किया था, लेकिन Commerce Express Checkout मॉड्यूल कस्टम लाइन आइटम संभाल नहीं करता है। चूंकि यह एक दान था और सब (जो घर को पेंच करने की कोशिश कर रहा है?), मुझे लगता है कि एक्सप्रेस चेकआउट मॉड्यूल प्रदान करता है यूआरएल में तीसरे पैरामीटर के रूप में दान राशि पास करने के लिए उचित है। यहाँ कैसे मैं मॉड्यूल हैकिंग के बारे में चला गया है:

मैं रूटर में एक नई प्रविष्टि कहा:

$items['commerce-express-checkout/%/%/%'] = array(
     'title' => 'Express Checkout w/ extra argument', 
     // 'page callback' => 'commerce_express_checkout_create_order', 
     'page callback' => 'commerce_express_checkout_create_order_extra', 
     'page arguments' => array(1, 2, 3), 
     'access arguments' => array('access checkout'), 
     'type' => MENU_CALLBACK, 
); 

मैं दोहराया गया और डिफ़ॉल्ट कॉलबैक फेरबदल और यह करने के लिए '_extra' हमला बोला।ध्यान दें कि "डेटा" प्रॉपर्टी इस तरह के अवसरों के लिए एक स्थैतिक परिवर्तनीय स्टोर प्रतीत होती है और लाइन आइटम के जीवन को कायम रखती है।

function commerce_express_checkout_create_order_extra($product_id, $token, $amount) { 

    if (drupal_hmac_base64($product_id, drupal_get_private_key().drupal_get_hash_salt()) == $token && is_numeric($amount)) { 
    global $user; 

    $product = commerce_product_load($product_id); 

    $product->commerce_price['und'][0]['amount'] = (int)$amount; 

    $order = ($user->uid) ? commerce_order_new($user->uid, 'checkout_checkout') : commerce_cart_order_new(); 

    commerce_order_save($order); 

    $price = array('amount' => commerce_round(COMMERCE_ROUND_HALF_UP, $amount), 'currency_code' => commerce_default_currency()); 

    $line_item = commerce_product_line_item_new($product, 1, $order->order_id); 
    $line_item->data = array('und' => array('0' => $price)); 
    commerce_line_item_save($line_item); 

    $order_wrapper = entity_metadata_wrapper('commerce_order', $order); 

    $order_wrapper->commerce_line_items[] = $line_item; 

    $order->data['type'] = 'commerce_express_checkout_order'; 

    commerce_order_save($order); 

    drupal_goto('checkout/' . $order->order_id); 

    return ""; 
    } 

    return ""; 
} 

यहाँ बात यह है कि बस सीखने की अवस्था के कारण सबसे मुश्किल जा रहा है और नहीं जानते हुए भी बिल्ली समारोह क्या उपयोग करने के लिए समाप्त हो गया है:

/**                    
* Implements hook_commerce_cart_line_item_refresh().       
*/                    
function commerce_express_checkout_commerce_cart_line_item_refresh($line_item, $order_wrapper) { 
    if ($line_item->commerce_product['und'][0]['line_item_label'] == 'DONATE' || $line_item->commerce_product['und'][0]['product_id'] == '11') { 
    $price = array('amount' => commerce_round(COMMERCE_ROUND_HALF_UP, $line_item->data['und'][0]['amount']), 'currency_code' => commerce_default_currency()); 
    $line_item->commerce_unit_price = array('und' => array('0' => $price)); 
    $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item); 
    $line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
     $line_item_wrapper->commerce_unit_price->value(), 'base_price', $price, TRUE 
    ); 
    } 
} 

हर एक समय गाड़ी संशोधित किया गया है, यह ताज़ा करता है और कार्ट में उत्पादों को उनके इन-कोड प्रोटोटाइप में सेट करने का प्रयास करता है। यह मेरे लिए भी बहुत अक्षम है, लेकिन मुझे कुछ याद आ रहा है।

6

आप उपेक्षा जो कुछ भी पिछले मानों एक पंक्ति वस्तु को सहेज लिया गया है और समारोह आप देख रहे हैं अपनी नई राशि से कुल पुनर्गणना के लिए देख रहे हैं commerce_line_item_rebase_unit_price है: यहाँ मेरी समाधान है।

सेट नई राशि मूल्य और उसके बाद, वहाँ के माध्यम से अपनी पंक्ति वस्तु को चलाने लाइन आइटम और व्यवस्था को बचाने:

$line_item_wrapper->commerce_unit_price->amount = 13; 

commerce_line_item_rebase_unit_price($line_item_wrapper->value()); 

commerce_line_item_save($line_item_wrapper->value()); 
+2

मेरे दिमाग में यह सबसे अच्छा जवाब है। मुझे यकीन है कि ऐसी स्थितियां हैं जहां ड्रूपल कॉमर्स की जटिल मूल्य निर्धारण प्रणाली बहुत उपयोगी है, लेकिन उपयोग के मामलों में मैं आया हूं कि मैं ** ** डांग कीमत ** सेट करना चाहता हूं, और मैं नहीं चाहता एक और हुक लागू करें (इस प्रकार मेरा कोड समझने में भी मुश्किल हो)। – jaskho

0

इस पोस्ट में मुझे सही दिशा में बताया प्रोग्राम के रूप में से एक Drupal वाणिज्य लाइन आइटम में फेरबदल के लिए hook_commerce_cart_line_item_refersh() का उपयोग कर। हालांकि, यहां कुछ जवाब या तो गलत हैं, या बहुत अक्षम और मैला हैं।

यह Drupal वाणिज्य में पंक्ति वस्तु प्रकार फेरबदल के लिए एक सही काम कर समाधान होगा:

/* 
* implements hook_commerce_cart_line_item_refresh() 
* 
*/ 

function MYMODULE_commerce_cart_line_item_refresh($line_item, $order_wrapper){ 

    $line_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item); 

    $new_price = 100; //I use a function to calculate the value of $new_price 

    if(!empty($new_price)){ 
     $line_wrapper->commerce_unit_price->amount->set($new_price); 
     $line_wrapper->save(); 
    } 
}