如何授予与商品价格相等的用户积分?


9

我想在产品售出后向产品所有者授予“ 用户点数”

为此,我定义了以下规则:

  • 活动:完成结帐流程

  • 动作:循环(commerce-order:commerce-line-items

我定义了一个规则组件,如下所示:

  • 条件:实体领域(实体: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:amount无效。

我该怎么做?


为什么需要这种情况?
subhojit777

可能是因为结帐完成后,商业产品已经超出范围(我不确定)。尝试打印该值并检查一次。
Gokul NK

@Daniele是否确定要向创建产品的用户授予积分?
subhojit777

@ subhojit777是的,例如以经理用户点作为用户信用。我创建了一个虚拟产品,一旦购买,就会为我提供购买真实产品所需的用户点。可悲的是,commerce_credits没有像commerce_userpoints这样的灵活性和货币替换功能。
Daniele Napolitano 2013年

@DanieleNapolitano为什么需要这种条件?我看到问题在规则组件中有条件。
subhojit777

Answers:


5

最初,我尝试使用“ 规则用户点”模块回答您的问题,但是我看到,在将“ 授予点”作为操作添加到用户时,没有这样的数据选择器来选择创建产品的用户。我找到了用于选择订单所有者的用户的数据选择器,但这不是您的要求。(这就是为什么我在评论中对此进行了澄清)。

我找到了您问题的模块解决方案。该模块使用hook_commerce_checkout_complete()。在挂钩页面中:

当订单完成结帐时,允许模块执行业务逻辑。

该挂钩与“客户完成结帐”事件一致。调用时仅应执行业务逻辑,例如更新订单状态,将订单分配给用户帐户或发送通知电子邮件。与用户的交互应改为通过结帐完成页面上的结帐窗格进行。

这是我设计的模块的编码:

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 typeprice_amount变量的整数。假设您将转换结果命名为amount_of_points
  2. 调整现有的“规则操作”(在该“规则”组件中),以便要授予的用户点数使用此值(计算+转换)amount_of_points

PS 1:此类“转换数据类型”仅是规则(按设计)如何工作的问题,因此也不应将其视为错误。

PS 2:我认为您的问题与D7有关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.