Как предоставить пользовательские баллы равные цене коммерческого продукта?

9

Я хотел бы предоставить User Point владельцу продукта в размере цены продукта после продажи продукта.

Для этого я определил правило следующим образом:

  • События: завершение процесса оформления заказа

  • Действия: 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: сумма для точек параметра недействительна.

Как я могу это сделать?

user1468966
источник
Зачем вам это условие?
subhojit777
Вероятно, причина в том, что коммерческий продукт уже выходит за рамки, так как проверка завершена (я не уверен). Попробуйте напечатать значение и проверьте его один раз.
Гокул НК
@Daniele Вы уверены, что хотите дать очки пользователю, который создал продукт?
subhojit777
@ subhojit777 Да, например, для управления пользовательскими точками в качестве кредита пользователя. Я создаю виртуальный продукт, который после покупки дает мне пользовательскую точку, необходимую для покупки реальных продуктов. К сожалению, commerce_credits не имеют гибкости и замены валюты, как commerce_userpoints.
Даниэле Наполитано
@DanieleNapolitano зачем тебе это условие? Я вижу, что вопрос имеет условие в компоненте правила.
subhojit777

Ответы:

5

Сначала я попытался ответить на ваш вопрос, используя модуль правил и пользовательских точек , но увидел, что при добавлении баллов Grant пользователю в качестве действия такого селектора данных для выбора пользователя, создавшего продукт, не существует. Я нашел селектор данных для выбора пользователя, который является владельцем заказа, но это не ваше требование. (Вот почему я пояснил это в комментариях).

Я нашел модульное решение вашего вопроса. Модуль использует hook_commerce_checkout_complete () . Со страницы хука:

Позволяет модулям выполнять бизнес-логику, когда заказ завершает оформление заказа.

Этот хук совпадает с событием «Заказчик завершает оформление заказа». При этом должна выполняться только бизнес-логика, например, обновление статуса заказа, назначение заказа учетной записи пользователя или отправка уведомлений по электронной почте. Вместо этого взаимодействие с пользователем должно происходить через панели оформления заказа на странице завершения оформления заказа.

Это кодировка модуля, который я разработал:

YOURMODULE.info файл:

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

ОБНОВЛЕНИЕ Как предложил Клайв , я изменил файл модуля, чтобы этот пользовательский модуль также работал с многоязычными сайтами.

Файл 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)

API commerce_checkout

commerce_line_item_load ($ LINE_ITEM_ID)

commerce_product_load ($ product_id)

Точки пользователя: вычитать очки программно

commerce_currency_amount_to_decimal ()

subhojit777
источник
Отличное решение, которое пригодится. Могу ли я предложить одно небольшое изменение? Было бы лучше использовать 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. Адаптируйте свое существующее действие по правилам (в этом компоненте правил) так, чтобы это использовалось числом пользовательских баллов (рассчитанное + преобразованное) amount_of_points.

PS 1: Такой «Преобразовать тип данных» просто зависит от того, как работают Правила (по замыслу), поэтому его также не следует рассматривать как ошибку ...

PS 2: я полагаю, ваш вопрос о D7.

Pierre.Vriens
источник