How to update custom options programatically in ma

2019-01-23 21:30发布

问题:

I have lot of products with custom options, now I have requirement to update only custom options through csv file. so how we can do this programatically?

回答1:

I think this is also useful...

If you are customize the products .

<?php

$magePath = 'app/Mage.php'; 

require_once $magePath;

Varien_Profiler::enable(); 

Mage::setIsDeveloperMode(true); 

ini_set('display_errors', 1);

umask(0);

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$product_ids = array(1,2,167);

$productmodel = Mage::getModel('catalog/product');

foreach ($product_ids as $product_id) { 

/**i use this two arrays for collecte value because i uses inside setData of 
current option*/

$cos=array();
$co=array();

$product = $productmodel->load($product_id);

$options = $product->getProductOptionsCollection();

if (isset($options)) { 

foreach ($options as $o) { 

$title = $o->getTitle();

/**
this block is for changing information of specific option from collection options inside
current product
the save method for this option in end of code
*/

if ($title == "Line 1/Front") { 

$o->setProduct($product); 

$o->setTitle("Line 1/Ftont"); 

$o->setType("drop_down"); 

$o->setIsRequire(1);

$o->setSortOrder(0);


}

/**
this block for update or add information of specific value inside current option
*/

$optionType = $o->getType(); 

//test type

if ($optionType == "drop_down") { 

//getting collection of value related to current option

$values = $o->getValuesCollection(); 

$found = false; 

foreach ($values as $k => $v) { 

//test existing of value for update

if (1 == preg_match("/said$/i", $v->getTitle())) { 

//update and save

$v->setTitle("morad")

->setSku("kk")

->setPriceType("fixed")

->setSortOrder(0)

->setPrice(floatval(13.0000));

$v->setOption($o)->save();

/**
this ligne is important i collecte all value required for normalize save function 
related to current option
*/

$cos[]=$v->toArray($co);

} 
} 


/**
create new value object you can use $option->getValueInstance() for working with 
getSingleton
*/

$value = Mage::getModel('catalog/product_option_value'); 

$value->setOption($o) 

->setTitle('valueiwant') 

->setSku("nn")

->setPriceType("fixed")

->setSortOrder(1)

->setPrice(12)

/**
this ligne is important (relation forigien key) for related this new value
to specific option
*/

->setOptionId($o->getId());

$value->save();

/**
this ligne is important i collecte all value required for normalize save function   
related to current option
*/

$cos[]=$value->toArray($co);
} 


$o->setData("values",$cos)->save();

//var_dump($cos);

}


}
}


回答2:

i found one solution for updating custom options programatically here is the solution

$product = Mage::getModel('catalog/product')->load($product_id);
$values = array();
foreach ($product->getOptions() as $o) {
           $p = $o->getValues();
        }
    }
  foreach($p as $v)
        {
            $values[$v->getId()]['option_type_id']= $v->getId();
                $values[$v->getId()]['title']= 'test';
                $values[$v->getId()]['price']= 23;
                $values[$v->getId()]['price_type']= 'fixed';
                $values[$v->getId()]['sku']= $value1;

          }
        $v->setValues($values);
        $v->saveValues();
$product->save();

hope this help someone this only update custom options value



回答3:

Do you create a module to do that ? If you do, you must use the cron system of Magento and call a method of a custom model :

<config>
    <!--...-->
    <crontab>
        <jobs>
            <company_test>
                <schedule>
                    <cron_expr>0,15,30,45 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>test/testmodel::testMethod</model>
                </run>
            </company_module>
        </jobs>
    </crontab>
</config>

When this is done, you can update the option of a specific product by using the model Mage_Catalog_Model_Product_Option. I don't know how the CSV is made, but the algorithm can be something like that :

// foreach option
/** @var $opt Mage_Catalog_Model_Product_Option */
$opt = Mage::getModel('catalog/product_option');
$opt->setProduct($product);

$optionArray = array(
    'is_delete' => 0,
    'title' => 'Blabla',
    'previous_group' => '',
    'previous_type' => '',
    'type' => 'field',  //can be radio, drop_down, file, area...
    'is_require' => 0,
    'sort_order' => 42,
    'values' => array()
);

$opt->addOption($optionArray);
$opt->saveOptions();
// end foreach

Also check this link : http://subesh.com.np/2009/12/adding-custom-options-product-magento/