สร้างผลิตภัณฑ์ที่สามารถกำหนดค่าได้โดยทางโปรแกรมและกำหนดผลิตภัณฑ์อย่างง่ายให้กับผลิตภัณฑ์ที่สามารถกำหนดค่าได้ในผลิตภัณฑ์ Magento2


10

นี่คือสิ่งที่ฉันทำไปแล้ว ผลิตภัณฑ์ที่เรียบง่ายและกำหนดค่าได้ถูกสร้างขึ้น ปัญหาคือฉันไม่สามารถกำหนดผลิตภัณฑ์อย่างง่ายให้กับผลิตภัณฑ์ที่กำหนดค่าได้ นี่คือรหัส (รหัสและคุณลักษณะที่ทำงานกับข้อมูลตัวอย่างเริ่มต้น)

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

คุณมีคำตอบสุดท้ายหรือไม่?
Rajput น่ายกย่อง

$ attributeSetId ควรเป็นอย่างไร
Abdo Tasks

คำตอบ:


7

คุณสามารถตรวจสอบการทดสอบการทำงานของ API เพื่อสร้างผลิตภัณฑ์ที่กำหนดค่าได้

รหัสควรมีลักษณะดังนี้:

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

โปรดทราบว่าในปัจจุบัน API ไม่ได้สร้างผลิตภัณฑ์ที่เรียบง่าย แต่จะต้องสร้างล่วงหน้า


2
สำหรับผู้ชมในอนาคต: (และตัวอย่างคำตอบแยกต่างหาก) นี้เป็นวิธีที่ถูกต้องในการทำ แต่มันสำคัญมากที่ต้องจดบันทึกบรรทัดสุดท้าย คุณต้องบันทึกผ่านที่เก็บผลิตภัณฑ์ การโทร$product->save()โดยตรงจะไม่เรียกข้อมูลที่กำหนดค่าได้ให้บันทึก (เท่าที่พบใน\Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave)
Ryan Hoerr

5

ฉันสร้างสคริปต์ตัวอย่าง การใช้งานโดยตรงของ ObjectManager ควรถูกแทนที่ใน 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);

ดูhttps://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.phpเป็นตัวอย่างอื่น ๆ


สวัสดีแอนดี้ขอบคุณสำหรับวิธีการแก้ปัญหาของคุณ แต่ $ cp-> getExtensionAttributes () เป็นโมฆะทุกครั้งไม่ว่าฉันจะเปลี่ยนแปลงอะไร ตัวอย่างเช่น: "ข้อผิดพลาดร้ายแรงของ PHP: การเรียกไปยังฟังก์ชันสมาชิก setConfigurableProductOptions () บนค่า null"
mmmgigi

ใช้รหัสเช่น $ productExtension = $ product-> getExtensionAttributes (); if ($ productExtension === null) {$ productExtension = $ this-> productExtensionFactory-> create (); }
KAndy

@ แคนดี้โปรดอ่านคำตอบของคุณมันใช้งานไม่ได้เพราะความไม่สมบูรณ์ คุณมีการแก้ไขโดยเฉพาะอย่างยิ่งคุณลืม$option->setValues($values) $cp->setExtensionAttributes($exteAttrs)
LucScu

คุณพูดถูก อาจดีกว่าที่จะใช้รหัสจากการทดสอบgithub.com/magento/magento2/blob/2.1/dev/tests/integration/?hl=th
KAndy

เพียงแค่คำแนะนำสำหรับผู้ที่ต้องการสร้างผลิตภัณฑ์ที่เรียบง่าย ... ผลิตภัณฑ์ที่กำหนดค่าได้คือการรวมตัวของผลิตภัณฑ์ง่ายๆดังนั้นรหัสการสร้างผลิตภัณฑ์ที่ง่ายก็อยู่ที่นี่ด้วย!
quickshiftin

1

รหัสด้านล่างใช้งานได้ดีสำหรับฉัน

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

มันไม่ทำงาน ให้ข้อผิดพลาดกับฉันว่าไม่ได้กำหนดตัวเลือก
Asish Hira

ให้ฉันข้อผิดพลาดเดียวกันว่าตัวเลือกไม่ได้กำหนดไว้ - @Asish มีคุณแก้ปัญหานี้
Nidhi

@ Asish & Nidhi: ใช่มันทำงานได้ดีสำหรับฉันและ ofcz u hv เพื่อประกาศตัวเลือก
Ipsita Rout

@Nidhi ไม่ฉันไม่สามารถแก้ไขได้
Asish Hira

@IpsitaRout คุณสามารถเพิ่มรหัสที่เราสามารถประกาศตัวเลือกได้หรือไม่
Asish Hira
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.