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\LinkManagementInterface
Servicevertrag, 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.