Mendapatkan produk sederhana dari yang dapat dikonfigurasi


11

Saya mencoba kode berikut untuk mendapatkan ID dari semua produk sederhana yang merupakan anak-anak $collection, yang saya tahu merupakan kumpulan produk yang dapat dikonfigurasi.

foreach($collection as $_product) {
    $_children = $_product->getTypeInstance()->getUsedProductIds($_product);
    print_r($_children);
}

Namun, semua array yang saya dapatkan kosong. Apakah saya melakukan sesuatu yang salah?


Apakah koleksi Anda memiliki sesuatu di dalamnya?
Aedonis

Ya, banyak produk
b_pcakes

1
Coba gunakan ini $_children = $_product->getTypeInstance()->getUsedProducts($_product);Lihat jika Anda mendapatkan sesuatu.
Aedonis

Saya sebenarnya sudah mencobanya, dan jugagetUsedProductCollection
b_pcakes

Jawaban:


23

Anda dapat mencetak id produk anak Anda (produk yang dapat dikonfigurasi) melalui membuat sedikit perubahan pada kode Anda sebagai berikut

foreach($collection as $_product) {
        $logger->info("Here are Parent Product Name".$_product->getName());
        $_children = $_product->getTypeInstance()->getUsedProducts($_product);
        foreach ($_children as $child){
            $logger->info("Here are your child Product Ids ".$child->getID());
        }
    }

Setelah ini lihat ke file log Anda dan Anda akan memiliki IDS anak Anda.


Untuk Magento 2.2.6 din tidak berfungsi, sebagai gantinya digunakan: $ product-> getTypeId ()
Alejandro Torres

17

Jawaban atas pertanyaan ini salah. Meskipun implementasinya mungkin berhasil, itu bukan cara yang tepat untuk menangani ini. Cara yang benar untuk melakukan ini adalah dengan menggunakan kontrak layanan dan model data Magentos.

Dalam hal ini, ini adalah Magento\ConfigurableProduct\Api\LinkManagementInterfacekontrak Layanan yang Anda butuhkan.

Contoh kecil kode yang saya gunakan dalam perintah konsol:

<?php

namespace Vendor\Module\Console;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\ConfigurableProduct\Api\LinkManagementInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\State;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Class UpdateChildProducts
 * @package Vendor\Module\Console
 */
class UpdateChildProducts extends Command
{
    /**
     * @var ProductRepositoryInterface
     */
    protected $productRepository;

    /**
     * @var SearchCriteriaBuilder
     */
    protected $searchCriteriaBuilder;

    /**
     * @var LinkManagementInterface
     */
    protected $linkManagement;

    /**
     * @var State
     */
    protected $state;

    /**
     * UpdateChildProducts constructor.
     * @param State $state
     * @param LinkManagementInterface $linkManagement
     * @param ProductRepositoryInterface $productRepository
     * @param SearchCriteriaBuilder $searchCriteriaBuilder
     * @param string $name
     */
    public function __construct(
        State $state,
        LinkManagementInterface $linkManagement,
        ProductRepositoryInterface $productRepository,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        $name = 'update_child_products'
    ) {
        $this->state = $state;
        $this->linkManagement = $linkManagement;
        $this->productRepository = $productRepository;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        parent::__construct($name);
    }

    /**
     * Configure this command
     */
    protected function configure()
    {
        $this->setName('example:update_child_products');
        $this->setDescription('Iterate over all configurable products and show their children count.');
    }

    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // Set area code
        try {
            $this->state->setAreaCode('adminhtml');
        } catch (\Exception $e) {
            // Fail silently ...
        }

        $searchCriteria = $this->searchCriteriaBuilder
            ->addFilter('type_id', 'configurable')
            ->create();

        $configurableProducts = $this->productRepository->getList($searchCriteria);
        $output->writeln(sprintf('Found %d configurable products ...', $configurableProducts->getTotalCount()));

        foreach ($configurableProducts->getItems() as $configurableProduct) {
            $childProducts = $this->linkManagement->getChildren($configurableProduct->getSku());
            $output->writeln(
                sprintf('Found %d children for %s', count($childProducts), $configurableProduct->getSku())
            );
        }
    }
}

Magento 2 tidak terlalu konsisten dengan kode itu sendiri karena sebagian besar kode porting dari Magento 1. Itu sebabnya Anda masih melihat sisa-sisa model berbasis warisan dan metode mereka (seperti getTypeInstance()). Jika Anda ingin membuat kode Magento 2 yang tahan di masa depan, gunakan kontrak layanan dan model data sebanyak mungkin.


ini tampaknya menjadi sangat lambat meskipun kecuali jika saya melakukan sesuatu yang salah ...
igrossiter

Perlu diselidiki tetapi tautanManajemen tampaknya tidak memuat semua bidang anak seperti "special_price" sehingga lebih baik untuk arsitektur tetapi tampaknya tidak terlalu berguna dalam beberapa kasus. $ _product-> getTypeInstance () -> getUsedProducts ($ _ product); bekerja dengan benar
Giuseppe Morelli

2

Anda bisa memanggil metode di bawah ini,

     foreach($collection as $_product) {
            $_configChild = $_product->getTypeInstance()->getUsedProductIds($_product);
            $getChildId = array();
            foreach ($_configChild as $child){
                $getChildId[] = $child;
            }
            echo "<pre>";print_r($getChildId);
        }

Di atas $getChildIdtampilkan semua id Produk sederhana.


1

Cara lain untuk mencapai ini adalah dengan menggunakan metode getChildrenIds.

$ children = $ cProductTypeInstance-> getChildrenIds ($ this-> currentProductObj-> getId ());

    // Get all the existing child and add it to associate Id too
    $existingChildrenIds = array();
    foreach ($children as $childIds) {
        foreach ($childIds as $child){
            $existingChildrenIds[] = $child;
        }
    }

0

Untuk mendapatkan objek produk anak yang sebenarnya (bukan hanya rangkaian ID mereka) gunakan ini:

$childProducts = $product->getTypeInstance()->getUsedProducts($product);

Untuk mendapatkan ID atau properti lainnya, gunakan yang di atas dengan lingkaran:

foreach ($childProducts as $childProduct) {
    echo $childProduct->getId();
}
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.