2016-05-10 10 views
0

シンプルなインポートスクリプトを作成しましたが、3つのカスタム属性(att1、att2、att3)を他のすべての情報(名前、説明、価格、カテゴリ..)とともにプログラムで保存しようとしています。 )。Magento 1.9.Xはカスタム属性をプログラムで保存します

だから基本的に私が持っている:私はしようと試み

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; 
} 

まず最初は、IDを使用して、挿入関数が呼び出された後のものを更新する基本的にそう

$productID = $this->insert_product($data); 
Mage::getSingleton('catalog/product_action')->updateAttributes(
      array($productID), array(
       'att1' => $data['att1'], 
      ), $data['store_id']); 

を追加した挿入後に得ました。 store_idは、指定された言語のストアのIDです。何も保存しませんでした。

第二にしようと、私はこのfollwed:私はinsert_product関数内でも外で$のproductID =の$ this - > insert_product($データ)の後にあることをしようと試みMagento add custom options with programmatically importing products を。どちらもうまくいかなかった。

最後に私は魔法の$ product-> setAtt1( 'value')を試しました。それで、Magentoがどうやってatt1を設定するのか分かりませんが、わたしはどこかに読んで試してみました)

att1、att2とatt3は小文字で、 althoug彼らは大文字のラベルを持っています(ここでは問題ないと思います)、それらは属性グループの一部です($ product-> setAttributeSetId($ this-> setAttributi)で渡しています)、それらはすべて複数の選択属性ですそれで、私は童話で複数の価値を彼らに渡すことができました。

私は途中で何かが不足していると確信しています。誰も助けることができますか?

答えて

0

私がここに書いてから10分後、私は道を見つけることができました。私はそれを解決するために永遠に私を連れて行きました。

これは、値ではなく属性IDを追加する必要があるということです。それは少なくとも私にとっては複数の選択属性があり、それが本当であるかどうかは不明です。ここで

は、私がやった方法です:私は追加された機能のinsert_productで

$optionId = $this->get_option_id_by_code('att1', 'Value of the attribute you need to add'); 
$product->setAtt1($optionId); 

ヨール属性の名前がそれでは、 "ブランド" とは、それがなると言ってみましょう:

$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関数を一度にすべて行う、改良されたバージョンに取り組んでいます。これは動作する「基本的な」バージョンであり、自由で賢明でスマートに感じることができます。私は他のソース/著者のコラージュでこれを見つけたので、私はここに賢くプログラマーの束に感謝する必要が正直に言うと

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; 
} 

それから私はこのようなget_option_id_by_codeと呼ばれる別の関数を作成しましたそして、そこに、私がこの単純な作業で苦労するのにしばらく時間がかかったので、私はここで解決策を書いて、皆さんを助けることを望んでいました。ありがとう!