Magento API: Zuweisen von bereits existierenden einfachen Produkten zu konfigurierbaren Produkten

StackOverflow https://stackoverflow.com/questions/896089

Andere Tipps

Der Code von der akzeptierten Antwort von Scimon nicht mehr in der aktuellen Versionen von Magento funktioniert (zumindest in 1.7). Aber zum Glück, man muss nur ein kleines Update, um es wieder zu arbeiten:

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

Ich arbeite dieses Recht jetzt tun.

Bisher habe ich diese Artikel hilfreich als Referenzen gefunden:

Ich werde meinen Code veröffentlichen, so weit, und hoffentlich aktualisieren, sobald es funktioniert ..

// 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";

Okay, das verwendet ‚item_size‘ als Attribut, das die „einfache“ Produkte unterscheidet. Auch dies setzt voraus, dass die „konfigurierbare“ parent SKU ist die Wurzel des Kindes SKU. Zum Beispiel ABC001 ist die Mutter während ABC001-SMALL und ABC001-LARGE der einfachen Kinder sind.

Hoffnung, dass jemand hilft.

ich dies ist eine un-Vermutung, aber ich denke, was für Ihre fragen kann nicht mit der bestehenden API erfolgen. Sie müssen Ihre eigenen schreiben oder gerade direkt an die DB.

Hier ist der Hack-y Art und Weise, dass ich dies mit PHP gerade tat. Es gibt drei verknüpften Tabellen. Ich war mit Farbe und Größe wie meine Attribute. Meine Eltern Produkte (konfigurierbar) nicht tatsächlich in meinem Katalog vorhanden sind. Sie sind im Wesentlichen Modellebene und dann die Produkte sind die SKU-Ebene. So LIKE '% parentproductsku' arbeitet für die Kinder.

$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" . "<br />";

    //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" . "<br />";

        //"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

Überraschenderweise dies funktioniert, wenn alle Ihre einfache Produkte teilen sich den gleichen Preis:

        $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();

@ AENO-Lösung nicht für mich arbeiten, so verfeinert ich es ein wenig. Dies wurde getestet Benutzung eines Produktes über die Mage::getModel( 'catalog/product' )->load() Methode instanziiert.

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 );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top