पहली छवि के रूप में बेस छवियां, बल्क में स्थिति बदलें - मैगेंटो 2.3.5
हमारे पास एक बड़ी सूची (125K उत्पाद) है, जिसमें बहुत सारे उत्पाद हैं जहां आधार छवि गैलरी के बीच में कहीं तैनात है।
आधार छवि का चयन स्वयं ठीक है, यह आधार छवि होनी चाहिए और हमें गैलरी में केवल इस छवि की स्थिति को बदलना होगा।
हम जानते हैं कि हम मैन्युअल रूप से छवियों की छंटाई को बदल सकते हैं और इस छवि को गैलरी के सामने रख सकते हैं, लेकिन क्या सभी उत्पादों के लिए थोक में ऐसा करने का कोई तरीका है?
एक sql क्वेरी की तरह कुछ, जो आधार छवि की स्थिति को बदल देता है और उस एक को सामने रखता है?
नीचे दिए गए स्क्रीनशॉट में आप पहली बार देखते हैं, जहां आधार छवि गैलरी के बीच में है और अंतिम छवि जैसा कि यह होना चाहिए। जहां गैलरी में बेस इमेज को पहले की तरह रखा गया है।
इससे पहले:
उपरांत:
जवाब
नीचे स्निपेट आपके मुद्दे को हल करने के लिए अनुसरण करने के लिए चरण है
$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]
);
}
}