Bir Ticari Ürünün fiyatına eşit Kullanıcı Puanları nasıl verilir?


9

Bir ürünü sattıktan sonra User Point'i ürün sahibine ürün fiyatı olarak vermek istiyorum .

Bunun için aşağıdaki gibi bir kural tanımladım:

  • Olaylar: Ödeme işlemini tamamlama

  • Eylemler: Döngü ( commerce-order:commerce-line-items)

Ve aşağıdaki gibi bir Kural Bileşeni tanımladım:

  • Koşullar: Varlık alanı vardır (Varlık: commerce-line-item, Alan: commerce_product)

  • Eylemler: Grant noktaları bir kullanıcıya: (Kullanıcı: commerce-line-item:commerce-product:creator, Puanlar: commerce-line-item:commerce-product:commerce-price:amount)

Ancak bileşeni kaydettiğimde bu Hata iletisini oluşturur:

Veri seçici ticaret satır öğesi: ticaret-ürün: ticaret-fiyat: parametre noktalarının tutarı geçersiz.

Bunu nasıl yapabilirim?


Neden bu duruma ihtiyacınız var?
— subhojit777

Muhtemelen nedeni, ödeme tamamlandıktan sonra ticaret ürününün zaten kapsam dışı olmasıdır (emin değilim). Değeri yazdırmayı deneyin ve bir kez kontrol edin.
— Gokul NK

@Daniele ürünü yaratan kullanıcıya puan vermek istediğinizden emin misiniz?
— subhojit777

@ subhojit777 Evet, örneğin yönetici kullanıcı noktalarını kullanıcı kredisi olarak. Satın aldığımda, gerçek ürünleri satın almak için gereken kullanıcı noktasını veren sanal bir ürün yaratıyorum. Ne yazık ki commerce_credits, commerce_userpoints gibi esneklik ve para biriminin yerini almaz.
— Daniele Napolitano

@DanieleNapolitano neden bu duruma ihtiyacınız var? Sorunun kural bileşeninde durumu olduğunu görüyorum.
— subhojit777

Yanıtlar:


5

İlk başta sorunuzu kurallar ve kullanıcı noktaları modülünü kullanarak yanıtlamaya çalıştım , ancak Grant'i bir kullanıcıya eylem olarak eklerken ürünü oluşturan kullanıcıyı seçmek için böyle bir veri seçici olmadığını gördüm . Siparişin sahibi olan kullanıcıyı seçmek için veri seçiciyi buldum, ancak bu sizin şartınız değil. (Bu yüzden yorumları açıkladım).

Sorunuza bir modül çözümü buldum. Modül hook_commerce_checkout_complete () kullanır . Kanca sayfasından:

Bir siparişin ödeme tamamlandığında modüllerin iş mantığı gerçekleştirmesine izin verir.

Bu kanca "Müşteri ödeme işlemini tamamlar" etkinliğine denk geliyor. Sipariş durumunun güncellenmesi, siparişin bir kullanıcı hesabına atanması veya bildirim e-postalarının gönderilmesi gibi yalnızca çağrıldığında iş mantığı gerçekleştirilmelidir. Kullanıcı ile etkileşim bunun yerine, ödeme tamamlama sayfasındaki ödeme bölmeleri aracılığıyla gerçekleşmelidir.

Tasarladığım modülün kodlaması:

YOURMODULE.info dosyası:

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

GÜNCELLEME Clive tarafından önerildiği gibi , modül dosyasını değiştirdim, böylece bu özel modül çok dilli sitelerle de çalışacak.

YOURMODULE.module dosyası:

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

Referans bağlantılar:

userpoints_userpointsapi ($ params)

commerce_checkout API'sı

commerce_line_item_load ($ LINE_ITEM_ID)

commerce_product_load ($ product_id)

Kullanıcı noktaları: noktaları programlı olarak düşer

commerce_currency_amount_to_decimal ()


Harika bir çözüm, bu kullanışlı olacaktır. Küçük bir değişiklik önerebilir miyim? Kullanımı daha iyi olurdu field_get_items()almak için $order->commerce_line_items, bu çok dilli siteler ile çalışacak şekilde
— Clive

@ Öneri için teşekkürler .. ama daha önce hiç field_get_item () kullanmadım .. Kullanımını öğrenmek ve bu cevapta uygulamak zorunda. Biraz zamana ihtiyacım var :)
— subhojit777

0

Özel kod gerektiren önceki cevaba alternatif olarak, bu hata mesajını aşmak için aşağıda açıklanan alternatifi denemek isteyebilirsiniz ...

Sorunuz, " Kullanıcı Kullanıcı Noktalarını belirli bir alanın değerine / hesaplanan değere eşit nasıl verilir? " Sorusunun bir varyasyonu (kopya değil) gibi görünüyor . Bu sorunun kabul edilen cevabına benzer şekilde, Kural Bileşeninizi aşağıdaki gibi uyarlamaya çalışın:

  1. Hataya neden olan Kural Bileşeninizdeki Kurallar İşleminden önce bu ek Kural Eylemlerini ekleyin:

    • Set a variable" ürün fiyatı tutarına " (sorunuzdaki gibi) karşılık gelir commerce-line-item:commerce-product:commerce-price:amount. Bu değişkeni adlandırdığınızı varsayalım price_amount.
    • Convert data typeBunun price_amountiçin değişken tamsayı . Bu dönüşüm sonucunu adlandırdığınızı varsayalım amount_of_points.
  2. Mevcut Kural Eyleminizi (bu Kurallar Bileşeninde), verilecek kullanıcı noktası sayısı bunu kullanacak şekilde (hesaplanmış + dönüştürülmüş) uyarlayın amount_of_points.

PS 1: Böyle bir "veri türünü dönüştür" sadece Kuralların nasıl çalıştığına bağlıdır (tasarım gereği), bu yüzden de bir hata olarak kabul edilmez ...

PS 2: Sorunuzun D7 hakkında olduğunu varsayıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.