পণ্য সংরক্ষণে কাস্টম বিকল্প তৈরি করা হচ্ছে


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 টি পছন্দসই বিকল্প তৈরি হওয়ার সাথে সাথে বাধা দেব, যদিও আমি দ্বিতীয়বার ইভেন্টটি ফায়ার স্টেটমেন্টটি আগুনের আগুনে যাচাই করেছিলাম তা যাচাই করতে পরীক্ষা করেছিলাম fore

যদি আমি এটি বাইরে নিতে। কোনও কাস্টম বিকল্প তৈরি করা হয় না।

কেউ আমাকে বলতে পারে যে আমি কী ভুল করছি?
আমি ম্যাজেন্টো 1.7 এর সাথে কাজ করছি


হাই, যেহেতু আপনি ক্যাটালগ_প্রডাক্ট_সেভ_বোন ইভেন্ট ব্যবহার করছেন তাই ইভেন্টটি শেষ হওয়ার পরে প্রোডাক্ট ওয়াল স্টুড হিসাবে আপনার -> সেভ কল করতে হবে না। আপনি যদি আপনার পর্যবেক্ষকের সেই সেভ কলটি সরিয়ে দেন তবে কী হবে?
প্রক্সি ব্লু

যদি আমি () সংরক্ষণ করার জন্য কলটি সরিয়ে ফেলি তবে কোনও কাস্টম বিকল্প তৈরি করা হবে না।
জেসন নিউমান

উত্তর:


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();থাকেন তবে বিকল্পগুলি যুক্ত করা হয় (এখনও দু'বার, তবে সেগুলি যুক্ত করা হয়)। সমস্যাটি খুঁজে পেলে আমি আরও পোস্ট করব।

[সম্পাদনা]
এটি খুঁজে পেয়েছে । আমি উপরের লাইনে একরকম ঠিক ছিলাম।
আমি যেমন বলেছি সমস্যাটি 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করতে পারি এবং কোনও পরিবর্তন প্রয়োজন হলে আমি কীভাবে বিকল্প আপডেট করতে পারি can
জাহেরাবস

0

আমার ঠিক একই সমস্যা ছিল, মারিয়াসের উত্তরটি দুর্দান্ত কাজ করেছে। যদিও কাস্টম বিকল্পটি আপডেট করতে হবে তা নির্ধারণ করতে আমার কিছুটা সময় নিয়েছিল। $ 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.