Jawaban atas pertanyaan ini salah. Meskipun implementasinya mungkin berhasil, itu bukan cara yang tepat untuk menangani ini. Cara yang benar untuk melakukan ini adalah dengan menggunakan kontrak layanan dan model data Magentos.
Dalam hal ini, ini adalah Magento\ConfigurableProduct\Api\LinkManagementInterface
kontrak Layanan yang Anda butuhkan.
Contoh kecil kode yang saya gunakan dalam perintah konsol:
<?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 tidak terlalu konsisten dengan kode itu sendiri karena sebagian besar kode porting dari Magento 1. Itu sebabnya Anda masih melihat sisa-sisa model berbasis warisan dan metode mereka (seperti getTypeInstance()
). Jika Anda ingin membuat kode Magento 2 yang tahan di masa depan, gunakan kontrak layanan dan model data sebanyak mungkin.