Lấy sản phẩm đơn giản từ cấu hình


11

Tôi đang thử đoạn mã sau để lấy ID của tất cả các sản phẩm đơn giản là con của chúng $collection, mà tôi biết là một bộ sưu tập các sản phẩm có thể định cấu hình.

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

Tuy nhiên, tất cả các mảng tôi nhận được đều trống. Tôi có làm điều gì sai?


Bộ sưu tập của bạn có một cái gì đó trong đó?
Aedonis

Có, nhiều sản phẩm
b_pcakes

1
Hãy thử sử dụng cái này $_children = $_product->getTypeInstance()->getUsedProducts($_product);Xem nếu bạn đang nhận được bất cứ điều gì.
Aedonis

Tôi thực sự đã thử nó, cũng nhưgetUsedProductCollection
b_pcakes

Câu trả lời:


23

Bạn có thể in id sản phẩm con của bạn (của các sản phẩm có thể định cấu hình) bằng cách thực hiện một thay đổi nhỏ cho mã của bạn như sau

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

Sau khi xem các tệp nhật ký của bạn và bạn sẽ có IDS con của bạn.


Đối với Magento 2.2.6 không hoạt động, thay vào đó được sử dụng: $ sản phẩm-> getTypeId ()
Alejandro Torres

17

Các câu trả lời cho câu hỏi này là sai. Mặc dù việc triển khai của họ có thể hoạt động, nhưng đó không phải là cách thích hợp để xử lý việc này. Cách chính xác để thực hiện việc này là sử dụng các mô hình dữ liệu và hợp đồng dịch vụ của Magentos.

Trong trường hợp này, đó là Magento\ConfigurableProduct\Api\LinkManagementInterfacehợp đồng dịch vụ bạn cần.

Một ví dụ nhỏ về mã tôi đang sử dụng trong lệnh 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 không phù hợp với mã riêng của nó vì phần lớn mã được chuyển từ Magento 1. Đó là lý do tại sao bạn vẫn thấy phần còn lại của các mô hình dựa trên thừa kế và phương thức của chúng (như getTypeInstance()). Nếu bạn muốn xây dựng mã Magento 2 bằng chứng trong tương lai, hãy sử dụng các hợp đồng dịch vụ và mô hình dữ liệu càng nhiều càng tốt.


điều này dường như chậm hơn khủng khiếp trừ khi tôi làm sai điều gì đó ...
igrossiter

Cần điều tra nhưng linkQuản lý dường như không tải tất cả các trường con như "Special_price" vì vậy tốt hơn cho kiến ​​trúc nhưng dường như không hữu ích lắm trong một số trường hợp. $ _product-> getTypeInstance () -> getUsed Products ($ _ sản phẩm); hoạt động chính xác
Giuseppe Morelli

2

Bạn chỉ có thể gọi phương thức dưới đây,

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

Trên $getChildIdhiển thị tất cả id sản phẩm đơn giản.


0

Để có được các đối tượng sản phẩm con thực tế (không chỉ các chuỗi ID của chúng), hãy sử dụng:

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

Để lấy ID của họ hoặc các thuộc tính khác, hãy sử dụng ở trên với một vòng lặp:

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

0

Một cách khác để đạt được điều này là sử dụng phương thức getChildrenIds.

$ children = $ c SẢNtTypeInstance-> getChildrenIds ($ this-> current SẢNtObj-> 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;
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.