Obtenir des produits simples configurables

11

J'essaie le code suivant pour obtenir les ID de tous les produits simples qui sont des enfants $collection, dont je sais être une collection de produits configurables.

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

Cependant, tous les tableaux que je reçois sont vides. Est-ce que je fais quelque chose de mal?

b_pcakes
la source
Votre collection contient-elle quelque chose?
Aedonis
Oui, plusieurs produits
b_pcakes
1
Essayez d'utiliser ce $_children = $_product->getTypeInstance()->getUsedProducts($_product);Voir si vous obtenez quelque chose.
Aedonis
J'ai déjà essayé cela, ainsi quegetUsedProductCollection
b_pcakes

Réponses:

23

Vous pouvez imprimer vos identifiants de produits enfants (de produits configurables) en apportant une petite modification à votre code comme suit

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

Après cela, regardez vos fichiers journaux et vous aurez votre IDS enfant.


la source
Pour Magento 2.2.6, cela n'a pas fonctionné, mais utilisé à la place: $ product-> getTypeId ()
Alejandro Torres
17

Les réponses à cette question sont fausses. Bien que leurs implémentations puissent fonctionner, ce n'est pas la bonne façon de gérer cela. La bonne façon de procéder consiste à utiliser les contrats de service et les modèles de données de Magentos.

Dans ce cas, c'est le Magento\ConfigurableProduct\Api\LinkManagementInterfacecontrat de service dont vous avez besoin.

Un petit exemple de code que j'utilise dans une commande de console:

<?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 n'est pas très cohérent avec son propre code puisque la majorité du code est porté depuis Magento 1. C'est pourquoi vous voyez toujours des restes de modèles basés sur l'héritage et leurs méthodes (comme getTypeInstance()). Si vous souhaitez créer un code Magento 2 évolutif, utilisez autant que possible des contrats de service et des modèles de données.

Giel Berkers
la source
cela semble être horriblement plus lent, sauf si je fais quelque chose de mal ...
igrossiter
Besoin d'enquêter mais linkManagement ne semble pas charger tous les champs enfants comme "special_price", donc c'est mieux pour l'architecture mais ne semble pas très utile dans certains cas. $ _product-> getTypeInstance () -> getUsedProducts ($ _ product); fonctionne correctement
Giuseppe Morelli
2

Vous pouvez simplement appeler la méthode ci-dessous,

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

Ci-dessus, $getChildIdaffichez tout ID produit simple.

Rakesh Jesadiya
la source
1

Une autre façon d'y parvenir consiste à utiliser la méthode 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
la source
0

Pour obtenir les objets produits enfants réels (pas seulement les chaînes de leurs ID), utilisez ceci:

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

Pour obtenir leurs identifiants ou autres propriétés, utilisez ce qui précède avec une boucle:

foreach ($childProducts as $childProduct) {
    echo $childProduct->getId();
}
WackGet
la source