11 use Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory;
26 private $skuProcessor;
31 private $metadataPool;
43 private $resourceFactory;
48 private $resourceModel;
53 private $errorAggregator;
58 private $productEntityLinkField;
63 private $mediaGalleryTableName;
68 private $mediaGalleryValueTableName;
73 private $mediaGalleryEntityToValueTableName;
78 private $productEntityTableName;
93 ResourceModelFactory $resourceModelFactory,
96 $this->skuProcessor = $skuProcessor;
97 $this->metadataPool = $metadataPool;
99 $this->resourceFactory = $resourceModelFactory;
100 $this->errorAggregator = $errorAggregator;
111 $this->initMediaGalleryResources();
112 $mediaGalleryDataGlobal = array_replace_recursive(...$mediaGalleryData);
114 $multiInsertData = [];
115 $valueToProductId = [];
116 foreach ($mediaGalleryDataGlobal as $productSku => $mediaGalleryRows) {
117 $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
118 $insertedGalleryImgs = [];
119 foreach ($mediaGalleryRows as $insertValue) {
120 if (!in_array($insertValue[
'value'], $insertedGalleryImgs)) {
122 'attribute_id' => $insertValue[
'attribute_id'],
123 'value' => $insertValue[
'value'],
125 $valueToProductId[$insertValue[
'value']][] =
$productId;
126 $imageNames[] = $insertValue[
'value'];
127 $multiInsertData[] = $valueArr;
128 $insertedGalleryImgs[] = $insertValue[
'value'];
132 $oldMediaValues = $this->connection->fetchAssoc(
133 $this->connection->select()->from($this->mediaGalleryTableName, [
'value_id',
'value'])
134 ->where(
'value IN (?)', $imageNames)
136 $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
137 $newMediaSelect = $this->connection->select()->from($this->mediaGalleryTableName, [
'value_id',
'value'])
138 ->where(
'value IN (?)', $imageNames);
139 if (array_keys($oldMediaValues)) {
140 $newMediaSelect->where(
'value_id NOT IN (?)', array_keys($oldMediaValues));
142 $newMediaValues = $this->connection->fetchAssoc($newMediaSelect);
143 foreach ($mediaGalleryData as
$storeId => $storeMediaGalleryData) {
144 $this->processMediaPerStore((
int)
$storeId, $storeMediaGalleryData, $newMediaValues, $valueToProductId);
156 $this->updateMediaGalleryField($labels,
'label');
167 $this->updateMediaGalleryField($images,
'disabled');
177 private function updateMediaGalleryField(array
$data, $field)
180 foreach (
$data as $datum) {
181 $imageData = $datum[
'imageData'];
183 if ($imageData[$field] ===
null) {
185 $field => $datum[$field],
186 $this->getProductEntityLinkField() => $imageData[$this->getProductEntityLinkField()],
187 'value_id' => $imageData[
'value_id'],
191 $this->connection->update(
192 $this->mediaGalleryValueTableName,
194 $field => $datum[$field],
197 $this->getProductEntityLinkField() .
' = ?' => $imageData[$this->getProductEntityLinkField()],
198 'value_id = ?' => $imageData[
'value_id'],
205 if (!empty($insertData)) {
206 $this->connection->insertMultiple(
207 $this->mediaGalleryValueTableName,
222 if ($this->errorAggregator->hasToBeTerminated()) {
225 $this->initMediaGalleryResources();
226 $productSKUs = array_map(
230 $select = $this->connection->select()->from(
231 [
'mg' => $this->mediaGalleryTableName],
232 [
'value' =>
'mg.value']
234 [
'mgvte' => $this->mediaGalleryEntityToValueTableName],
235 '(mg.value_id = mgvte.value_id)',
237 $this->getProductEntityLinkField() =>
'mgvte.' . $this->getProductEntityLinkField(),
238 'value_id' =>
'mgvte.value_id',
241 [
'mgv' => $this->mediaGalleryValueTableName],
243 '(mg.value_id = mgv.value_id AND mgv.%s = mgvte.%s AND mgv.store_id = %d)',
244 $this->getProductEntityLinkField(),
245 $this->getProductEntityLinkField(),
249 'label' =>
'mgv.label',
250 'disabled' =>
'mgv.disabled',
253 [
'pe' => $this->productEntityTableName],
254 "(mgvte.{$this->getProductEntityLinkField()} = pe.{$this->getProductEntityLinkField()})",
273 private function initMediaGalleryResources()
275 if (
null == $this->mediaGalleryTableName) {
276 $this->productEntityTableName = $this->getResource()->getTable(
'catalog_product_entity');
277 $this->mediaGalleryTableName = $this->getResource()->getTable(
'catalog_product_entity_media_gallery');
278 $this->mediaGalleryValueTableName = $this->getResource()->getTable(
279 'catalog_product_entity_media_gallery_value' 281 $this->mediaGalleryEntityToValueTableName = $this->getResource()->getTable(
282 'catalog_product_entity_media_gallery_value_to_entity' 296 private function processMediaPerStore(
298 array $mediaGalleryData,
299 array $newMediaValues,
300 array $valueToProductId
302 $multiInsertData = [];
303 $dataForSkinnyTable = [];
304 foreach ($mediaGalleryData as $mediaGalleryRows) {
305 foreach ($mediaGalleryRows as $insertValue) {
306 foreach ($newMediaValues as $value_id =>
$values) {
307 if (
$values[
'value'] == $insertValue[
'value']) {
308 $insertValue[
'value_id'] = $value_id;
309 $insertValue[$this->getProductEntityLinkField()]
310 = array_shift($valueToProductId[
$values[
'value']]);
311 unset($newMediaValues[$value_id]);
315 if (isset($insertValue[
'value_id'])) {
317 'value_id' => $insertValue[
'value_id'],
319 $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
320 'label' => $insertValue[
'label'],
321 'position' => $insertValue[
'position'],
322 'disabled' => $insertValue[
'disabled'],
324 $multiInsertData[] = $valueArr;
325 $dataForSkinnyTable[] = [
326 'value_id' => $insertValue[
'value_id'],
327 $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
333 $this->connection->insertOnDuplicate(
334 $this->mediaGalleryValueTableName,
336 [
'value_id',
'store_id', $this->getProductEntityLinkField(),
'label',
'position',
'disabled']
338 $this->connection->insertOnDuplicate(
339 $this->mediaGalleryEntityToValueTableName,
343 }
catch (\Exception $e) {
344 $this->connection->delete(
345 $this->mediaGalleryTableName,
346 $this->connection->quoteInto(
'value_id IN (?)', $newMediaValues)
356 private function getProductEntityLinkField()
358 if (!$this->productEntityLinkField) {
359 $this->productEntityLinkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
362 return $this->productEntityLinkField;
370 private function getResource()
372 if (!$this->resourceModel) {
373 $this->resourceModel = $this->resourceFactory->create();
376 return $this->resourceModel;