Créez par programme un produit configurable et affectez le produit simple à un produit configurable dans le produit Magento2

10

C'est ce que j'ai fait jusqu'à présent. Les produits simples et configurables sont créés. Le problème est que je ne peux pas affecter le produit simple à un produit configurable. Voici le code (les identifiants et les attributs fonctionnent avec des exemples de données par défaut).

    //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
la source
Avez-vous une solution finale pour cela?
Praful Rajput
Que devrait être $ attributeSetId?
Abdo Tasks

Réponses:

7

Vous pouvez consulter le test fonctionnel de l'API pour créer un produit configurable

Le code devrait ressembler à:

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

Veuillez noter que l'API ne génère actuellement pas de produits simples, ils doivent être créés à l'avance.

KAndy
la source
2
Pour les futurs publics: Ceci (et l'exemple, une réponse séparée) est la bonne façon de le faire. Mais il est très important de noter la dernière ligne. Vous devez enregistrer via le référentiel de produits. Appeler $product->save()directement ne déclenchera pas les données configurables à enregistrer (comme dans \Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave).
Ryan Hoerr
5

J'ai créé un exemple de script. Toutes les utilisations directes d'ObjectManager doivent être remplacées sur DI

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

voir https://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php comme autre exemple

KAndy
la source
Salut Andy, merci pour votre solution. Mais $ cp-> getExtensionAttributes () est null à chaque fois, quoi que je fasse et change. Par exemple: "Erreur fatale PHP: appel à une fonction membre setConfigurableProductOptions () on null"
mmmgigi
utilisez du code comme $ productExtension = $ product-> getExtensionAttributes (); if ($ productExtension === null) {$ productExtension = $ this-> productExtensionFactory-> create (); }
KAndy
@Kandy, veuillez réviser votre réponse, cela ne fonctionne pas car il est incomplet. vous devez réparer $option->setValues($values), mais surtout vous avez oublié $cp->setExtensionAttributes($exteAttrs).
LucScu
Tu as raison. Peut-être préférable d'utiliser le code de test github.com/magento/magento2/blob/2.1/dev/tests/integration/…
KAndy
Juste un conseil pour les gens qui veulent créer des produits simples ... les produits configurables sont des agrégations de produits simples, donc le code de création de produit simple est là aussi!
quickshiftin
1

Le code ci-dessous fonctionne bien pour moi.

/* 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
la source
Ça ne marche pas. Me donnant l'erreur que cette option n'est pas définie
Asish Hira
Me donnant la même erreur que l'option n'est pas définie - @Asish avez-vous résolu ce problème
Nidhi
@Asish & Nidhi: oui, cela a bien fonctionné pour moi et ofcz u hv pour déclarer les options
Ipsita Rout
@Nidhi non, je ne suis pas en mesure de résoudre ce problème.
Asish Hira
@IpsitaRout pouvez-vous ajouter le code par lequel nous pouvons déclarer des options?
Asish Hira, du