Bagaimana cara memberikan Poin Pengguna sama dengan harga Produk Dagang?

9

Saya ingin memberikan Poin Pengguna kepada pemilik produk dalam jumlah harga produk setelah suatu produk dijual.

Untuk ini saya mendefinisikan aturan sebagai berikut:

  • Acara: Menyelesaikan proses checkout

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

Dan saya mendefinisikan Komponen Aturan sebagai berikut:

  • Kondisi: Entitas memiliki lapangan (Entity: commerce-line-item, Lapangan: commerce_product)

  • Tindakan: poin Grant untuk pengguna: (User: commerce-line-item:commerce-product:creator, Poin: commerce-line-item:commerce-product:commerce-price:amount)

Tetapi ketika saya menyimpan komponen itu menghasilkan pesan kesalahan ini:

Pemilih data commerce-line-item: commerce-product: commerce-price: jumlah untuk titik parameter tidak valid.

Bagaimana saya bisa melakukan itu?

pengguna1468966
sumber
Mengapa Anda membutuhkan kondisi ini?
subhojit777
Mungkin alasannya adalah bahwa produk perdagangan sudah di luar jangkauan karena checkout selesai (saya tidak yakin). Coba cetak nilainya dan periksa sekali.
Gokul NK
@Aniel Anda yakin ingin memberikan poin kepada pengguna yang telah menciptakan produk?
subhojit777
@ subhojit777 Ya, misalnya untuk mengatur titik pengguna sebagai kredit pengguna. Saya membuat produk virtual yang, setelah dibeli, memberi saya titik pengguna yang diperlukan untuk membeli produk nyata. Sayangnya, commerce_credit tidak memiliki fleksibilitas dan penggantian mata uang seperti commerce_userpoints.
Daniele Napolitano
@DanieleNapolitano mengapa Anda membutuhkan kondisi itu? Saya melihat pertanyaan memiliki kondisi dalam komponen aturan.
subhojit777

Jawaban:

5

Pada awalnya saya mencoba menjawab pertanyaan Anda menggunakan modul rules dan userpoints , tetapi saya melihat bahwa ketika menambahkan poin Grant kepada pengguna sebagai tindakan, tidak ada pemilih data untuk memilih pengguna yang telah menciptakan produk. Saya menemukan pemilih data untuk memilih pengguna yang merupakan pemilik pesanan, tetapi itu bukan kebutuhan Anda. (Itulah sebabnya saya mengklarifikasi hal ini dalam komentar).

Saya menemukan solusi modul untuk pertanyaan Anda. Modul ini menggunakan hook_commerce_checkout_complete () . Dari halaman kait:

Mengizinkan modul melakukan logika bisnis saat pesanan menyelesaikan checkout.

Hook ini bertepatan dengan acara "Pelanggan menyelesaikan checkout". Hanya logika bisnis yang harus dilakukan ketika ini dipanggil, seperti memperbarui status pesanan, menetapkan pesanan ke akun pengguna, atau mengirim email pemberitahuan. Interaksi dengan pengguna seharusnya terjadi melalui panel checkout di halaman penyelesaian checkout.

Ini adalah pengkodean modul yang saya rancang:

File YOURMODULE.info :

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

PEMBARUAN Seperti yang disarankan oleh Clive , saya telah mengubah file modul sehingga modul khusus ini juga akan berfungsi dengan situs multibahasa.

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

Tautan referensi:

userpoints_userpointsapi ($ params)

API commerce_checkout

commerce_line_item_load ($ line_item_id)

commerce_product_load ($ product_id)

Userpoints: kurangi poin secara terprogram

commerce_currency_amount_to_decimal ()

subhojit777
sumber
Solusi hebat, itu akan berguna. Bisakah saya menyarankan satu perubahan kecil? Akan lebih baik digunakan field_get_items()untuk mengambil $order->commerce_line_items, dengan cara ini akan bekerja dengan situs multibahasa juga
Clive
@Clive terima kasih atas sarannya .. tapi saya belum pernah menggunakan field_get_item () sebelumnya .. Saya harus mempelajari penggunaannya dan menerapkannya dalam jawaban ini. Butuh waktu :)
subhojit777
0

Sebagai alternatif dari jawaban sebelumnya, yang memerlukan kode khusus, Anda mungkin ingin mencoba alternatif yang dijelaskan di bawah ini untuk mengatasi pesan kesalahan itu ...

Pertanyaan Anda tampaknya merupakan variasi (bukan duplikat) dari pertanyaan " Bagaimana cara memberikan Poin Pengguna kepada pengguna sama dengan nilai bidang / nilai yang dihitung? ". Mirip dengan jawaban yang diterima untuk pertanyaan itu, cobalah untuk menyesuaikan Komponen Aturan Anda seperti:

  1. Tambahkan Tindakan Aturan tambahan ini sebelum Tindakan Aturan dalam Komponen Aturan Anda yang menyebabkan kesalahan:

    • Set a variableyang sesuai dengan " jumlah harga produk " (seperti dalam pertanyaan Anda), yang tampaknya commerce-line-item:commerce-product:commerce-price:amount. Mari kita asumsikan Anda menyebutkan variabel itu price_amount.
    • Convert data typeitu price_amountvariabel bilangan bulat . Anggap Anda menyebutkan hasil konversi itu amount_of_points.
  2. Adaptasi Tindakan Peraturan Anda saat ini (dalam Komponen Aturan itu) sehingga jumlah poin pengguna yang akan diberikan menggunakan ini (dihitung + dikonversi) amount_of_points.

PS 1: "Konversi tipe data" semacam itu hanyalah masalah bagaimana Aturan bekerja (sesuai desain), jadi itu tidak dianggap sebagai bug ...

PS 2: Saya berasumsi pertanyaan Anda tentang D7.

Pierre
sumber