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?

b_pcakes
sumber
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.


sumber
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.

Giel Berkers
sumber
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.

Rakesh Jesadiya
sumber
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;
        }
    }
Tatenda Chuma
sumber
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();
}
WackGet
sumber