기본 이미지를 첫 번째 이미지로, 일괄 위치 변경-Magento 2.3.5

Aug 17 2020

우리는 갤러리 중앙 어딘가에 기본 이미지가 배치되는 많은 제품이있는 대형 카탈로그 (125K 제품)를 보유하고 있습니다.

기본 이미지 자체를 선택하는 것은 괜찮습니다. 기본 이미지 여야하며 갤러리에서이 이미지의 위치 만 변경하면됩니다.

이미지 정렬을 수동으로 변경하고이 이미지를 갤러리 앞에 배치 할 수 있다는 것을 알고 있지만 모든 제품에 대해 일괄 적으로 수행 할 수있는 방법이 있습니까?

기본 이미지의 위치를 ​​변경하고 그 이미지를 앞에 배치하는 SQL 쿼리와 같은 것입니까?

아래 스크린 샷에서 첫 번째 이미지는 기본 이미지가 갤러리 중앙에 있고 마지막 이미지는 있어야합니다. 기본 이미지가 갤러리에서 첫 번째로 배치되는 위치입니다.

전에:

후:

답변

1 HerveTribouilloy Aug 20 2020 at 03:02

아래 스 니펫은 문제를 해결하기 위해 따라야 할 단계입니다.

    $mainImage = $this->imageQueryResource->getProductMainImage($productId); $firstImage = $this->imageQueryResource->getFirstImages($productId);
            $output->writeln('first image' . $firstImage);
    
            if ($mainImage != $firstImage) {
                $output->writeln('fix product ' . $mainImage . ' product id: ' . $productId); $otherImages = $this->imageQueryResource->getAllImages($productId);
                foreach ($otherImages as $image) {
                    $position = 1; if ($image['value'] == $mainImage) { $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
    
                reset($otherImages); foreach ($otherImages as $image) { if ($image['value'] != $mainImage) { $position++;
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
            }

아래 파일은 이미지에 대한 쿼리 및 업데이트를 수행합니다.

<?php

namespace Mbs\ImageSorting\Model;

use Magento\Framework\App\ResourceConnection;

class ImageQueryResource
{
    /**
     * @var ResourceConnection
     */
    private $resourceConnection;
    /**
     * @var \Magento\Eav\Model\Config
     */
    private $config; public function __construct( ResourceConnection $resourceConnection,
        \Magento\Eav\Model\Config $config ) { $this->resourceConnection = $resourceConnection; $this->config = $config; } public function getProductMainImage(int $productId)
    {
        $mainImageAttribute = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'image');

        $select = $this->resourceConnection->getConnection()->select();
        $select->from($this->resourceConnection->getTableName('catalog_product_entity_' . $mainImageAttribute->getBackendType())); $select->where('entity_id=?', $productId); $select->where('attribute_id=?', $mainImageAttribute->getId()); $select->reset(\Magento\Framework\DB\Select::COLUMNS);
        $select->columns(['value']); return $this->resourceConnection->getConnection()->fetchOne($select); } /** * @param int $productId
     * select * from catalog_product_entity_media_gallery_value as v
    inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
    where entity_id=1802
    order by position
     */
    public function getAllImages(int $productId) { $select = $this->resourceConnection->getConnection()->select(); $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]); $select->join(
            ['g' => 'catalog_product_entity_media_gallery'],
            'g.value_id=v.value_id',
            []
        );

        $select->where('entity_id=?', $productId);
        $select->reset(\Magento\Framework\DB\Select::COLUMNS); $select->columns(['v.value_id', 'v.position', 'g.value']);
        $select->order('v.position'); return $this->resourceConnection->getConnection()->fetchAll($select); } /** * @param int $productId
     * select * from catalog_product_entity_media_gallery_value as v
    inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
    where entity_id=1802
    order by position
     */
    public function getFirstImages(int $productId) { $select = $this->resourceConnection->getConnection()->select(); $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]); $select->join(
            ['g' => 'catalog_product_entity_media_gallery'],
            'g.value_id=v.value_id',
            []
        );

        $select->where('entity_id=?', $productId);
        $select->reset(\Magento\Framework\DB\Select::COLUMNS); $select->columns(['g.value', 'v.position']);
        $select->order('v.position'); //$select->limit(1);

        $result = $this->resourceConnection->getConnection()->fetchAll($select); $minPosition = 2000;
        $position = []; $minImage = '';
        foreach ($result as $row) {
            if ($row['position'] < $minPosition) {
                $minPosition = $row['position'];
                $minImage = $row['value'];
                $position[$row['position']] = 1;
            }
        }

        if (count($position) > 1) { return $minImage;
        }
    }

    public function updatePosition(int $valueId, int $position)
    {
        $this->resourceConnection->getConnection()->update( $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value'),
            ['position' => $position], ['value_id=?' => $valueId]
        );
    }

}