Wie kann ich User Points gewähren, die dem Preis eines Commerce-Produkts entsprechen?

9

Ich möchte dem Produktbesitzer User Point in Höhe des Produktpreises nach dem Verkauf eines Produkts gewähren .

Dafür habe ich eine Regel wie folgt definiert:

  • Ereignisse: Abschluss des Bestellvorgangs

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

Und ich habe eine Regelkomponente wie folgt definiert:

  • Bedingungen: Entity hat Feld (Entity: commerce-line-item, Feld: commerce_product)

  • Aktionen: Erteilen Punkte an einen Benutzer (User: commerce-line-item:commerce-product:creator, Punkte: commerce-line-item:commerce-product:commerce-price:amount)

Wenn ich jedoch eine Komponente speichere, wird folgende Fehlermeldung generiert:

Datenauswahl Commerce-Werbebuchung: Handelsprodukt: Handelspreis: Betrag für Parameterpunkte ist ungültig.

Wie kann ich das machen?

user1468966
quelle
Warum brauchen Sie diese Bedingung?
Subhojit777
Wahrscheinlich liegt der Grund darin, dass das Handelsprodukt nach Abschluss der Kaufabwicklung bereits außerhalb des Geltungsbereichs liegt (ich bin mir nicht sicher). Versuchen Sie, den Wert auszudrucken und einmal zu überprüfen.
Gokul NK
@Daniele Sind Sie sicher, dass Sie dem Benutzer, der das Produkt erstellt hat, Punkte gewähren möchten?
Subhojit777
@ subhojit777 Ja, zum Beispiel um Benutzerpunkte als Benutzerguthaben zu verwalten. Ich erstelle ein virtuelles Produkt, das mir nach dem Kauf den Benutzerpunkt gibt, der für den Kauf realer Produkte erforderlich ist. Leider können Commerce_credits nicht wie Commerce_Benutzerpunkte durch Flexibilität und Währung ersetzt werden.
Daniele Napolitano
@ DanieleNapolitano warum brauchst du diese Bedingung? Ich sehe, dass die Frage Bedingung in Regelkomponente hat.
Subhojit777

Antworten:

5

Zuerst habe ich versucht, Ihre Frage mithilfe des Moduls Regeln und Benutzerpunkte zu beantworten , aber ich habe festgestellt , dass es beim Hinzufügen von Grant-Punkten zu einem Benutzer als Aktion keine solche Datenauswahl für die Auswahl des Benutzers gibt, der das Produkt erstellt hat. Ich habe die Datenauswahl für die Auswahl des Benutzers gefunden, der Eigentümer der Bestellung ist, aber das ist nicht Ihre Anforderung. (Deshalb habe ich dies in Kommentaren klargestellt).

Ich habe eine Modullösung für Ihre Frage gefunden. Das Modul verwendet hook_commerce_checkout_complete () . Von der Hook-Seite:

Ermöglicht Modulen die Ausführung von Geschäftslogik, wenn eine Bestellung die Kaufabwicklung abgeschlossen hat.

Dieser Hook fällt mit dem Ereignis "Kunde schließt Kaufabwicklung ab" zusammen. Wenn dies aufgerufen wird, sollte nur Geschäftslogik ausgeführt werden, z. B. das Aktualisieren des Bestellstatus, das Zuweisen der Bestellung zu einem Benutzerkonto oder das Senden von Benachrichtigungs-E-Mails. Die Interaktion mit dem Benutzer sollte stattdessen über die Checkout-Bereiche auf der Checkout-Abschlussseite erfolgen.

Dies ist die Codierung des Moduls, das ich entworfen habe:

Datei YOURMODULE.info :

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

UPDATE Wie von Clive vorgeschlagen , habe ich die Moduldatei so geändert, dass dieses benutzerdefinierte Modul auch mit mehrsprachigen Sites funktioniert.

YOURMODULE.module Datei:

/**                                                                             
 * 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);
    }
  }
}

Referenzlinks:

userpoints_userpointsapi ($ params)

Commerce_checkout-API

Commerce_line_item_load ($ line_item_id)

Commerce_product_load ($ product_id)

Benutzerpunkte: Punkte programmgesteuert abziehen

Commerce_Currency_amount_to_decimal ()

subhojit777
quelle
Tolle Lösung, das wird sich als nützlich erweisen. Darf ich eine kleine Änderung vorschlagen? Es wäre besser, es field_get_items()zum Abrufen zu verwenden $order->commerce_line_items, auf diese Weise funktioniert dies auch bei mehrsprachigen Websites
Clive
@Clive danke für den Vorschlag .. aber ich habe field_get_item () noch nie benutzt .. Ich muss seine Verwendung lernen und das in dieser Antwort anwenden. Brauchen Sie etwas Zeit :)
subhojit777
0

Als Alternative zur vorherigen Antwort, für die benutzerdefinierter Code erforderlich ist, können Sie die unten beschriebene Alternative ausprobieren, um diese Fehlermeldung zu umgehen ...

Ihre Frage scheint eine Variation (kein Duplikat) der Frage zu sein, wie Benutzerbenutzerpunkte vergeben werden, die dem Wert / berechneten Wert eines bestimmten Felds entsprechen . Versuchen Sie, ähnlich wie bei der akzeptierten Antwort auf diese Frage, Ihre Regelkomponente wie folgt anzupassen:

  1. Fügen Sie diese zusätzlichen Regelaktionen vor der Regelaktion in Ihrer Regelkomponente hinzu, die den Fehler verursacht:

    • Set a variabledas entspricht der " Menge des Produktpreises " (wie in Ihrer Frage), die zu sein scheint commerce-line-item:commerce-product:commerce-price:amount. Nehmen wir an, Sie nennen diese Variable price_amount.
    • Convert data typedieser price_amountVariablen in Ganzzahl . Nehmen wir an, Sie nennen das Konvertierungsergebnis amount_of_points.
  2. Passen Sie Ihre vorhandene Regelaktion (in dieser Regelkomponente) so an, dass die Anzahl der zu gewährenden Benutzerpunkte diese verwendet (berechnet + konvertiert) amount_of_points.

PS 1: Ein solcher "Datentyp konvertieren" hängt einfach davon ab, wie Regeln funktionieren (von Natur aus), daher ist er auch nicht als Fehler anzusehen ...

PS 2: Ich nehme an, Ihre Frage bezieht sich auf D7.

Pierre.Vriens
quelle