Sửa đổi tùy chọn tùy chỉnh của một mặt hàng khi thêm nó vào giỏ hàng?


8

Tôi đang lắng nghe sự kiện sales_quote_save_b Before để thông báo khi một mặt hàng được thêm vào giỏ hàng. Khi nó được kích hoạt, tôi lặp qua các tùy chọn vật phẩm như thế này:

$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  
         }
     }
}

Như bạn thấy, ngay khi đạt được một tùy chọn nhất định (myOptionA trong ví dụ), tôi muốn thay đổi tùy chọn đã chọn. Vì vậy, giả sử myOptionA là một trình đơn thả xuống và có 4 giá trị có thể. Trong trường hợp giá trị 1 được chọn, tôi muốn đặt giá trị 4 cho mục đó. Vì vậy, khi giỏ hàng được tải xong, nó phải có giá trị 4 cho myOptionA. Không chỉ tên của nó, mà giá cả của nó là tốt. Làm thế nào tôi có thể làm điều đó?


CMIIW, vòng lặp này cung cấp cho bạn các giá trị khả dụng, không phải giá trị được chọn. Để có được tùy chọn tùy chỉnh thực tế đã được đặt, hãy phân tích $ Array_sku = explode ('-', $ item-> getSku ()); Rõ ràng, đầu tiên là SKU của sản phẩm thực tế $ sku = reset ($ Array_sku); Chưa có giải pháp nào để lấy dữ liệu.
nicolallias

Bit chính tôi đang xem là có thể đặt giá của giá trị tùy chọn. Tôi đã xem xét điều này trong vài ngày qua và tôi không thấy một cách rõ ràng để đặt giá của giá trị. Có vẻ như mục trích dẫn cần phải loại bỏ các tùy chọn và sau đó được xây dựng lại từ yêu cầu.
pspahn

Câu trả lời:


8

catalog_product_type_prepare_full_optionsThay vào đó, bạn có thể viết một người quan sát cho sự kiện , đây là sự kiện cuối cùng trong quy trình thêm vào giỏ hàng trước khi sản phẩm thực sự được thêm vào giỏ hàng và sau khi các tùy chọn tùy chỉnh được chuẩn bị.

Trong trình quan sát, bạn có sẵn các tham số sau:

  • Transport: Đối tượng vận chuyển cho tất cả các tùy chọn tùy chỉnh, vì vậy bạn có thể thay đổi tehem trong trình quan sát. transport->optionslà một mảng trong mẫu option_id => option_value. Chú ý, vận chuyển chính nó là một stdClassđối tượng, không phải là một ví dụ Varien_Object, như bạn có thể mong đợi. Vì vậy, không có phương thức getter và setter cho transport->options.
  • sản phẩm: Sản phẩm sẽ được chuyển đổi thành một mục báo giá sau này.
  • buy_Vquest: Đối tượng buyRequest, bạn có thể đọc nó ở đây và vẫn sửa đổi nó. Đó là một Varien_Objectcái chứa trong số những người khác:

    • sản phẩm: Id sản phẩm
    • tùy chọn: Mảng các tùy chọn tùy chỉnh trong biểu mẫu:

      option_id => value

Nguồn và thêm thông tin: tham khảo thông tin_buyRequest

Vì vậy, người quan sát của bạn có thể trông như thế này:

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

Phần đầu tiên (thay đổi $transport) có liên quan để thực sự thay đổi giá trị của tùy chọn OPTION_A_ID. Phần thứ hai (thay đổi $buyRequest) là tùy chọn, nó sẽ chỉ xóa tất cả dấu vết của giá trị mà khách hàng đã chọn và nếu anh ta sắp xếp lại đơn hàng, giá trị mới sẽ được chọn ngay lập tức vì yêu cầu mua được "thực thi" với các tham số đã thay đổi. Bạn phải quyết định, nếu đó là những gì bạn muốn.


Sự kiện tương tự có thể được sử dụng cho magento 2 cho mục đích tương tự.
Bartosz Kubicki

nó không hoạt động trong magento2
Magento2 Devloper

0

Nếu bạn đã thiết lập thuộc tính của mình thông qua mã, tức là sử dụng tập lệnh cài đặt - bạn sẽ tìm thấy thuộc tính của mình dưới dạng cột bên dưới sales_flat_quote_item.

Nếu nó ở đó, sau đó có quyền truy cập vào biến $ item, bạn sẽ có thể sử dụng các phương thức ma thuật liên quan đến thuộc tính của bạn:

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

Nếu đây là trường hợp, thì bạn sẽ có thể đơn giản hóa mã như sau:

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

Như đã đề cập, giải pháp này sẽ chỉ liên quan đến các thuộc tính mục trích dẫn được thiết lập theo chương trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.