Memodifikasi opsi ubahsuaian item saat menambahkannya ke troli?

8

Saya mendengarkan sales_quote_save_sebelum acara memperhatikan ketika item ditambahkan ke troli. Setelah dipecat, saya beralih melalui opsi item seperti ini:

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

Seperti yang Anda lihat, segera setelah opsi tertentu (myOptionA dalam contoh) tercapai, saya ingin mengubah opsi yang dipilih. Jadi katakanlah myOptionA adalah drop down dan memiliki 4 nilai yang mungkin. Jika nilai 1 dipilih, saya ingin menetapkan nilai 4 untuk item itu. Jadi, ketika kereta selesai memuat, ia harus memiliki nilai 4 untuk myOptionA. Bukan hanya namanya, tapi harganya juga. Bagaimana saya bisa melakukan itu?

pengguna1638055
sumber
CMIIW, loop ini memberi Anda nilai yang tersedia, bukan yang dipilih. Untuk mendapatkan opsi kustom aktual yang telah ditetapkan, parse $ array_sku = meledak ('-', $ item-> getSku ()); Jelas, yang pertama adalah SKU dari produk aktual $ sku = reset ($ array_sku); Belum punya solusi untuk mendapatkan data.
nicolallias
Bit kunci yang saya lihat adalah mampu menetapkan harga dari nilai opsi. Saya telah melihat beberapa ini selama beberapa hari terakhir dan saya tidak melihat cara yang jelas untuk menetapkan harga nilainya. Sepertinya kutipan item perlu memiliki opsi dihapus dan kemudian dibangun kembali dari permintaan.
pspahn

Jawaban:

8

catalog_product_type_prepare_full_optionsSebagai gantinya, Anda dapat menulis pengamat untuk acara tersebut , yang merupakan acara terakhir dalam proses penambahan ke keranjang sebelum produk ditambahkan ke keranjang dan setelah opsi khusus disiapkan.

Di pengamat Anda memiliki parameter berikut tersedia:

  • transport: Mengangkut objek untuk semua opsi khusus, sehingga Anda dapat mengubah tehem di pengamat. transport->optionsadalah array dalam formulir option_id => option_value. Perhatian, transportasi itu sendiri adalah stdClassobjek, bukan turunan dari Varien_Object, seperti yang Anda harapkan. Jadi tidak ada metode pengambil dan penyetel untuk transport->options.
  • produk: Produk yang akan dikonversi menjadi item kutipan di kemudian hari.
  • buy_request: Objek buyRequest, Anda dapat membacanya di sini dan masih memodifikasinya juga. Itu Varien_Objectyang mengandung antara lain:

    • produk: id produk
    • opsi: Array opsi khusus dalam bentuk:

      option_id => value

Sumber dan info lebih lanjut: referensi info_buyRequest

Jadi pengamat Anda mungkin terlihat seperti ini:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

Bagian pertama (perubahan $transport) relevan untuk benar-benar mengubah nilai opsi OPTION_A_ID. Bagian kedua (pengubahan $buyRequest) adalah opsional, itu hanya akan menghapus semua jejak nilai yang dipilih pelanggan dan jika dia menata ulang pesanan, nilai baru akan segera dipilih karena permintaan beli akan "dieksekusi" dengan parameter yang diubah. Anda harus memutuskan, jika itu yang Anda inginkan.

Fabian Schmengler
sumber
Acara yang sama dapat digunakan untuk magento 2 untuk tujuan yang sama.
Bartosz Kubicki
itu tidak berfungsi di magento2
Magento2 Devloper
0

Jika Anda telah mengatur atribut Anda melalui kode, yaitu menggunakan skrip instalasi - Anda akan menemukan atribut Anda sebagai kolom di bawah sales_flat_quote_item.

Jika ada, maka memiliki akses ke variabel $ item, Anda harus dapat menggunakan metode ajaib yang berkaitan dengan atribut Anda:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

Jika ini masalahnya, maka Anda harus dapat menyederhanakan kode sebagai berikut:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

Seperti yang disebutkan, solusi ini hanya akan berhubungan dengan atribut item penawaran yang diatur secara programatik.

Dan Hanly
sumber