Erstellen Sie programmgesteuert ein konfigurierbares Produkt und weisen Sie das einfache Produkt dem konfigurierbaren Produkt in Magento2 zu

10

Das habe ich bisher gemacht. Die einfachen und konfigurierbaren Produkte werden erstellt. Das Problem ist, dass ich das einfache Produkt nicht dem konfigurierbaren Produkt zuordnen kann. Hier ist der Code (IDs und Attribute funktionieren mit Standard-Beispieldaten).

    //simple product
    $simple_product = $this->_objectManager->create('\Magento\Catalog\Model\Product');
    $simple_product->setSku('test-simple');
    $simple_product->setName('test name simple');
    $simple_product->setAttributeSetId(4);
    $simple_product->setSize_general(193); // value id of S size
    $simple_product->setStatus(1);
    $simple_product->setTypeId('simple');
    $simple_product->setPrice(10);
    $simple_product->setWebsiteIds(array(1));
    $simple_product->setCategoryIds(array(31));
    $simple_product->setStockData(array(
        'use_config_manage_stock' => 0, //'Use config settings' checkbox
        'manage_stock' => 1, //manage stock
        'min_sale_qty' => 1, //Minimum Qty Allowed in Shopping Cart
        'max_sale_qty' => 2, //Maximum Qty Allowed in Shopping Cart
        'is_in_stock' => 1, //Stock Availability
        'qty' => 100 //qty
        )
    );

    $simple_product->save();

    $simple_product_id = $simple_product->getId();
    echo "simple product id: ".$simple_product_id."\n";


    //configurable product
    $configurable_product = $this->_objectManager->create('\Magento\Catalog\Model\Product');
    $configurable_product->setSku('test-configurable');
    $configurable_product->setName('test name configurable');
    $configurable_product->setAttributeSetId(4);
    $configurable_product->setStatus(1);
    $configurable_product->setTypeId('configurable');
    $configurable_product->setPrice(11);
    $configurable_product->setWebsiteIds(array(1));
    $configurable_product->setCategoryIds(array(31));
    $configurable_product->setStockData(array(
        'use_config_manage_stock' => 0, //'Use config settings' checkbox
        'manage_stock' => 1, //manage stock
        'is_in_stock' => 1, //Stock Availability
        )
    );

    $configurable_product->getTypeInstance()->setUsedProductAttributeIds(array(152),$configurable_product); //attribute ID of attribute 'size_general' in my store
    $configurableAttributesData = $configurable_product->getTypeInstance()->getConfigurableAttributesAsArray($configurable_product);

    $configurable_product->setCanSaveConfigurableAttributes(true);
    $configurable_product->setConfigurableAttributesData($configurableAttributesData);

    $configurableProductsData = array();
    $configurableProductsData[$simple_product_id] = array( //[$simple_product_id] = id of a simple product associated with this configurable
        '0' => array(
            'label' => 'S', //attribute label
            'attribute_id' => '152', //attribute ID of attribute 'size_general' in my store
            'value_index' => '193', //value of 'S' index of the attribute 'size_general'
            'is_percent'    => 0,
            'pricing_value' => '10',
        )
    );
    $configurable_product->setConfigurableProductsData($configurableProductsData);

    $configurable_product->save();

    echo "configurable product id: ".$configurable_product->getId()."\n";
mmmgigi
quelle
Haben Sie eine endgültige Lösung dafür?
Praful Rajput
Was soll $ attributeSetId sein?
Abdo Aufgaben

Antworten:

7

Sie können den API-Funktionstest zum Erstellen eines konfigurierbaren Produkts überprüfen

Code sollte folgendermaßen aussehen:

$product = $productFactory->create(['name'=> 'configurable product', ... ]);
$configurableOption = $optionFactory->create([]);
$linkedProduct = $linkFactory->create([]);
$product->getExtensionAttributes()->setConfigurableProductOptions($configurableOption);
$product->getExtensionAttributes()->setConfigurableProductLinks($linkedProduct);
$productRepository->save($product)

Bitte beachten Sie, dass die API derzeit keine einfachen Produkte generiert , sondern im Voraus erstellt werden muss.

KAndy
quelle
2
Für zukünftige Zielgruppen: Dies (und das Beispiel, separate Antwort) ist der richtige Weg, dies zu tun. Es ist jedoch sehr wichtig, die letzte Zeile zu beachten. Sie müssen über das Produkt-Repository speichern. Wenn Sie $product->save()direkt anrufen, werden die konfigurierbaren Daten nicht gespeichert (wie in \Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave).
Ryan Hoerr
5

Ich habe ein Beispielskript erstellt. Alle direkten Verwendungen von ObjectManager sollten auf DI ersetzt werden

    $ob = ObjectManager::getInstance();

    /** @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepo */
    $attributeRepo =  $ob->get(\Magento\Catalog\Api\ProductAttributeRepositoryInterface::class);

    $attribute = $attributeRepo->get('color');  // color should be in default attribute set

    /** @var \Magento\Catalog\Api\ProductRepositoryInterface $pr */
    $pr = $ob->get(ProductRepositoryInterface::class);
    $ids = [];
    $values = [];
    foreach($attribute->getOptions() as $option) {
        $id = $option->getValue();
        /** @var \Magento\Catalog\Api\Data\ProductInterface $p */
        $p = $ob->get(\Magento\Catalog\Api\Data\ProductInterface::class);
        $p->setSku('simple-'. $id);
        $p->setName('Configurable Product option #'. $option->getLabel());
        $p->setPrice(10 + $id);
        $p->setTypeId('simple');
        $p->setCustomAttribute($attribute->getAttributeCode(), $id);
        $p = $pr->save($p);
        $ids[] = $p->getId();
        /** @var \Magento\ConfigurableProduct\Api\Data\OptionValueInterface $opVal */
        $opVal =  $ob->create(\Magento\ConfigurableProduct\Api\Data\OptionValueInterface::class);
        $opVal->setValueIndex($id);
        $values[] = $opVal;
    }
    /** @var \Magento\Catalog\Api\Data\ProductInterface $cp */
    $cp = $ob->get(\Magento\Catalog\Api\Data\ProductInterface::class);
    $cp->setSku('configurable');
    $cp->setName('Configurable product');


    /** @var \Magento\ConfigurableProduct\Api\Data\OptionInterface $option */
    $option = $ob->create(\Magento\ConfigurableProduct\Api\Data\OptionInterface::class);
    $option->setLabel('Product Color');
    $option->setAttributeId($attribute->getAttributeId());
    $option->setValues($values);

    $exteAttrs = $cp->getExtensionAttributes();
    $exteAttrs->setConfigurableProductLinks($ids);
    $exteAttrs->setConfigurableProductOptions([
        $option
    ]);

    $pr->save($cp);

Siehe https://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php als weiteres Beispiel

KAndy
quelle
Hallo Andy, danke für deine Lösung. Aber $ cp-> getExtensionAttributes () ist jedes Mal null, egal was ich tue und ändere. Zum Beispiel: "Schwerwiegender PHP-Fehler: Aufruf einer Mitgliedsfunktion setConfigurableProductOptions () auf null"
mmmgigi
Verwenden Sie Code wie $ productExtension = $ product-> getExtensionAttributes (); if ($ productExtension === null) {$ productExtension = $ this-> productExtensionFactory-> create (); }
KAndy
@ Kandy, bitte überprüfen Sie Ihre Antwort, es funktioniert nicht, weil Unvollständigkeit. du musst reparieren $option->setValues($values), aber vor allem hast du vergessen $cp->setExtensionAttributes($exteAttrs).
LucScu
Du hast recht. Vielleicht ist es besser, Code von test github.com/magento/magento2/blob/2.1/dev/tests/integration/… zu verwenden
KAndy
Nur ein Hinweis für Leute, die einfache Produkte erstellen möchten ... konfigurierbare Produkte sind Aggregationen einfacher Produkte, daher ist auch hier der Code für die einfache Produkterstellung enthalten!
Quickshiftin
1

Der folgende Code funktioniert gut für mich.

/* Associate simple product to configurable */
$associatedProductIds = array($simplProductId1,$simplProductId2,$simplProductId3,$simplProductId4);//Simple Product ids array
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($configProductId); // Load Configurable Product
$attributeModel = $objectManager->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute');
$position = 0;
$attributes = array($attributeColorId, $attributeSizeId); // Super Attribute Ids Used To Create Configurable Product(list of supper attribute ids what ever belong to that the attribute set under which the configurable product is)
foreach ($attributes as $attributeId) {
    $data = array('attribute_id' => $attributeId, 'product_id' => $configProductId, 'position' => $position);
    $position++;
    $attributeModel->setData($data);//->save();
}
$product->setTypeId("configurable");
$product->setAffectConfigurableProductAttributes($attributeSetId);
$objectManager->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable')->setUsedProductAttributeIds($attributes, $product);
$product->setNewVariationsAttributeSetId($attributeSetId);
$product->setAssociatedProductIds($associatedProductIds);// Setting Associated Products
$product->setCanSaveConfigurableAttributes(true);
$product->save();
Ipsita Rout
quelle
Es funktioniert nicht. Geben Sie mir Fehler, dass Option nicht definiert sind
Asish Hira
Geben Sie mir den gleichen Fehler, dass die Option nicht definiert ist - @Asish haben Sie dieses Problem gelöst
Nidhi
@ Asish & Nidhi: Ja, es hat gut funktioniert für mich und ofcz u hv, die Optionen zu deklarieren
Ipsita Rout
@Nidhi nein das kann ich nicht lösen.
Asish Hira
@IpsitaRout können Sie den Code hinzufügen, mit dem wir Optionen deklarieren können?
Asish Hira