การสร้างตัวเลือกที่กำหนดเองในการบันทึกผลิตภัณฑ์


18

ฉันกำลังทำงานเพื่อสร้างตัวเลือกที่กำหนดเองสำหรับผลิตภัณฑ์ของฉันโดยอัตโนมัติทุกครั้งที่มีการสร้างผลิตภัณฑ์ สิ่งที่ฉันได้มาถึงตอนนี้คือผู้สังเกตการณ์ที่ยิงcatalog_product_save_beforeเหตุการณ์และรันโค้ดต่อไปนี้:

    //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();

หากฉันออกไปฉันก็สิ้นสุด$product->save()ด้วยการสร้างตัวเลือกที่กำหนดเอง 2 ตัวแม้ว่าฉันจะตรวจสอบเพื่อยืนยันครั้งที่ 2 ที่เหตุการณ์เกิดเพลิงไหม้คำสั่งส่งคืนถูกเรียกในลูป foreach

ถ้าฉันเอามันออกมา ไม่มีการสร้างตัวเลือกที่กำหนดเอง

มีคนบอกฉันว่าฉันทำอะไรผิดหรือเปล่า?
ฉันทำงานกับ Magento 1.7


สวัสดีเนื่องจากคุณกำลังใช้งาน catalog_product_save_before เหตุการณ์คุณไม่จำเป็นต้องเรียก -> บันทึกเนื่องจากผลิตภัณฑ์ woudl บันทึกหลังจากเหตุการณ์เสร็จสมบูรณ์ จะเกิดอะไรขึ้นถ้าคุณลบบันทึกการโทรในผู้สังเกตการณ์ของคุณ?
ProxiBlue

หากฉันลบการโทรเพื่อบันทึก () ไม่มีการสร้างตัวเลือกแบบกำหนดเอง
Jason Neumann

คำตอบ:


12

จนกว่าฉันจะพบปัญหาที่แน่นอนที่นี่คือทางออก แทนที่จะใช้เหตุการณ์catalog_product_save_before catalog_product_prepare_saveข้อเสียของสิ่งนี้คือprepare_saveเหตุการณ์ถูกส่งเมื่อบันทึกผลิตภัณฑ์จากส่วนต่อประสานผู้ดูแลระบบหรือ API เท่านั้น ดังนั้นหากคุณกำลังบันทึกจากรหัสที่กำหนดเองสิ่งนี้จะไม่ถูกเรียกใช้นอกจากคุณจะทริกเกอร์ด้วยตนเอง

ฉันมีลางสังหรณ์ว่าปัญหาเกี่ยวข้องกับMage_Catalog_Model_Product::_beforeSave()วิธีการ ในนั้นมีการประมวลผลตัวเลือกที่กำหนดเองบางส่วน
แต่catalog_product_save_beforeจะถูกส่งหลังจากการประมวลผลนี้เกิดขึ้นดังนั้นในขณะที่ตัวเลือกที่กำหนดเองได้รับการประมวลผลMage_Catalog_Model_Product::_beforeSave()แล้วพวกเขาจะว่างเปล่าเพราะเหตุการณ์ไม่ได้เริ่มดำเนินการดังนั้นพวกเขาจะไม่ถูกเพิ่ม
หากคุณย้ายบรรทัดparent::_beforeSave();ในวิธีที่ฉันพูดถึงที่ด้านบนของวิธีการตัวเลือกจะถูกเพิ่ม (ยังสองครั้ง แต่จะเพิ่ม) ฉันจะโพสต์เพิ่มเติมเมื่อ / ถ้าฉันพบปัญหา

[แก้ไข]
พบมัน ฉันพูดถูกในบรรทัดด้านบน
เช่นเดียวกับฉันกล่าวว่าปัญหาคือว่าcatalog_product_save_beforeส่งหลังจากตัวเลือกที่กำหนดเองมีการประมวล แต่นี่คือเหตุผลที่มันไม่ทำงาน
ตัวเลือกที่กำหนดเองจะถูกบันทึกไว้ในMage_Catalog_Model_Product::_afterSave()รหัสนี้:

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

แต่$this->getOptionInstance()จะเต็มไปด้วยตัวเลือก_beforeSaveเมื่ออาร์เรย์ตัวเลือกว่างเปล่าในกรณีของคุณ ดังนั้น ... ไม่มีอะไรจะบันทึก
หากคุณยังต้องการใช้catalog_product_save_beforeรหัสต่อไปนี้เป็นรหัสที่ควรใช้

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

สวัสดี @Marius ฉันอาจใช้catalog_product_prepare_saveแทนcatalog_product_save_beforeและฉันจะปรับปรุงตัวเลือกได้อย่างไรหากมีการเปลี่ยนแปลงใด ๆ ที่จำเป็น
Zaheerabbas

0

ฉันเพิ่งมีปัญหาเดียวกันคำตอบจาก marius ทำงานได้ดีมาก ฉันใช้เวลาพอสมควรในการหาวิธีอัปเดตตัวเลือกที่กำหนดเอง ด้วยความรู้ที่ว่า $ product-> getOptionInstance () -> addOption () ทำงานเพื่อบันทึกตัวเลือกและการตั้งค่า "is_delete" เป็น 1 จะลบตัวเลือกในการบันทึกฉันมาพร้อมกับรหัสนี้:

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

หลังจากลบคุณสามารถเพิ่มตัวเลือกที่กำหนดเองของคุณด้วยรหัสนี้:

$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

เพื่อสร้างตัวเลือกที่กำหนดเองในวีโอไอพีในขณะที่ประหยัดผลิตภัณฑ์เหล่านี้เป็นขั้นตอนที่ง่ายมาก

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

หากมีการสร้างตัวเลือกที่กำหนดเองแล้วคุณสามารถลบได้โดยใช้รหัสต่อไปนี้

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

    $customOptions = $product->getOptions();

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

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

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.