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?


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.


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.


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.


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

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;
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.