จะให้คะแนนผู้ใช้เท่ากับราคาของผลิตภัณฑ์พาณิชย์ได้อย่างไร


9

ฉันต้องการให้คะแนนผู้ใช้แก่เจ้าของผลิตภัณฑ์ในราคาสินค้าหลังจากขายผลิตภัณฑ์แล้ว

สำหรับสิ่งนี้ฉันได้กำหนดกฎดังต่อไปนี้:

  • กิจกรรม: ดำเนินการชำระเงินจนเสร็จสิ้น

  • การกระทำ: Loop ( commerce-order:commerce-line-items)

และฉันได้กำหนดองค์ประกอบของกฎดังต่อไปนี้:

  • เงื่อนไข: Entity มีข้อมูล (Entity: commerce-line-itemสนาม: commerce_product)

  • ดำเนินการ: จุดให้กับผู้ใช้: (ผู้ใช้: commerce-line-item:commerce-product:creatorจุด: commerce-line-item:commerce-product:commerce-price:amount)

แต่เมื่อฉันบันทึกองค์ประกอบมันสร้างข้อความแสดงข้อผิดพลาดนี้:

ตัวเลือกข้อมูล commerce-line-item: commerce-product: commerce-price: จำนวนสำหรับจุดพารามิเตอร์ไม่ถูกต้อง

ฉันจะทำสิ่งนั้นได้อย่างไร


ทำไมคุณต้องมีเงื่อนไขนี้
subhojit777

อาจเป็นเพราะเหตุผลว่าสินค้าการค้าอยู่นอกขอบเขตเนื่องจากการชำระเงินเสร็จสมบูรณ์ (ฉันไม่แน่ใจ) ลองพิมพ์ค่าและตรวจสอบอีกครั้ง
Gokul NK

@Daniele คุณแน่ใจหรือไม่ว่าต้องการให้คะแนนแก่ผู้ใช้ที่สร้างผลิตภัณฑ์ขึ้นมา?
subhojit777

@ subhojit777 ใช่เช่นเพื่อจัดการ userpoints เป็นเครดิตผู้ใช้ ฉันสร้างผลิตภัณฑ์เสมือนจริงที่ครั้งหนึ่งเคยซื้อให้จุดผู้ใช้ที่จำเป็นสำหรับการซื้อผลิตภัณฑ์จริง น่าเศร้า commerce_credits ไม่มีความยืดหยุ่นและการเปลี่ยนสกุลเงินเช่น commerce_userpoints
Daniele Napolitano

@DanieleNapolitano ทำไมคุณถึงต้องการเงื่อนไขนั้น ฉันเห็นคำถามมีเงื่อนไขในองค์ประกอบกฎ
subhojit777

คำตอบ:


5

ในตอนแรกที่ผมพยายามที่จะตอบคำถามของคุณโดยใช้กฎและuserpointsโมดูล แต่ผมเห็นว่าในขณะที่การเพิ่มคะแนนให้กับผู้ใช้ในขณะที่การดำเนินการไม่มีตัวเลือกข้อมูลดังกล่าวสำหรับการเลือกผู้ใช้ที่ได้สร้างสินค้า ฉันพบตัวเลือกข้อมูลสำหรับการเลือกผู้ใช้ที่เป็นเจ้าของคำสั่งซื้อ แต่นั่นไม่ใช่ความต้องการของคุณ (นั่นคือเหตุผลที่ฉันชี้แจงเรื่องนี้ในความคิดเห็น)

ฉันพบโซลูชันโมดูลสำหรับคำถามของคุณ การใช้โมดูลhook_commerce_checkout_complete () จากหน้า hook:

อนุญาตให้โมดูลดำเนินการตรรกะทางธุรกิจเมื่อคำสั่งซื้อเช็คเอาต์เสร็จสมบูรณ์

เบ็ดนี้ตรงกับเหตุการณ์ "ลูกค้าชำระเงินเสร็จสมบูรณ์" ควรดำเนินการตรรกะทางธุรกิจเฉพาะเมื่อมีการเรียกใช้เช่นการอัปเดตสถานะคำสั่งซื้อการกำหนดคำสั่งให้กับบัญชีผู้ใช้หรือส่งอีเมลแจ้งเตือน การโต้ตอบกับผู้ใช้ควรเกิดขึ้นผ่านบานหน้าต่างชำระเงินแทนในหน้าเสร็จสิ้นการชำระเงิน

นี่คือการเข้ารหัสของโมดูลที่ฉันออกแบบ:

ไฟล์YOURMODULE.info :

name = YOURMODULE
description = Module description
dependencies[] = commerce
dependencies[] = commerce_cart
dependencies[] = commerce_checkout
dependencies[] = userpoints
core = 7.x

อัปเดต ตามที่Cliveแนะนำฉันได้เปลี่ยนไฟล์โมดูลเพื่อให้โมดูลที่กำหนดเองนี้จะทำงานกับเว็บไซต์หลายภาษาได้เช่นกัน

YOURMODULE.moduleไฟล์:

/**                                                                             
 * Implements hook_commerce_checkout_complete().                                
 */                                                                             
function YOURMODULE_commerce_checkout_complete($order) {
  // Iterate through every commerce line item added in product.
  foreach (field_get_items('commerce_order', $order, 'commerce_line_items') as $line_item_id) {

    // Load commerce line item by line item id.
    $line_item = commerce_line_item_load($line_item_id['line_item_id']);

    // We do not want to include shipping cost in userpoints.
    if ($line_item->type != 'shipping') {
      // Load commerce product by product id.
      $product = commerce_product_load(field_get_items('commerce_line_item', $line_item, 'commerce_product')[0]['product_id']);

      // Create parameters.
      $params = array(
        'uid' => $product->uid,
        'points' => commerce_currency_amount_to_decimal(field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['amount'], field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['currency_code']),
      );

      // Grant userpoints programmatically.
      userpoints_userpointsapi($params);
    }
  }
}

ลิงค์อ้างอิง:

userpoints_userpointsapi ($ params)

commerce_checkout API

commerce_line_item_load ($ LINE_ITEM_ID)

commerce_product_load ($ product_id)

จุดผู้ใช้: หักคะแนนตามโปรแกรม

commerce_currency_amount_to_decimal ()


ทางออกที่ดีนั่นจะเป็นประโยชน์ ฉันขอแนะนำการเปลี่ยนแปลงเล็กน้อยได้ไหม? มันจะเป็นการดีกว่าถ้าจะใช้field_get_items()เพื่อค้นคืน$order->commerce_line_itemsวิธีนี้จะใช้ได้กับไซต์หลายภาษาเช่นกัน
Clive

@ ไคลเอนต์ขอบคุณสำหรับคำแนะนำ .. แต่ฉันไม่เคยใช้ field_get_item () มาก่อน .. ฉันต้องเรียนรู้การใช้งานและใช้มันในคำตอบนี้ ต้องการเวลา :)
subhojit777

0

เป็นทางเลือกสำหรับคำตอบก่อนหน้าซึ่งต้องใช้รหัสที่กำหนดเองคุณอาจต้องการลองทางเลือกที่อธิบายด้านล่างเพื่อรับข้อความแสดงข้อผิดพลาดนั้น ...

คำถามของคุณดูเหมือนจะเป็นรูปแบบ (ไม่ใช่ซ้ำกัน) ของคำถาม " จะให้คะแนนผู้ใช้กับค่า / ค่าจากการคำนวณของเขตข้อมูลได้อย่างไร " เช่นเดียวกับคำตอบที่ได้รับการยอมรับสำหรับคำถามนั้นลองปรับองค์ประกอบของกฎดังนี้

  1. เพิ่มการกระทำของกฎพิเศษเหล่านี้ก่อนการกระทำของกฎในส่วนประกอบกฎของคุณที่ทำให้เกิดข้อผิดพลาด:

    • Set a variableที่สอดคล้องกับ " จำนวนของราคาสินค้า " (ในขณะที่คำถามของคุณ) commerce-line-item:commerce-product:commerce-price:amountซึ่งดูเหมือนจะเป็น สมมติว่าคุณตั้งชื่อตัวแปรprice_amountนั้น
    • Convert data typeจากการที่price_amountตัวแปรจำนวนเต็ม amount_of_pointsสมมติว่าคุณชื่อผลการแปลงที่
  2. ปรับตัวเข้ากับกฎที่มีอยู่ดำเนินการ (ในการที่กฎ Component) เพื่อให้จำนวนของจุดที่ผู้ใช้จะได้รับการใช้งานนี้ (คำนวณ + amount_of_pointsแปลง)

PS 1: "ประเภทการแปลงข้อมูล" นั้นเป็นเพียงเรื่องของการทำงานของกฎ (โดยการออกแบบ) ดังนั้นจึงไม่ถือว่าเป็นข้อบกพร่อง ...

PS 2: ฉันคิดว่าคำถามของคุณเกี่ยวกับ D7

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.