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.