उत्पाद सहेजें पर कस्टम विकल्प बनाना


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 बार सत्यापित करने के लिए जांच कर रहा हूं कि ईवेंट स्टेटमेंट को फॉयर लूप में कहा जाता है।

अगर मैं इसे बाहर निकाल लूं। कोई कस्टम विकल्प नहीं बनाए गए हैं।

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?
मैं Magento 1.7 के साथ काम कर रहा हूँ


नमस्ते, जब से आप कैटलॉग_प्रोडक्ट_सैव_एब्रो इवेंट का उपयोग कर रहे हैं, तो आपको -> सेव करने की जरूरत नहीं होगी, क्योंकि इवेंट पूरा होने के बाद प्रोडक्ट वूडल सेव होता है। यदि आप अपने पर्यवेक्षक में कॉल सेव करते हैं तो क्या होता है?
ProxiBlue

यदि मैं बचाने के लिए कॉल हटाता हूं () कोई कस्टम विकल्प नहीं बनाए गए हैं।
जेसन न्यूमैन

जवाबों:


12

जब तक मुझे सही समस्या का समाधान नहीं मिल जाता, तब तक यहां समाधान है। इसके बजाय catalog_product_save_beforeघटना का उपयोग करें catalog_product_prepare_save। इसका नकारात्मक पक्ष यह है कि prepare_saveईवेंट को केवल तब ही भेजा जाता है जब किसी उत्पाद को एडमिन इंटरफ़ेस या एपीआई से बचा रहा हो। इसलिए यदि आप एक कस्टम कोड से बचत कर रहे हैं तो यह ट्रिगर नहीं होगा जब तक कि आप इसे मैन्युअल रूप से ट्रिगर न करें।

मैं एक कूबड़ है कि समस्या Mage_Catalog_Model_Product::_beforeSave()विधि के साथ कुछ करना है । वहाँ कस्टम विकल्पों में से कुछ प्रसंस्करण है।
लेकिन catalog_product_save_beforeयह प्रसंस्करण होने के बाद भेजा जाता है, इसलिए जब कस्टम विकल्प संसाधित Mage_Catalog_Model_Product::_beforeSave()होते हैं तो वे वास्तव में खाली होते हैं क्योंकि घटना अभी तक आग नहीं लगी थी इसलिए उन्हें जोड़ा नहीं गया है।
यदि आप parent::_beforeSave();विधि में सबसे ऊपर बताए गए तरीके से लाइन को आगे बढ़ाते हैं, तो विकल्प जोड़े जाते हैं (अभी भी दो बार, लेकिन वे जोड़े जाते हैं)। जब मुझे समस्या मिलेगी तो मैं और पोस्ट करूँगा।

[EDIT]
इसे मिला। मैं किसी तरह ऊपर लाइनों में सही था।
जैसा कि मैंने कहा समस्या यह है कि 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);

नमस्कार @ मैं catalog_product_prepare_saveइसके बजाय उपयोग कर सकता हूं catalog_product_save_beforeऔर यदि आवश्यक हो तो किसी भी बदलाव के लिए मैं कैसे अद्यतन विकल्प चुन सकता हूं।
ज़हीरब्बास

0

मुझे बस एक ही समस्या थी, मर्सिया के जवाब ने बहुत अच्छा काम किया। हालांकि मुझे यह पता लगाने में कुछ समय लगा कि कस्टम विकल्प को कैसे अपडेट किया जाए। इस ज्ञान के साथ कि $ उत्पाद-> 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();

धन्यवाद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.