Secara terprogram membuat produk yang dapat dikonfigurasi dan menetapkan produk sederhana ke produk yang dapat dikonfigurasi dalam produk Magento2


10

Inilah yang telah saya lakukan sejauh ini. Produk sederhana dan dapat dikonfigurasi dibuat. Masalahnya adalah saya tidak dapat menetapkan produk sederhana untuk produk yang dapat dikonfigurasi. Berikut adalah kode (id dan atribut berfungsi dengan data sampel default).

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

Apakah Anda punya solusi final untuk itu?
Praful Rajput

Apa yang seharusnya $ attributeSetId?
Abdo Tasks

Jawaban:


7

Anda dapat meninjau uji fungsional API untuk membuat produk yang dapat dikonfigurasi

Kode akan terlihat seperti:

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

Harap perhatikan bahwa API saat ini tidak menghasilkan produk sederhana, mereka harus dibuat terlebih dahulu.


2
Untuk pemirsa di masa mendatang: Ini (dan contohnya, jawaban terpisah) adalah cara yang tepat untuk melakukannya. Tetapi sangat penting untuk mencatat baris terakhir. Anda harus menyimpan melalui gudang produk. Memanggil $product->save()secara langsung tidak akan memicu data yang dapat dikonfigurasi untuk disimpan (seperti yang ditemukan di \Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave).
Ryan Hoerr

5

Saya membuat contoh skrip. Semua penggunaan langsung ObjectManager harus diganti pada 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);

lihat https://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php sebagai contoh lain


Hai Andy, terima kasih atas solusinya. Tetapi $ cp-> getExtensionAttributes () adalah null setiap kali, apa pun yang saya lakukan & ubah. Misalnya: "Kesalahan fatal PHP: Panggil ke fungsi anggota setConfigurableProductOptions () on null"
mmmgigi

gunakan kode seperti $ productExtension = $ product-> getExtensionAttributes (); if ($ productExtension === null) {$ productExtension = $ this-> productExtensionFactory-> create (); }
KAndy

@Kandy, harap tinjau jawaban Anda, itu tidak berfungsi karena tidak lengkap. Anda harus memperbaikinya $option->setValues($values), tetapi terutama Anda lupa $cp->setExtensionAttributes($exteAttrs).
LucScu

Anda benar. Mungkin lebih baik menggunakan kode dari test github.com/magento/magento2/blob/2.1/dev/tests/integration/…
KAndy

Sekedar petunjuk bagi orang yang ingin membuat produk sederhana ... produk yang dapat dikonfigurasi adalah kumpulan dari produk sederhana, jadi kode kreasi produk yang sederhana juga ada di sini!
quickshiftin

1

Kode di bawah ini berfungsi dengan baik untuk saya.

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

Itu tidak bekerja. Memberi saya kesalahan bahwa opsi tidak didefinisikan
Asish Hira

Memberi saya kesalahan yang sama bahwa opsi tidak didefinisikan - @ Asish apakah Anda telah memecahkan masalah ini
Nidhi

@ Asish & Nidhi: ya itu bekerja dengan baik untuk saya dan ofcz u hv untuk menyatakan opsi
Ipsita Rout

@Nidhi tidak, saya tidak bisa menyelesaikannya.
Asish Hira

@IpsitaRout dapatkah Anda menambahkan kode yang dengannya kami dapat mendeklarasikan opsi?
Asish Hira
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.