Tạo tùy chọn tùy chỉnh trên Lưu sản phẩm


18

Tôi đang tự động tạo tùy chọn cho các sản phẩm của mình bất cứ khi nào sản phẩm được tạo. Những gì tôi đã nhận được cho đến nay là một người quan sát bắn vào catalog_product_save_beforesự kiện và chạy mã sau đây:

    //check that we haven't made the option already
    $options = $product->getProductOptions();
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
    $options[] = array(
        'title' => $product->getDateLabel(),
        'type' => 'date_time',
        'is_require' => 1,
        'sort_order' => 0,
        'is_delete' => '',
        'previous_type' => '',
        'previous_group' => '',
        'price' => '0.00',
        'price_type' => 'fixed',
        'sku' => ''
    );
    $product->setProductOptions($options);
    $product->setCanSaveCustomOptions(true);
    //this line doesnt make sense here, but it works ... kinda
    $product->save();

Nếu tôi rời khỏi $product->save(), tôi sẽ kết thúc với 2 tùy chọn tùy chỉnh được tạo, mặc dù tôi đã kiểm tra để xác minh lần thứ 2 sự kiện kích hoạt câu lệnh return được gọi trong vòng lặp foreach.

Nếu tôi lấy nó ra. Không có tùy chọn tùy chỉnh được tạo ra.

Ai đó có thể cho tôi biết những gì tôi đang làm sai?
Tôi đang làm việc với Magento 1.7


Xin chào, vì bạn đang sử dụng danh mục catalog_product_save_b Before sự kiện, bạn sẽ không cần phải gọi -> save, vì sản phẩm sẽ lưu lại sau khi sự kiện hoàn thành. Điều gì xảy ra nếu bạn loại bỏ cuộc gọi lưu trong người quan sát của bạn?
ProxiBlue

Nếu tôi xóa cuộc gọi để lưu (), không có tùy chọn tùy chỉnh nào được tạo.
Jason Neumann

Câu trả lời:


12

Cho đến khi tôi tìm thấy vấn đề chính xác ở đây là giải pháp. Thay vào đó hãy catalog_product_save_beforesử dụng sự kiện catalog_product_prepare_save. Nhược điểm của việc này là prepare_savesự kiện chỉ được gửi đi khi lưu sản phẩm từ giao diện quản trị viên hoặc API. Vì vậy, nếu bạn đang lưu từ một mã tùy chỉnh, điều này sẽ không được kích hoạt trừ khi bạn kích hoạt nó theo cách thủ công.

Tôi có linh cảm rằng vấn đề có liên quan đến Mage_Catalog_Model_Product::_beforeSave()phương pháp. Trong đó có một số xử lý các tùy chọn tùy chỉnh.
Nhưng catalog_product_save_befoređược gửi đi sau khi quá trình xử lý này xảy ra, vì vậy trong khi các tùy chọn tùy chỉnh được xử lý trong Mage_Catalog_Model_Product::_beforeSave()chúng thực sự trống vì sự kiện chưa kích hoạt nên chúng không được thêm vào.
Nếu bạn di chuyển dòng parent::_beforeSave();trong phương thức tôi đã đề cập ở đầu phương thức, các tùy chọn sẽ được thêm vào (vẫn hai lần, nhưng chúng được thêm vào). Tôi sẽ đăng thêm khi / nếu tôi tìm thấy vấn đề.

[EDIT]
Đã tìm thấy nó. Tôi bằng cách nào đó đúng trong các dòng trên.
Giống như tôi đã nói vấn đề là nó catalog_product_save_befoređược gửi đi sau khi các tùy chọn tùy chỉnh được xử lý. nhưng đây là lý do tại sao nó không hoạt động.
Các tùy chọn tùy chỉnh được lưu trong Mage_Catalog_Model_Product::_afterSave()mã này:

$this->getOptionInstance()->setProduct($this)
            ->saveOptions();

Nhưng $this->getOptionInstance()được điền với các tùy chọn trong _beforeSavekhi mảng tùy chọn trống trong trường hợp của bạn. Do đó ... không có gì để tiết kiệm.
Nếu bạn vẫn muốn sử dụng thì catalog_product_save_befoređây là mã nên hoạt động.

//check that we haven't made the option already
$options = $product->getOptions();
if ($options){
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
}
$option = array(
    'title' => 'Auto Date & Time',
    'type' => 'date_time',
    'is_require' => 1,
    'sort_order' => 0,
    'is_delete' => '',
    'previous_type' => '',
    'previous_group' => '',
    'price' => '0.00',
    'price_type' => 'fixed',
    'sku' => ''
);
//don't use it like this because it has no effect
//$product->setProductOptions($options);
$product->setCanSaveCustomOptions(true);
//use it this way. Populate `$product->getOptionInstance()` directly
$product->getOptionInstance()->addOption($option);
//don't forget to state that the product has custom options
$product->setHasOptions(true);

Xin chào @Marius tôi có thể sử dụng catalog_product_prepare_savethay thế catalog_product_save_beforevà làm thế nào tôi có thể cập nhật tùy chọn nếu có bất kỳ thay đổi nào.
Zaheerabbas 17/12/13

0

Tôi chỉ có cùng một vấn đề, câu trả lời từ marius đã làm việc rất tốt. Tôi phải mất một thời gian để tìm ra cách cập nhật một tùy chọn tùy chỉnh. Với kiến ​​thức rằng $ sản phẩm-> getOptionInstance () -> addOption () hoạt động để lưu một tùy chọn và đặt "is_delete" thành 1 sẽ xóa tùy chọn lưu, tôi đã đưa ra mã này:

$oldOptions = $product->getOptionInstance()->getOptions();
foreach ($oldOptions as $key => $option){
    if($option['title'] == "Custom Option Title") {
        $oldOptions[$key]['is_delete'] = 1;                 
        $product->getOptionInstance()->addOption($oldOptions[$key]);
    }
}

Sau khi xóa, bạn có thể thêm tùy chọn tùy chỉnh cập nhật của mình với mã này:

$newOption = array(
    'title' => "Custom Option Title",
    'type' => 'radio',
    'is_require' => 1,
    'sort_order' => 20,
    'values' => array(
        array(
            'title' => "Value 1 Title",
            'price' => 42.00,
            'price_type' => 'fixed',
            'sku' => "",
            'sort_order' => '1'
        ),
        array(
            'title' => "Value 2 Title",
            'price' => 50,
            'price_type' => 'percent',
            'sku' => "",
            'sort_order' => '2'
        )
    )
);
$product->getOptionInstance()->addOption($newOption);

0

Để tạo tùy chọn tùy chỉnh trong magento trong khi lưu sản phẩm, đây là những bước rất dễ dàng.

   $product = Mage::getModel("catalog/product")->load($productid);

    $options[] = array(
            'title' => 'Pet',
            'type' => 'field',
            'is_require' => 0,
            'sort_order' => 0,
        );
    $options[] = array(
            'title' => 'Date',
            'type' => 'field',
            'is_require' => 1,
            'sort_order' => 2,
        );

    $product->setProductOptions(($options));
    $product->setCanSaveCustomOptions(true);
    $product->save();`

Nếu đã có tùy chọn tùy chỉnh được tạo thì bạn có thể xóa nó bằng mã sau

$product = Mage::getModel("catalog/product")->load($productid);

    $customOptions = $product->getOptions();

    foreach ($customOptions as $option) {
        $option->delete();
    }

    $product->setHasOptions(0);
    $product->save();

Cảm ơn

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.