Magento API: تعيين منتجات بسيطة مسبقة الأعميدية للمنتجات القابلة للتكوين

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

سؤال

لدي قاعدة بيانات عميل مع مجموعة كبيرة من عناصر الأسهم، والتي يتم تحميلها إلى Magento كمنتجات بسيطة.

الآن أحتاج إلى تجميعها وتعيينها للمنتجات القابلة للتكوين بحجمها وكونها سماتها القابلة للتكوين.

يحتوي Magento API على فئة Product_Link، مع طريقة مظهر واعدة: Catalog-Product-link.assign (حلقة الوصل)، لكنني لا أستطيع أن أحضرني الحجج التي أحتاج إليها في العمل مع المنتجات القابلة للتكوين، وتوفير هذه هي الطريقة التي تهدف إلى استخدامها.

هل كانت مفيدة؟

المحلول

حسنا، ساعدتني الملاحظات هنا في الحصول على هذا الجري. اعتقدت أنني كنت أشاطركم رمز لإضافة منتج بسيط إلى منتج قابل للتكوين.

يفترض هذا الرمز المنتج البسيط هو واحد صالح للإضافة، لست متأكدا مما يحدث إذا لم يكن كذلك.

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

نصائح أخرى

لا يعمل الرمز من الإجابة المقبولة بواسطة 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 ) );                
}

أنا أعمل على القيام بذلك الآن.

لقد وجدت حتى الآن هذه العناصر مفيدة كمراجع:

سأقوم بنشر الرمز الخاص بي حتى الآن، ونأمل تحديثه بمجرد أن يعمل ..

// 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 - صغير و ABC001 - كبير الأطفال البسيطين.

نأمل أن يساعد شخص ما.

أنا هذا هو تخمين غير تعليمي، لكنني أعتقد أن السؤال الخاص بك لا يمكن القيام به مع API الموجودة. سوف تضطر إلى كتابة خاصة بك أو فقط حصلت مباشرة على DB.

هنا هي الطريقة التي فعلتها هذا مباشرة مع PHP. هناك ثلاثة جداول ذات صلة. كنت أستخدم اللون والحجم كسماتي. منتجاتي الأصل (شكلي) غير موجودة بالفعل في كتالوجي. إنها مستوى نموذجي في الأساس ثم المنتجات هي مستوى SKU. مثل "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" . "<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

من المستغرب أن هذا يعمل، إذا كانت جميع منتجاتك البسيطة تشترك في نفس السعر:

        $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 لم يعمل بالنسبة لي، لذلك قمت بتنقيح ذلك قليلا. تم اختبار هذا باستخدام إنشاء منتج عبر 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 );
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top