Làm cách nào để cấp Điểm người dùng bằng với giá của Sản phẩm thương mại?


9

Tôi muốn cấp Điểm người dùng cho chủ sở hữu sản phẩm theo giá sản phẩm sau khi sản phẩm được bán.

Đối với điều này, tôi đã xác định một quy tắc như dưới đây:

  • Sự kiện: Hoàn tất quy trình thanh toán

  • Hành động: Vòng lặp ( commerce-order:commerce-line-items)

Và tôi đã định nghĩa một Thành phần quy tắc như sau:

  • Điều kiện: Thực thể có trường (Thực thể : commerce-line-item, Trường commerce_product:)

  • Hành động: Cấp điểm cho người dùng: (Người dùng : commerce-line-item:commerce-product:creator, Điểm commerce-line-item:commerce-product:commerce-price:amount:)

Nhưng khi tôi lưu thành phần, nó sẽ tạo ra thông báo Lỗi này:

Bộ chọn dữ liệu thương mại-dòng-mục: thương mại-sản phẩm: thương mại-giá: số tiền cho các điểm tham số không hợp lệ.

Làm thế nào tôi có thể làm điều đó?


Tại sao bạn cần điều kiện này?
subhojit777

Có lẽ lý do là sản phẩm thương mại đã nằm ngoài phạm vi khi thanh toán hoàn tất (tôi không chắc chắn). Hãy thử in giá trị và kiểm tra nó một lần.
Gokul NK

@Daniele bạn có chắc chắn muốn cấp điểm cho người dùng đã tạo ra sản phẩm không?
subhojit777

@ subhojit777 Có, ví dụ: để quản lý điểm người dùng dưới dạng tín dụng người dùng. Tôi tạo ra một sản phẩm ảo mà sau khi mua, cung cấp cho tôi điểm người dùng cần thiết để mua sản phẩm thực. Đáng buồn thay Commerce_credits không có tính linh hoạt và tiền tệ thay thế như Commerce_userpoint.
Daniele Napolitano

@DanieleNapolitano tại sao bạn cần điều kiện đó? Tôi thấy câu hỏi có điều kiện trong thành phần quy tắc.
subhojit777

Câu trả lời:


5

Tại lần đầu tiên tôi đã cố gắng để trả lời câu hỏi của bạn sử dụng quy tắcuserpoints module, nhưng tôi thấy rằng khi thêm điểm Grant cho một người dùng như hành động không có chọn dữ liệu đó để lựa chọn những người dùng đã tạo ra sản phẩm. Tôi đã tìm thấy bộ chọn dữ liệu để chọn người dùng là chủ sở hữu đơn hàng, nhưng đó không phải là yêu cầu của bạn. (Đó là lý do tại sao tôi làm rõ điều này trong các bình luận).

Tôi tìm thấy một giải pháp mô-đun cho câu hỏi của bạn. Mô-đun sử dụng hook_c Commerce_checkout_complete () . Từ trang hook:

Cho phép các mô-đun thực hiện logic nghiệp vụ khi đơn hàng hoàn thành kiểm tra.

Móc này trùng với sự kiện "Khách hàng hoàn thành thanh toán". Chỉ nên thực hiện logic nghiệp vụ khi điều này được gọi, chẳng hạn như cập nhật trạng thái đơn hàng, gán đơn hàng cho tài khoản người dùng hoặc gửi e-mail thông báo. Thay vào đó, tương tác với người dùng nên xảy ra thông qua các tấm thanh toán trên trang hoàn thành thanh toán.

Đây là mã hóa của mô-đun tôi thiết kế:

Tập tin YOUMODULE.info :

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

CẬP NHẬT Theo đề xuất của Clive , tôi đã thay đổi tệp mô-đun để mô-đun tùy chỉnh này cũng sẽ hoạt động với các trang web đa ngôn ngữ.

Tập tin YOUMODULE.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);
    }
  }
}

Liên kết tham khảo:

userpoint_userpointapi ($ params)

API thương mại_checkout

Commerce_line_item_load ($ line_item_id)

Commerce_product_load ($ sản phẩm_id)

Điểm người dùng: trừ điểm theo chương trình

Commerce_currency_amount_to_decimal ()


Giải pháp tuyệt vời, điều đó sẽ có ích. Tôi có thể đề nghị một thay đổi nhỏ không? Sẽ tốt hơn nếu sử dụng field_get_items()để truy xuất $order->commerce_line_items, theo cách này cũng sẽ hoạt động với các trang web đa ngôn ngữ
Clive

@Clive cảm ơn vì lời đề nghị .. nhưng tôi chưa bao giờ sử dụng field_get_item () trước đây .. Tôi phải tìm hiểu cách sử dụng của nó và áp dụng điều đó trong câu trả lời này. Cần một chút thời gian :)
subhojit777

0

Thay thế cho câu trả lời trước đó, yêu cầu mã tùy chỉnh, bạn có thể muốn thử thay thế được mô tả bên dưới để khắc phục thông báo lỗi đó ...

Câu hỏi của bạn dường như là một biến thể (không phải là một bản sao) của câu hỏi " Làm cách nào để cấp Điểm người dùng bằng giá trị / giá trị tính toán của trường nhất định? ". Tương tự như câu trả lời được chấp nhận cho câu hỏi đó, hãy thử điều chỉnh Thành phần quy tắc của bạn như sau:

  1. Thêm các hành động quy tắc bổ sung này trước hành động quy tắc trong Thành phần quy tắc của bạn gây ra lỗi:

    • Set a variabletương ứng với " số lượng giá sản phẩm " (như trong câu hỏi của bạn), có vẻ như là commerce-line-item:commerce-product:commerce-price:amount. Giả sử bạn đặt tên cho biến đó price_amount.
    • Convert data typecủa price_amountbiến đó thành số nguyên . Giả sử bạn đặt tên cho kết quả chuyển đổi đó amount_of_points.
  2. Điều chỉnh Hành động quy tắc hiện tại của bạn (trong Thành phần quy tắc đó) để số lượng điểm người dùng được cấp sử dụng điều này (được tính + chuyển đổi) amount_of_points.

PS 1: "Chuyển đổi kiểu dữ liệu" như vậy chỉ đơn giản là vấn đề về cách thức hoạt động của Quy tắc (theo thiết kế), do đó, nó cũng không được coi là một lỗi ...

PS 2: Tôi giả sử câu hỏi của bạn là về D7.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.