Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ProductIdLocator.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Catalog\Model;
8 
13 {
19  private $idsLimit;
20 
26  private $metadataPool;
27 
31  private $collectionFactory;
32 
38  private $idsBySku = [];
39 
45  public function __construct(
46  \Magento\Framework\EntityManager\MetadataPool $metadataPool,
47  \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory,
48  $idsLimit
49  ) {
50  $this->metadataPool = $metadataPool;
51  $this->collectionFactory = $collectionFactory;
52  $this->idsLimit = (int)$idsLimit;
53  }
54 
58  public function retrieveProductIdsBySkus(array $skus)
59  {
60  $neededSkus = [];
61  foreach ($skus as $sku) {
62  $unifiedSku = strtolower(trim($sku));
63  if (!isset($this->idsBySku[$unifiedSku])) {
64  $neededSkus[] = $sku;
65  }
66  }
67 
68  if (!empty($neededSkus)) {
70  $collection = $this->collectionFactory->create();
71  $collection->addFieldToFilter(\Magento\Catalog\Api\Data\ProductInterface::SKU, ['in' => $neededSkus]);
72  $linkField = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class)
73  ->getLinkField();
74 
75  foreach ($collection as $item) {
76  $this->idsBySku[strtolower(trim($item->getSku()))][$item->getData($linkField)] = $item->getTypeId();
77  }
78  }
79 
80  $productIds = [];
81  foreach ($skus as $sku) {
82  $unifiedSku = strtolower(trim($sku));
83  if (isset($this->idsBySku[$unifiedSku])) {
84  $productIds[$sku] = $this->idsBySku[$unifiedSku];
85  }
86  }
87  $this->truncateToLimit();
88  return $productIds;
89  }
90 
96  private function truncateToLimit()
97  {
98  if (count($this->idsBySku) > $this->idsLimit) {
99  $this->idsBySku = array_slice($this->idsBySku, round($this->idsLimit / -2));
100  }
101  }
102 }
__construct(\Magento\Framework\EntityManager\MetadataPool $metadataPool, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory, $idsLimit)
foreach($websiteCodes as $websiteCode) $skus