Come concedere punti utente pari al prezzo di un prodotto commerciale?


9

Vorrei concedere User Point al proprietario del prodotto in quantità di prezzo del prodotto dopo che un prodotto è stato venduto.

Per questo ho definito una regola come di seguito:

  • Eventi: completamento della procedura di pagamento

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

E ho definito un componente Regole come di seguito:

  • Condizioni: Entity ha campo (Entity: commerce-line-item, Campo: commerce_product)

  • Azioni: punti Concedere un utente: (Utente: commerce-line-item:commerce-product:creator, Punti: commerce-line-item:commerce-product:commerce-price:amount)

Ma quando salvo il componente genera questo messaggio di errore:

Selettore dati elemento pubblicitario: prodotto commerciale: prezzo commerciale: importo per i punti parametro non è valido.

Come posso farlo?


Perché hai bisogno di questa condizione?
subhojit777,

Probabilmente il motivo è che il prodotto commerciale è già fuori portata al completamento del checkout (non ne sono sicuro). Prova a stampare il valore e controllalo una volta.
Gokul NK,

@Daniele sei sicuro di voler assegnare punti all'utente che ha creato il prodotto?
subhojit777,

@ subhojit777 Sì, ad esempio per gestire i punti utente come credito utente. Creo un prodotto virtuale che, una volta acquistato, mi fornisce il punto di accesso necessario per acquistare prodotti reali. Sfortunatamente commerce_credits non ha flessibilità e sostituzione di valuta come commerce_userpoints.
Daniele Napolitano,

@DanieleNapolitano perché hai bisogno di quella condizione? Vedo che la domanda ha delle condizioni nel componente regola.
subhojit777,

Risposte:


5

All'inizio ho provato a rispondere alla tua domanda utilizzando il modulo regole e punti utente , ma ho visto che mentre aggiungevo punti Grant a un utente come azione non esiste un selettore di dati per selezionare l'utente che ha creato il prodotto. Ho trovato il selettore dati per selezionare l'utente che è il proprietario dell'ordine, ma non è questo il tuo requisito. (Ecco perché l'ho chiarito nei commenti).

Ho trovato una soluzione di modulo alla tua domanda. Il modulo utilizza hook_commerce_checkout_complete () . Dalla pagina hook:

Consente ai moduli di eseguire la logica aziendale quando un ordine completa il pagamento.

Questo hook coincide con l'evento "Il cliente completa il checkout". Solo la logica aziendale deve essere eseguita quando viene invocata, ad esempio l'aggiornamento dello stato dell'ordine, l'assegnazione dell'ordine a un account utente o l'invio di e-mail di notifica. L'interazione con l'utente dovrebbe invece avvenire attraverso i riquadri di checkout nella pagina di completamento del checkout.

Questa è la codifica del modulo che ho progettato:

File YOURMODULE.info :

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

AGGIORNAMENTO Come suggerito da Clive , ho modificato il file del modulo in modo che questo modulo personalizzato funzioni anche con siti multilingue.

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

Link di riferimento:

userpoints_userpointsapi ($ params)

API commerce_checkout

commerce_line_item_load ($ line_item_id)

commerce_product_load ($ product_id)

Userpoint: detrarre punti a livello di codice

commerce_currency_amount_to_decimal ()


Ottima soluzione, tornerà utile. Potrei suggerire un piccolo cambiamento? Sarebbe meglio usare field_get_items()per recuperare $order->commerce_line_items, in questo modo funzionerà anche con siti multilingue
Clive

@Clive grazie per il suggerimento .. ma non ho mai usato field_get_item () prima .. Devo imparare il suo utilizzo e applicarlo in questa risposta.
Ho

0

In alternativa alla risposta precedente, che richiede un codice personalizzato, potresti provare l'alternativa descritta di seguito per aggirare quel messaggio di errore ...

La tua domanda sembra essere una variazione (non un duplicato) della domanda " Come concedere User User Points pari al valore di un determinato campo / valore calcolato? ". Simile alla risposta accettata a quella domanda, prova ad adattare il tuo componente delle regole in questo modo:

  1. Aggiungi queste azioni regole aggiuntive prima dell'azione regole nel componente Regole che causa l'errore:

    • Set a variableche corrisponde alla " quantità del prezzo del prodotto " (come nella tua domanda), che sembra essere commerce-line-item:commerce-product:commerce-price:amount. Supponiamo che tu chiami quella variabile price_amount.
    • Convert data typedi quella price_amountvariabile in numero intero . Supponiamo che tu chiami quel risultato di conversione amount_of_points.
  2. Adatta l'azione delle regole esistente (in quel componente delle regole) in modo che il numero di punti utente da concedere utilizzi questo (calcolato + convertito) amount_of_points.

PS 1: Tale "Converti tipo di dati" è semplicemente una questione di come funzionano le Regole (in base alla progettazione), quindi non deve essere considerato come un bug ...

PS 2: suppongo che la tua domanda riguardi D7.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.