Jak przyznać punkty użytkownika równe cenie produktu handlowego?

9

Chciałbym przyznać User Point właścicielowi produktu w wysokości ceny produktu po sprzedaży produktu.

W tym celu zdefiniowałem regułę jak poniżej:

  • Zdarzenia: Zakończenie procesu finalizowania transakcji

  • Akcje: Loop ( commerce-order:commerce-line-items)

I zdefiniowałem komponent reguł, jak poniżej:

  • Warunki: jednostka ma pole (Podmiot: commerce-line-itemField: commerce_product)

  • Operacje: Grant Punkty dla użytkownika: (User: commerce-line-item:commerce-product:creator, punkty: commerce-line-item:commerce-product:commerce-price:amount)

Ale kiedy zapisuję komponent, generuje ten komunikat o błędzie:

Selektor danych pozycja handlowa: produkt handlowy: cena handlowa: kwota dla punktów parametrów jest nieprawidłowa.

Jak mogę to zrobić?

użytkownik1468966
źródło
Dlaczego potrzebujesz tego warunku?
subhojit777
Prawdopodobnie jest to spowodowane tym, że produkt handlowy jest już poza zakresem, ponieważ realizacja transakcji jest zakończona (nie jestem pewien). Spróbuj wydrukować wartość i sprawdź raz.
Gokul NK
@Daniele, czy na pewno chcesz przyznać punkty użytkownikowi, który utworzył produkt?
subhojit777
@ subhojit777 Tak, na przykład do zarządzania punktami użytkownika jako kredyt użytkownika. Tworzę wirtualny produkt, który po zakupie daje mi punkt użytkownika potrzebny do zakupu prawdziwych produktów. Niestety, commerce_credits nie mają elastyczności i możliwości wymiany waluty, jak commerce_userpoints.
Daniele Napolitano
@DanieleNapolitano, dlaczego potrzebujesz tego warunku? Widzę, że pytanie ma warunek w składniku reguły.
subhojit777

Odpowiedzi:

5

Na początku próbowałem odpowiedzieć na twoje pytanie za pomocą modułu reguł i punktów użytkownika , ale zauważyłem, że podczas dodawania punktów Grant do użytkownika jako działania nie ma takiego selektora danych do wybierania użytkownika, który utworzył produkt. Znalazłem selektor danych do wybierania użytkownika, który jest właścicielem zamówienia, ale nie jest to twoje wymaganie. (Dlatego wyjaśniłem to w komentarzach).

Znalazłem modułowe rozwiązanie twojego pytania. Moduł używa hook_commerce_checkout_complete () . Ze strony haka:

Umożliwia modułom wykonywanie logiki biznesowej po zakończeniu realizacji zamówienia.

Ten hak zbiega się ze zdarzeniem „Klient kończy realizację zamówienia”. Po wywołaniu powinna być wykonywana tylko logika biznesowa, taka jak aktualizacja statusu zamówienia, przypisanie zamówienia do konta użytkownika lub wysyłanie powiadomień e-mail. Zamiast tego interakcja z użytkownikiem powinna odbywać się poprzez panele kasy na stronie zakończenia kasy.

Oto kodowanie zaprojektowanego przeze mnie modułu:

Plik YOURMODULE.info :

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

AKTUALIZACJA Jak zasugerował Clive , zmieniłem plik modułu, aby ten moduł niestandardowy działał również z witrynami wielojęzycznymi.

Plik 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);
    }
  }
}

Linki referencyjne:

userpoints_userpointsapi ($ params)

interfejs API commerce_checkout

commerce_line_item_load ($ line_item_id)

commerce_product_load ($ id_produktu)

Punkty użytkownika: programowo odejmij punkty

commerce_currency_amount_to_decimal ()

subhojit777
źródło
Świetne rozwiązanie, które się przyda. Czy mogę zasugerować jedną małą zmianę? Lepiej byłoby użyć field_get_items()do pobierania $order->commerce_line_items, w ten sposób będzie to działać również w przypadku witryn wielojęzycznych
Clive
@Clive dziękuję za sugestię .. ale nigdy wcześniej nie użyłem field_get_item () .. Muszę nauczyć się jego użycia i zastosować to w tej odpowiedzi. Potrzebujesz trochę czasu :)
subhojit777
0

Jako alternatywę dla poprzedniej odpowiedzi, która wymaga niestandardowego kodu, możesz wypróbować alternatywę opisaną poniżej, aby obejść ten komunikat o błędzie ...

Twoje pytanie wydaje się być odmianą (a nie duplikatem) pytania „ Jak przyznać punkty użytkownika równe wartości określonego pola / wartości obliczonej? ”. Podobnie jak w przypadku zaakceptowanej odpowiedzi na to pytanie, spróbuj dostosować komponent reguł w następujący sposób:

  1. Dodaj te dodatkowe Akcje Reguł przed Akcją Reguły w Komponencie Reguły, który powoduje błąd:

    • Set a variableco odpowiada „ kwocie ceny produktu ” (jak w pytaniu), która wydaje się być commerce-line-item:commerce-product:commerce-price:amount. Załóżmy, że nazwiesz tę zmienną price_amount.
    • Convert data typetej price_amountzmiennej na liczbę całkowitą . Załóżmy, że nazwiesz ten wynik konwersji amount_of_points.
  2. Dostosuj istniejące działanie Reguły (w tym Komponencie Reguł), aby wykorzystało to liczbę punktów użytkownika, która ma zostać przyznana (obliczona + przeliczona) amount_of_points.

PS 1: Taki „Konwertuj typ danych” jest po prostu kwestią tego, jak działają reguły (zgodnie z projektem), więc nie należy go uważać za błąd ...

PS 2: Zakładam, że twoje pytanie dotyczy D7.

Pierre.Vriens
źródło