Programlı olarak yapılandırılabilir bir ürün oluşturun ve basit ürünü Magento2 ürünündeki yapılandırılabilir ürüne atayın


10

Şimdiye kadar yaptığım şey bu. Basit ve yapılandırılabilir ürünler oluşturulur. Sorun, basit ürünü yapılandırılabilir ürüne atayamam. İşte kod (ids ve öznitelikler varsayılan örnek verilerle çalışır).

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

Bunun için nihai çözümünüz var mı?
Praful Rajput

$ AttributeSetId ne olmalı?
Abdo Görevleri

Yanıtlar:


7

Yapılandırılabilir ürün oluşturmak için API fonksiyonel testini inceleyebilirsiniz

Kod şöyle görünmelidir:

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

API'nın şu anda basit ürünler üretmediğini , önceden oluşturulmaları gerektiğini lütfen unutmayın .


2
Gelecekteki kitleler için: Bu (ve örnek, ayrı cevap) bunu yapmanın doğru yoludur. Ancak son satırı not etmek çok önemlidir. Sen gerekir ürün depo yoluyla kaydedin. $product->save()Doğrudan aramak , yapılandırılacak verileri kaydetmek için tetiklemez (içinde bulunduğu gibi \Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave).
Ryan Hoerr

5

Örnek senaryo oluşturdum. ObjectManager'ın tüm doğrudan kullanımları DI üzerinde değiştirilmelidir.

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

diğer örnek olarak https://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php adresine bakın


Merhaba Andy, çözümün için teşekkürler. Ancak $ cp-> getExtensionAttributes (), ne yaptığımdan ve değiştirmemden bağımsız olarak her zaman boştur. Örneğin: "PHP Önemli hata: null üzerinde setConfigurableProductOptions () üye işlevini çağırın"
mmmgigi

$ productExtension = $ product-> getExtensionAttributes () gibi bir kod kullanın; if ($ productExtension === null) {$ productExtension = $ this-> productExtensionFactory-> create (); }
KAndy

@Kandy, lütfen cevabınızı gözden geçirin, işe yaramaz çünkü eksiklik. düzeltmek zorundasın $option->setValues($values), ama özellikle unuttun $cp->setExtensionAttributes($exteAttrs).
LucScu


Basit ürünler oluşturmak isteyen insanlar için sadece bir ipucu ... yapılandırılabilir ürünler basit ürünlerin bir araya getirilmesidir, bu nedenle basit ürün oluşturma kodu da buradadır!
quickshiftin

1

Aşağıdaki kod benim için iyi çalışıyor.

/* 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();

Çalışmıyor. Bana bu seçenek tanımlanmadı hata
veriyor

Bana bu seçenek tanımlanmadı aynı hatayı vermek - @Asish bu sorunu çözdün mü
Nidhi

@Asish & Nidhi: evet seçenekleri bildirmek benim ve ofcz u hv için iyi çalıştı
Ipsita Rout

@Nidhi hayır Bunu çözemiyorum.
Asish Hira

@IpsitaRout seçenekleri bildirebileceğimiz kodu ekleyebilir misiniz?
Asish Hira
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.