我制作了一个简单的导入脚本,我正在尝试以编程方式保存3个自定义属性(att1,att2,att3)以及所有其他信息(名称,描述,价格,类别......)。
基本上我有:
public function insert_product($data) {
$product = Mage::getModel('catalog/product');
try {
$sku = $data['code'];
if ($this->prodottiImportati[$sku]) {
$sku = $data['code'] . '-1';
}
$this->prodottiImportati[$sku] = true;
$product->setSku($sku);
$product->setName($data['name']);
$product->setDescription($data['desc']);
$product->setShortDescription($data['short_desc']);
$product->setManufacturer('');
$product->setPrice($data['price']);
$product->setTypeId('simple');
$product->setAttributeSetId($this->attributeSet);
$categorie = $this->get_categories($data);
$product->setCategoryIds($categorie);
$product->setWeight($data['peso']);
$product->setTaxClassId(2); // taxable goods
$product->setVisibility(4); // catalog, search
$product->setStatus(1); // enabled
$product->setWebsiteIds($data['store_id']);
$stockData = $product->getStockData();
$stockData['qty'] = $data['qty'];
if ($data['quantita'] > 0) {
$stockData['is_in_stock'] = 1;
} else {
$stockData['is_in_stock'] = 0;
}
$stockData['manage_stock'] = 1;
$stockData['use_config_manage_stock'] = 0;
$product->setStockData($stockData);
$product->setIsMassupdate(true)->setExcludeUrlRewrite(true);
$product->save();
$productID = $product->getId();
} catch(Exception $e) {
echo ($e->getMessage());
}
return $productID;
}
我尝试的第一件事是添加
$productID = $this->insert_product($data);
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($productID), array(
'att1' => $data['att1'],
), $data['store_id']);
所以基本上在调用insert函数之后更新东西,使用插入后得到的ID。 store_id是该给定语言中商店的ID。没有保存任何东西。
第二次尝试,我接下来:Magento add custom options with programmatically importing products 我在insert_product函数中尝试了这个,并且在$ productID = $ this-> insert_product($ data)之后也在外面。两者都没有。
最后我尝试了一个神奇的$ product-> setAtt1('value');在insert_product函数中,不知道Magento如何理解如何设置att1那样,但是......你知道,我在某个地方读了它,我试了一下;)
att1,att2和att3拼写为小写,但是它们有一个大写标签(认为这里不重要),它们是属性组的一部分(我用$ product-> setAttributeSetId($)传递它this-> setAttributi))并且它们都是多个选择属性,所以我可以在teory中传递多个值。
我确定我在途中遗漏了一些东西。有人可以帮忙吗?
答案 0 :(得分:0)
自从我在这里写了10多分钟后,我才找到了方法。我带我永远解决它。
这样做的线索是你必须添加属性ID,而不是值。这至少对我来说有多个选择属性,不确定它是否一直都是真的。
我是这样做的:
在我添加的函数insert_product中:
$optionId = $this->get_option_id_by_code('att1', 'Value of the attribute you need to add');
$product->setAtt1($optionId);
因此,如果yor属性被命名,那就说" brand"它将是:
$optionId = $this->get_option_id_by_code('brand', 'Nike');
$product->setBrand($optionId);
如果您的属性可以包含多个值,则需要将上面的代码更改为:
$optionId = array();
foreach ($myAttributesArray as $someValues) {
$optionId[] = $this->get_option_id_by_code('att1', $someValues);
}
$product->setAtt1($optionId);
foreach只是一个例子,您需要遍历多个值并获取相应的ID并将它们全部添加到setAtt1以将它们作为数组传递。我正在开发一个改进的版本,其中get_option_id_by_code函数以更有效的方式同时执行所有操作。这是一个基本的"基本的"有效的版本,随意使它变得花哨和聪明。
然后我创建了另一个名为get_option_id_by_code的函数,如下所示:
protected function get_option_id_by_code($attrCode, $optionLabel) {
$attrModel = Mage::getModel('eav/entity_attribute');
$attrID = $attrModel->getIdByCode('catalog_product', $attrCode);
$attribute = $attrModel->load($attrID);
$options = Mage::getModel('eav/entity_attribute_source_table')
->setAttribute($attribute)
->getAllOptions(false);
foreach ($options as $option) {
if ($option['label'] == $optionLabel) {
return $option['value'];
}
}
return false;
}
说实话,我发现这是一个其他来源/作者的拼贴画,所以我需要感谢一群聪明的程序员,因为我花了一段时间来完成这个简单的任务,我写了这里的解决方案希望能帮到你们。谢谢!