从可配置中获取简单的产品


11

我正在尝试以下代码来获取属于的子级的所有简单产品的ID $collection,我知道它们是可配置产品的集合。

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

但是,我得到的所有数组都是空的。难道我做错了什么?


您的收藏中有东西吗?
Aedonis's

是的,多种产品
b_pcakes

1
尝试使用此功能$_children = $_product->getTypeInstance()->getUsedProducts($_product);看是否有任何东西。
Aedonis

我实际上已经尝试过了,以及getUsedProductCollection
b_pcakes

Answers:


23

您可以通过对代码进行如下小的更改来打印(可配置产品的)子产品ID。

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

之后,查看您的日志文件,您将获得孩子的IDS。


对于Magento 2.2.6,它不能正常工作,而是使用:$ product-> getTypeId()
Alejandro Torres,

17

这个问题的答案是错误的。尽管它们的实现可能有效,但这不是处理此问题的正确方法。正确的方法是使用Magentos的服务合同和数据模型。

在这种情况下,这就是Magento\ConfigurableProduct\Api\LinkManagementInterface您需要的服务合同。

我在控制台命令中使用的一个小代码示例:

<?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与自己的代码不太一致,因为大多数代码是从Magento 1移植的。这就是为什么您仍然看到基于继承的模型及其方法(如getTypeInstance())的剩余部分的原因。如果要构建面向未来的Magento 2代码,请尽可能使用服务合同和数据模型。


除非我做错了,否则这似乎要慢得多……
igrossiter

需要调查,但是linkManagement似乎并没有加载“ special_price”之类的所有子字段,因此对于体系结构而言更好,但在某些情况下似乎不太有用。$ _product-> getTypeInstance()-> getUsedProducts($ _ product); 正常工作
朱塞佩·莫雷利

2

您可以调用以下方法,

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

上方$getChildId显示所有简单的产品ID。


1

实现此目的的另一种方法是使用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

要获取实际的子产品对象(不仅是其ID的字符串),请使用以下命令:

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

要获取其ID或其他属性,请将以上内容与循环一起使用:

foreach ($childProducts as $childProduct) {
    echo $childProduct->getId();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.