首页 文章

Magento API:将预先存在的简单产品分配给可配置产品

提问于
浏览
10

我有一个包含大量库存商品的客户数据库,这些库存商品作为简单产品上传到Magento .

现在我需要对它们进行分组并将它们分配给可配置的产品,其大小和颜色是它们的可配置属性 .

Magento API有一个Product_Link类,有一个看起来很有前景的方法:catalog-product-link.assign(link),但我不能在我的生活中找出我需要使用哪些参数来使它与可配置产品一起工作,提供这就是如何使用assign .

7 回答

  • 5

    那么这里的笔记帮我搞定了 . 所以我想我会与您分享将简单产品添加到现有可配置产品的代码 .

    这段代码假设简单的产品是一个有效的产品,我不知道如果不是这样会发生什么 .

    private function _attachProductToConfigurable( $_childProduct, $_configurableProduct ) {
       $loader = Mage::getResourceModel( 'catalog/product_type_configurable' )->load( $_configurableProduct );
    
       $ids = $_configurableProduct->getTypeInstance()->getUsedProductIds(); 
       $newids = array();
       foreach ( $ids as $id ) {
          $newids[$id] = 1;
       }
    
       $newids[$_childProduct->getId()] = 1;
    
       $loader->saveProducts( $_configurableProduct->getId(), array_keys( $newids ) );                
    }
    
  • 3

    Scimon接受的答案中的代码在最近的magento版本中不再起作用(至少在1.7中) . 但幸运的是,您需要一个小修复才能让它再次运行:

    private function _attachProductToConfigurable( $_childProduct, $_configurableProduct ) {
       $loader = Mage::getResourceModel( 'catalog/product_type_configurable' )->load( $_configurableProduct, $_configurableProduct->getId() );
    
       $ids = $_configurableProduct->getTypeInstance()->getUsedProductIds(); 
       $newids = array();
       foreach ( $ids as $id ) {
          $newids[$id] = 1;
       }
    
       $newids[$_childProduct->getId()] = 1;
    
       //$loader->saveProducts( $_configurableProduct->getid(), array_keys( $newids ) );                
       $loader->saveProducts( $_configurableProduct, array_keys( $newids ) );                
    }
    
  • 0

    我正在努力做到这一点 .

    到目前为止,我发现这些项目有用作为参考:

    到目前为止我会发布我的代码,并希望一旦它工作就更新它 .

    // Set 'item_size' as the super attribute  # choose your own attribute!
    // this is the 'choose-able' field that differenciates products
    $super_attributes=array( Mage::getModel('eav/entity_attribute')
      ->loadByCode('catalog_product','item_size')
      ->getData('attribute_id')
      );  
    $product_collection=Mage::getModel('catalog/product')->getCollection();
    
    // Fetch configurable orders
    $product_collection->addFieldToFilter('type_id',Array('eq'=>"configurable"));
    #$product_collection->addFieldToFilter('sku',Array('eq'=>"ASMCL000002"));  
    
    $product_collection->addAttributeToSelect('*');
    
    $count=0;
    foreach($product_collection as $product) {
      $sku = $product->getSku();
      echo "SKU: $sku\n";
    
      $simple_children_collection = Mage::getModel('catalog/product')->getCollection();
      $simple_children_collection->addAttributeToSelect('*');
      $simple_children_collection->addFieldToFilter('sku',Array('like'=>$sku . "-%"));
      echo "children: ";
      foreach($simple_children_collection as $child) {
          $child_sku = $child->getSku();
          echo "$child_sku ";
          #visiblity should be 'nowhere'
      }
      echo "\n";
    
    if (!$product->getTypeInstance()->getUsedProductAttributeIds()) {
      # This is a new product without the Configurable Attribue Ids set
      $product->getTypeInstance()
        ->setUsedProductAttributeIds( $super_attributes );
    
      //$product->setConfigurableAttributesData(array($_attributeData));
      $product->setCanSaveConfigurableAttributes(true); # Not sure if this is needed.
    
      $product->setConfigurableProductsData(''); # Use this to add child products.
    
    }
    
    
      $count++;
    
      try {
          $product->save();
          $productId = $product->getId();
          echo $product->getId() . ", $sku updated\n";
      }
      catch (Exception $e){
          echo "$sku not added\n";
          echo "exception:$e";
      }
    
    }
    echo "\nCount is $count\n";
    

    好的,这使用'item_size'作为区分“简单”产品的属性 . 此外,这假设“可配置的”父SKU是子SKU的根 . 例如,ABC001是父母,而ABC001-SMALL和ABC001-LARGE是简单的孩子 .

    希望能帮助别人 .

  • 1

    我这是一个没有受过教育的猜测,但我认为你的要求不能用现有的API完成 . 您必须自己编写或直接访问数据库 .

  • 2

    这是我用PHP直接做的hack-y方式 . 有三个相关的表格 . 我使用颜色和大小作为我的属性 . 我的父产品(可配置)实际上并不存在于我的目录中 . 它们基本上是模型级别,然后产品是SKU级别 . 所以LIKE'parentproductsku%'为孩子们服务 .

    $query1 = "SELECT * FROM mage_catalog_product_entity WHERE type_id= 'configurable'";
        //Find the parent id
        $statusMessage = "Ok, found a product with a confgurable attribute";
        $result1 = $this->runQuery($query1, "query1", $statusMessage);
        while ($row1 = mysql_fetch_assoc($result1)) { //entering the first loop where products are configurable
            $this->parentId = $row1['entity_id'];
            $this->parentSku = $row1['sku'];
    
            echo "The SKU was $this->parentSku" . "
    "; //insert these into the link table for association $query2 = "SELECT * FROM mage_catalog_product_entity WHERE type_id= 'simple' AND sku LIKE '" . $this->parentSku . "%';"; // find the child ids that belong to the parent $statusMessage = "Found some children for $this->parentSku"; $result2 = $this->runQuery($query2, "query2", $statusMessage); while ($row2 = mysql_fetch_assoc($result2)) {//entering the second loop where SKU is like model sku $this->childId = $row2['entity_id']; $this->childSku = $row2['sku']; echo "Now we're working with a child SKU $this->childSku" . "
    "; //"REPLACE INTO catalog_product_super_attribute SET product_id='".$product->entity_id."', attribute_id='".$attribute->attribute_id."', position='".$position."'"; $query3 = "REPLACE INTO mage_catalog_product_super_attribute (product_id, attribute_id, position) VALUES ('" . $this->childId . "', '76', '0');"; $message3 = "Inserted attribute for color for ID $this->childId SKU $this->childSku"; $result3 = $this->runQuery($query3, "query3", $message3); $query4 = "REPLACE INTO mage_catalog_product_super_attribute_label (product_super_attribute_id, store_id, use_default, value) VALUES (LAST_REPLACE_ID(), '0', '0', 'Color');"; $message4 = "Inserted attribute for Color SKU $this->childSku ID was $this->db->insert_id"; $result4 = $this->runQuery($query4, "query4", $message4); $query5 = "REPLACE INTO mage_catalog_product_super_attribute (product_id, attribute_id, position) VALUES ('" . $this->childId . "', '529', '0');"; $message5 = "Inserted attribute for Product Size SKU $this->childSku"; $result5= $this->runQuery($query5, "query5", $message5); $query6 = "REPLACE INTO mage_catalog_product_super_attribute_label (product_super_attribute_id, store_id, use_default, value) VALUES (LAST_REPLACE_ID(), '0', '0', 'Size');"; $message6 = "Inserted attribute for Size SKU $this->childSku ID was $this->db->insert_id"; $result6 = $this->runQuery($query6, "query6", $message6); $query7 = "REPLACE INTO mage_catalog_product_super_link (product_id, parent_id) VALUES ('" . $this->childId . "', '" . $this->parentId . "');"; $message7 = "Inserted $this->childId and $this->parentId into the link table"; $result7 = $this->runQuery($query7, "query7", $message7); $query8 = "REPLACE INTO mage_catalog_product_relation (parent_id, child_id) VALUES ('" . $this->parentId . "', '" . $this->childId . "');"; $message8 = "Inserted $this->childId and $this->parentId into the link table"; $result8 = $this->runQuery($query8, "query8", $message8); } //end while row 2 the child ID } //end while row 1 the parent id
  • 1

    令人惊讶的是,如果您所有的简单产品共享相同的价格,这是有效的:

    $childProducts = $configurable->getTypeInstance(true)->getUsedProductIds($configurable);
    
            // Don't add this product if it's already there
            if(!in_array($child->getId(), $childProducts)) {    
                $childProducts[] = $child->getId();
            }
    
    
            $existingIds = $configurable->getTypeInstance(true)->getUsedProductAttributeIds($configurable);
            $newAttributes = array();
    
            foreach($configurable->getTypeInstance(true)->getSetAttributes($configurable) as $attribute) {
    
            if(!in_array($attribute->getId(), $existingIds) && $configurable->getTypeInstance(true)->canUseAttribute($attribute)
                && $child->getAttributeText($attribute->getAttributeCode())) {
    
                // Init configurable attribute
                $configurableAtt = Mage::getModel('catalog/product_type_configurable_attribute')
                    ->setProductAttribute($attribute);
    
                // Add new attribute to array
                $newAttributes[] = array(
                   'id'             => $configurableAtt->getId(),
                   'label'          => $configurableAtt->getLabel(),
                   'position'       => $attribute->getPosition(),
                   'values'         => $configurableAtt->getPrices() ? $configurable->getPrices() : array(),
                   'attribute_id'   => $attribute->getId(),
                   'attribute_code' => $attribute->getAttributeCode(),
                   'frontend_label' => $attribute->getFrontend()->getLabel(),
                );
            }
        }
    
        if(!empty($newAttributes)) {
    
            $configurable->setCanSaveConfigurableAttributes(true);
            $configurable->setConfigurableAttributesData($newAttributes);
        }
            $configurable->setConfigurableProductsData(array_flip($childProducts));
            $configurable->save();
    
  • 1

    @ aeno的解决方案对我不起作用,所以我对它进行了一些改进 . 已使用通过 Mage::getModel( 'catalog/product' )->load() 方法实例化的产品对此进行了测试 .

    private function _attachProductToConfigurable( $childProduct, $configurableProduct )
    {
        $childIds   = $configurableProduct->getTypeInstance()->getUsedProductIds();
        $childIds[] = $childProduct->getId();
        $childIds   = array_unique( $childIds );
    
        Mage::getResourceModel( 'catalog/product_type_configurable' )
            ->saveProducts( $configurableProduct, $childIds );
    }
    

相关问题