Як надати Користувацьким очкам рівну ціну комерційного продукту?


9

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

Для цього я визначив правило як нижче:

  • Події: Завершення процесу оформлення каси

  • Дії: цикл ( commerce-order:commerce-line-items)

І я визначив компонент Правил, як показано нижче:

  • Умови: Суб'єкт має поле (Entity:, commerce-line-itemField commerce_product:)

  • Дії: бали Надавайте користувач: (користувачів: commerce-line-item:commerce-product:creator, Бали: commerce-line-item:commerce-product:commerce-price:amount)

Але коли я зберігаю компонент, він генерує це повідомлення про помилку:

Рядок-позиція для вибору даних: commerce-product: commerce-price: сума для пунктів параметра недійсна.

Як я можу це зробити?


Для чого потрібен цей стан?
subhojit777

Можливо, причина полягає в тому, що комерція-продукт вже виходить за межі сфери, коли оформлення замовлення завершено (я не впевнений). Спробуйте надрукувати значення та перевірити його один раз.
Гокуль НК

@Daniele Ви впевнені, що хочете надати бали користувачеві, який створив продукт?
subhojit777

@ subhojit777 Так, наприклад, для адміністративних точок менеджера як кредиту користувача. Я створюю віртуальний продукт, який, придбавши, дає мені точку користувача, необхідну для придбання реальних продуктів. На жаль, commerce_credits не мають гнучкості та заміни валюти, як commerce_userpoints.
Даніеле Наполітано

@DanieleNapolitano навіщо вам ця умова? Я бачу, що питання має умову в компоненті правила.
subhojit777

Відповіді:


5

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

Я знайшов модульне рішення вашого питання. Модуль використовує прив’язку_коммерції_чек-повної () . На сторінці гачка:

Дозволяє модулям виконувати бізнес-логіку, коли замовлення завершує замовлення.

Цей гачок збігається з подією "Клієнт завершує замовлення". Під час цього виклику слід виконувати лише ділову логіку, наприклад оновлення статусу замовлення, присвоєння замовлення обліковому запису користувача або надсилання електронних листів із повідомленнями. Натомість взаємодія з користувачем має відбуватися через оглядові панелі на сторінці завершення оформлення каси.

Це кодування модуля, який я розробив:

Файл 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 ($ парами)

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

@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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.