Einfache Produkte konfigurierbar machen

11

Ich versuche den folgenden Code, um die IDs aller einfachen Produkte zu erhalten, deren Kinder $collectionuntergeordnet sind. Ich weiß, dass es sich um eine Sammlung konfigurierbarer Produkte handelt.

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

Alle Arrays, die ich bekomme, sind jedoch leer. Mache ich etwas falsch?

b_pcakes
quelle
Enthält Ihre Sammlung etwas?
Aedonis
Ja, mehrere Produkte
b_pcakes
1
Versuchen Sie es mit dieser $_children = $_product->getTypeInstance()->getUsedProducts($_product);Option. Sehen Sie, ob Sie etwas bekommen.
Aedonis
Ich habe das eigentlich schon versucht, sowiegetUsedProductCollection
b_pcakes

Antworten:

23

Sie können die IDs Ihrer untergeordneten Produkte (konfigurierbarer Produkte) drucken, indem Sie wie folgt eine kleine Änderung an Ihrem Code vornehmen

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());
        }
    }

Schauen Sie sich danach Ihre Protokolldateien an und Sie haben Ihr Kind IDS.


quelle
Für Magento 2.2.6 nicht funktioniert, stattdessen verwendet: $ product-> getTypeId ()
Alejandro Torres
17

Die Antworten auf diese Frage sind falsch. Obwohl ihre Implementierungen möglicherweise funktionieren, ist dies nicht der richtige Weg, um damit umzugehen. Der richtige Weg, dies zu tun, ist die Verwendung der Serviceverträge und Datenmodelle von Magentos.

In diesem Fall ist es der Magento\ConfigurableProduct\Api\LinkManagementInterfaceServicevertrag, den Sie benötigen.

Ein kleines Beispiel für Code, den ich in einem Konsolenbefehl verwende:

<?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 ist nicht sehr konsistent mit seinem eigenen Code, da der Großteil des Codes von Magento 1 portiert wird. Deshalb sehen Sie immer noch Reste von vererbungsbasierten Modellen und deren Methoden (wie getTypeInstance()). Wenn Sie zukunftssicheren Magento 2-Code erstellen möchten, verwenden Sie so oft wie möglich Serviceverträge und Datenmodelle.

Giel Berkers
quelle
Dies scheint schrecklich langsamer zu sein, es sei denn, ich mache etwas falsch ...
Igrossiter
Sie müssen nachforschen, aber linkManagement scheint nicht alle untergeordneten Felder wie "special_price" zu laden. Dies ist besser für die Architektur, scheint aber in einigen Fällen nicht sehr nützlich zu sein. $ _product-> getTypeInstance () -> getUsedProducts ($ _ product); funktioniert richtig
Giuseppe Morelli
2

Sie können einfach die folgende Methode aufrufen:

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

Oben werden $getChildIdalle einfachen Produkt-IDs angezeigt.

Rakesh Jesadiya
quelle
0

Verwenden Sie Folgendes, um die tatsächlichen untergeordneten Produktobjekte (nicht nur Zeichenfolgen ihrer IDs) abzurufen:

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

Verwenden Sie die obigen Anweisungen mit einer Schleife, um ihre IDs oder andere Eigenschaften abzurufen:

foreach ($childProducts as $childProduct) {
    echo $childProduct->getId();
}
WackGet
quelle
0

Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung der Methode 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
quelle