Comment accorder des points utilisateurs égaux au prix d'un produit Commerce?

9

Je voudrais accorder un point utilisateur au propriétaire du produit en montant du prix du produit après la vente d'un produit.

Pour cela, j'ai défini une règle comme ci-dessous:

  • Événements: achèvement du processus de paiement

  • Actions: boucle ( commerce-order:commerce-line-items)

Et j'ai défini un composant de règles comme ci-dessous:

  • Conditions: Entité a champ (Entité: commerce-line-item, Champ: commerce_product)

  • Actions: points de subvention à un utilisateur: (Utilisateur: commerce-line-item:commerce-product:creator, Points: commerce-line-item:commerce-product:commerce-price:amount)

Mais lorsque j'enregistre le composant, il génère ce message d'erreur:

Sélecteur de données commerce-line-item: commerce-product: commerce-price: le montant des points de paramètre n'est pas valide.

Comment je peux faire ça?

user1468966
la source
Pourquoi avez-vous besoin de cette condition?
subhojit777
La raison est probablement que le produit commercial est déjà hors de portée lorsque la caisse est terminée (je ne suis pas sûr). Essayez d'imprimer la valeur et vérifiez-la une fois.
Gokul NK
@Daniele êtes-vous sûr de vouloir accorder des points à l'utilisateur qui a créé le produit?
subhojit777
@ subhojit777 Oui, par exemple pour gérer les points utilisateurs en tant que crédit utilisateur. Je crée un produit virtuel qui, une fois acheté, me donne le point d'utilisateur nécessaire pour acheter de vrais produits. Malheureusement, commerce_credits n'a pas la flexibilité et le remplacement de devise comme commerce_userpoints.
Daniele Napolitano
@DanieleNapolitano pourquoi avez-vous besoin de cette condition? Je vois que la question a une condition dans le composant de règle.
subhojit777

Réponses:

5

Au début , j'essayé de répondre à votre question en utilisant des règles et Points Utilisateurs module, mais je l' ai vu tout en ajoutant des points de subvention à un utilisateur que l' action il n'y a pas sélecteur de données pour sélectionner l'utilisateur qui a créé le produit. J'ai trouvé le sélecteur de données pour sélectionner l'utilisateur qui est le propriétaire de la commande, mais ce n'est pas votre exigence. (C'est pourquoi j'ai clarifié cela dans les commentaires).

J'ai trouvé une solution de module à votre question. Le module utilise hook_commerce_checkout_complete () . À partir de la page du crochet:

Permet aux modules d'exécuter la logique métier lorsqu'une commande termine le paiement.

Ce crochet coïncide avec l'événement "Le client termine le paiement". Seule la logique métier doit être exécutée lorsqu'elle est invoquée, comme la mise à jour du statut de la commande, l'attribution de la commande à un compte d'utilisateur ou l'envoi d'e-mails de notification. L'interaction avec l'utilisateur doit plutôt se produire via les volets de paiement sur la page de fin de paiement.

Voici le codage du module que j'ai conçu:

Fichier YOURMODULE.info :

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

MISE À JOUR Comme suggéré par Clive , j'ai changé le fichier du module afin que ce module personnalisé fonctionne également avec les sites multilingues.

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

Liens de référence:

userpoints_userpointsapi ($ params)

API commerce_checkout

commerce_line_item_load ($ line_item_id)

commerce_product_load ($ product_id)

Userpoints: déduire des points par programme

commerce_currency_amount_to_decimal ()

subhojit777
la source
Excellente solution, cela va être utile. Puis-je suggérer un petit changement? Il serait préférable d'utiliser field_get_items()pour récupérer $order->commerce_line_items, de cette façon cela fonctionnera aussi avec des sites multilingues
Clive
@Clive merci pour la suggestion .. mais je n'ai jamais utilisé field_get_item () auparavant .. Je dois apprendre son utilisation et l'appliquer dans cette réponse. Besoin de temps :)
subhojit777
0

Comme alternative à la réponse précédente, qui nécessite un code personnalisé, vous pouvez essayer l'alternative décrite ci-dessous pour contourner ce message d'erreur ...

Votre question semble être une variante (et non un doublon) de la question " Comment accorder aux utilisateurs des points utilisateurs égaux à la valeur de certains champs / valeur calculée? ". Semblable à la réponse acceptée à cette question, essayez d'adapter votre composant de règles comme suit:

  1. Ajoutez ces actions de règles supplémentaires avant l'action de règles dans votre composant de règles qui provoque l'erreur:

    • Set a variablecela correspond au " montant du prix du produit " (comme dans votre question), ce qui semble être le cas commerce-line-item:commerce-product:commerce-price:amount. Supposons que vous nommiez cette variable price_amount.
    • Convert data typede cette price_amountvariable en entier . Supposons que vous nommiez ce résultat de conversion amount_of_points.
  2. Adaptez votre action de règles existante (dans ce composant de règles) de sorte que le nombre de points utilisateur à accorder l'utilise (calculé + converti) amount_of_points.

PS 1: Un tel "type de données de conversion" est simplement une question de fonctionnement des règles (par conception), donc il ne doit pas être considéré comme un bug non plus ...

PS 2: Je suppose que votre question concerne D7.

Pierre.Vriens
la source