기본 이미지를 첫 번째 이미지로, 일괄 위치 변경-Magento 2.3.5
우리는 갤러리 중앙 어딘가에 기본 이미지가 배치되는 많은 제품이있는 대형 카탈로그 (125K 제품)를 보유하고 있습니다.
기본 이미지 자체를 선택하는 것은 괜찮습니다. 기본 이미지 여야하며 갤러리에서이 이미지의 위치 만 변경하면됩니다.
이미지 정렬을 수동으로 변경하고이 이미지를 갤러리 앞에 배치 할 수 있다는 것을 알고 있지만 모든 제품에 대해 일괄 적으로 수행 할 수있는 방법이 있습니까?
기본 이미지의 위치를 변경하고 그 이미지를 앞에 배치하는 SQL 쿼리와 같은 것입니까?
아래 스크린 샷에서 첫 번째 이미지는 기본 이미지가 갤러리 중앙에 있고 마지막 이미지는 있어야합니다. 기본 이미지가 갤러리에서 첫 번째로 배치되는 위치입니다.
전에:
후:
답변
1 HerveTribouilloy
아래 스 니펫은 문제를 해결하기 위해 따라야 할 단계입니다.
$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]
);
}
}