Lập trình tạo một sản phẩm có thể định cấu hình và gán sản phẩm đơn giản cho sản phẩm có thể định cấu hình trong sản phẩm Magento2


10

Đây là những gì tôi đã làm cho đến nay. Các sản phẩm đơn giản và cấu hình được tạo ra. Vấn đề là tôi không thể gán sản phẩm đơn giản cho sản phẩm có thể cấu hình. Đây là mã (id và thuộc tính hoạt động với dữ liệu mẫu mặc định).

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

Bạn đã có giải pháp cuối cùng cho nó?
Rajput đáng khen ngợi

$ Thuộc tính nên là gì?
Nhiệm vụ Abdo

Câu trả lời:


7

Bạn có thể xem lại bài kiểm tra chức năng API để tạo sản phẩm có thể định cấu hình

Mã sẽ giống như:

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

Xin lưu ý rằng API hiện không tạo ra các sản phẩm đơn giản, chúng cần được tạo trước.


2
Đối với khán giả trong tương lai: Điều này (và ví dụ, câu trả lời riêng biệt) là cách chính xác để làm điều đó. Nhưng nó rất quan trọng để lưu ý dòng cuối cùng. Bạn phải lưu thông qua kho sản phẩm. Gọi $product->save()trực tiếp sẽ không kích hoạt dữ liệu có thể cấu hình để lưu (như được tìm thấy trong \Magento\ConfigurableProduct\Model\Plugin\AroundProductRepositorySave).
Ryan Hoerr

5

Tôi đã tạo ra kịch bản ví dụ. Tất cả các cách sử dụng trực tiếp của ObjectManager nên được thay thế trên 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);

xem https://github.com/magento/magento2/blob/2.1/dev/tests/integration/testsuite/Magento/ConfigurableSản phẩm / ffiles / products_configurable.php như một ví dụ khác


Xin chào Andy, cảm ơn giải pháp của bạn. Nhưng $ cp-> getExtensionAttribut () là null mọi lúc, bất kể tôi làm gì và thay đổi. Ví dụ: "Lỗi nghiêm trọng của PHP: Gọi tới hàm thành viên setConfigurable ProducttOptions () trên null"
mmmgigi

sử dụng mã như $ productExtension = $ sản phẩm-> getExtensionAttribut (); if ($ sản phẩmExtension === null) {$ sản phẩmExtension = $ this-> sản phẩmExtensionFactory-> tạo (); }
KAndy

@Kandy, vui lòng xem lại câu trả lời của bạn, nó không hoạt động vì không đầy đủ. bạn phải sửa $option->setValues($values), nhưng đặc biệt là bạn quên $cp->setExtensionAttributes($exteAttrs).
LucScu

Bạn đúng. Có thể tốt hơn để sử dụng mã từ thử nghiệm github.com/magento/magento2/blob/2.1/dev/tests/integration/
Kẻ

Chỉ là một gợi ý cho những người muốn tạo ra các sản phẩm đơn giản ... các sản phẩm có thể định cấu hình là tập hợp của các sản phẩm đơn giản, vì vậy mã tạo sản phẩm đơn giản cũng có ở đây!
quickshiftin

1

Các mã dưới đây hoạt động tốt cho tôi.

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

Nó không hoạt động. Cho tôi lỗi mà tùy chọn không được xác định
Asish Hira

Cho tôi cùng một lỗi mà tùy chọn không được xác định - @Asish bạn đã giải quyết vấn đề này
Nidhi

@Asish & Nidhi: vâng, nó hoạt động tốt với tôi và ofcz u hv để khai báo các tùy chọn
Routita Rout

@Nidhi không tôi không thể giải quyết điều đó.
Asish Hira

@IpsitaRout bạn có thể thêm mã để chúng tôi có thể khai báo các tùy chọn không?
Asish Hira
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.