Image Magento:如何通过编程将基本图像设置为列表中的第一个图像 问题 现状

Image Magento:如何通过编程将基本图像设置为列表中的第一个图像 问题 现状,image,magento,Image,Magento,我对第三方ioncube loader编码的feedloader插件有一个问题,原作者不再支持该插件(因为他们已经失败了),我决定在导入运行后修复它的问题,而不是花两周时间从头开始编写 兼容性 唯一的问题是:我想使用Mage库中的函数来编写这篇文章,而不是依赖于一些自定义查询,这些查询可能会在Magento的下一次更新或每当我更改数据库中的某些内容时中断(我想我只是想更好地了解Magento的核心函数) 问题诊断 导入几乎所有操作都是正确的,除了设置基本图像(小图像和缩略图设置正确),如下面的屏

我对第三方ioncube loader编码的feedloader插件有一个问题,原作者不再支持该插件(因为他们已经失败了),我决定在导入运行后修复它的问题,而不是花两周时间从头开始编写

兼容性 唯一的问题是:我想使用Mage库中的函数来编写这篇文章,而不是依赖于一些自定义查询,这些查询可能会在Magento的下一次更新或每当我更改数据库中的某些内容时中断(我想我只是想更好地了解Magento的核心函数)

问题诊断 导入几乎所有操作都是正确的,除了设置基本图像(小图像和缩略图设置正确),如下面的屏幕截图所示:

该映像缺少数据库中的实际记录。。(很想用一个查询来修复它,但我不会……我将继续寻找一个优雅的解决方案)


另外,函数$product->getMediaGalleryImages()不返回任何图像,因此我无法使用@SKV over at.建议的解决方案。。除非我做错了什么。

这是我最终在“shell/fix_images.php”中使用的解决方案:

$productId = 1;
//load the product
$product = Mage::getModel('catalog/product')->load($productId);
//get all images
$mediaGallery = $product->getMediaGallery();
//if there are images
if (isset($mediaGallery['images'])){
    //loop through the images
    foreach ($mediaGallery['images'] as $image){
        //set the first image as the base image
        Mage::getSingleton('catalog/product_action')->updateAttributes(array($product->getId()), array('image'=>$image['file']), 0);
        //stop
        break;
    }
}
<?php
ini_set('display_errors','On');
ini_set('memory_limit','512M');
error_reporting(E_ALL);
require_once('abstract.php');

class Mage_Shell_Updater extends Mage_Shell_Abstract
{
    public function run()
    {
        $products = Mage::getResourceModel('catalog/product_collection')
                ->addAttributeToFilter('is_imported', 1); // attribute added by importer
        $c=0;
        foreach($products as $p) {
            $pid = $p->getId();
            $product = Mage::getModel('catalog/product')->load($pid);
            $mediaGallery = $product->getMediaGallery();
            if (isset($mediaGallery['images'])){
                foreach ($mediaGallery['images'] as $image){
                    Mage::getSingleton('catalog/product_action')
                    ->updateAttributes(array($pid), array('image'=>$image['file']), 0);
                    $c++;
                    break;
                }
            }
        }
        echo($c . " product(s) updated.");
    }

}

$shell = new Mage_Shell_Updater();
$shell->run();
在run()的末尾:


此外,abstract.php来自Mage_Shell,通常位于Magento安装根目录下的/Shell/目录中。

在我的问题中,我为已启用的分组产品设置了映像。我已将最后一张图像设置为基础图像、小图像和缩略图

$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter("type_id",array("eq","grouped"))
                  ->addAttributeToFilter("status",array("eq","1"));
foreach($collection as $tmpProduct) {
  $sku = $tmpProduct->getSku();
  $product = Mage::getModel('catalog/product')
                 ->loadByAttribute("sku",$sku);
  $_images = Mage::getModel('catalog/product')
                 ->load($product->getId())
                 ->getMediaGalleryImages();
  $checkImage =  Mage::getBaseDir('media').DS.'catalog'.DS.'product'.DS.$product->getImage();

  if( $product->getImage()!=''  && is_file($checkImage)) {
    continue; // do nothing
  } else {
    if($_images) {
      $baseImage = '';
      foreach($_images as $_image) {
        $baseImage = $_image->getFile();
      }
      $groupedImagePath = Mage::getBaseDir('media').DS.'catalog'.DS.'product'.DS.$baseImage;
      $product->setMediaGallery(
                  array('images'=>array (),
                        'values'=>array ()));
      $product->addImageToMediaGallery(
                  $groupedImagePath,
                  array('image', 'thumbnail', 'small_image'),
                  false,
                  false);   
      Mage::getModel('catalog/product_attribute_media_api')
          ->remove($product->getId(),$baseImage);
      $product->save();  
      echo "<br>$sku has selected image <br>";
} } }
$collection=Mage::getModel('catalog/product'))
->getCollection()
->addAttributeToFilter(“type_id”,数组(“eq”,“grouped”))
->addAttributeToFilter(“状态”,数组(“等式”,“1”));
foreach($tmpProduct形式的集合){
$sku=$tmpProduct->getSku();
$product=Mage::getModel('目录/产品')
->loadByAttribute(“sku”,即$sku);
$\u images=Mage::getModel('目录/产品')
->加载($product->getId())
->getMediaGalleryImages();
$checkImage=Mage::getBaseDir('media').DS.catalog.DS.product.DS.$product->getImage();
如果($product->getImage()!=''&&is_文件($checkImage)){
继续;//什么也不做
}否则{
如果($\u图像){
$baseImage='';
foreach($\图像作为$\图像){
$baseImage=$\u image->getFile();
}
$groupedImagePath=Mage::getBaseDir('media').DS.catalog.DS.product.DS.$baseImage;
$product->setMediaGallery(
数组('images'=>array(),
'values'=>array());
$product->ADDIMAGETOMEDIAGALERY(
$GroupeImage路径,
数组(“图像”、“缩略图”、“小图像”),
假,,
假);
Mage::getModel('catalog/product\u attribute\u media\u api')
->删除($product->getId(),$baseImage);
$product->save();
echo“
$sku已选择图像
”; } } }
使用
getMediaGallery
而不是
GetMediaGalleryImage
。看看我的答案。我已经测试过了,它可以正常工作。我必须亲自尝试,不幸的是,另一个项目出现了一些高优先级的修复。。今天晚些时候我会尝试这样做。一旦我确认了这一点,我会将其标记为正确的解决方案。非常感谢。可能有岁了,但这对我今天的基本图像工作非常有用,我可以知道小图像和缩略图吗?@Rathinam在
更新任务中用
小图像
缩略图
替换
图像。@Marius$productId=1;如果我尝试使用$productId=array(3,21,24,42,74),如何添加多个产品ID;它不起作用。错误:我要更改什么来设置所有图像?已正确设置数百个“我的导入”图像。您似乎正在将媒体库设置为空阵列,然后添加图像。如果一个产品保存了多个图像,除了最后一个图像外,是否会删除所有图像?
    foreach ($pCollection as $process) {
        $process->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)->save();
    }
$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter("type_id",array("eq","grouped"))
                  ->addAttributeToFilter("status",array("eq","1"));
foreach($collection as $tmpProduct) {
  $sku = $tmpProduct->getSku();
  $product = Mage::getModel('catalog/product')
                 ->loadByAttribute("sku",$sku);
  $_images = Mage::getModel('catalog/product')
                 ->load($product->getId())
                 ->getMediaGalleryImages();
  $checkImage =  Mage::getBaseDir('media').DS.'catalog'.DS.'product'.DS.$product->getImage();

  if( $product->getImage()!=''  && is_file($checkImage)) {
    continue; // do nothing
  } else {
    if($_images) {
      $baseImage = '';
      foreach($_images as $_image) {
        $baseImage = $_image->getFile();
      }
      $groupedImagePath = Mage::getBaseDir('media').DS.'catalog'.DS.'product'.DS.$baseImage;
      $product->setMediaGallery(
                  array('images'=>array (),
                        'values'=>array ()));
      $product->addImageToMediaGallery(
                  $groupedImagePath,
                  array('image', 'thumbnail', 'small_image'),
                  false,
                  false);   
      Mage::getModel('catalog/product_attribute_media_api')
          ->remove($product->getId(),$baseImage);
      $product->save();  
      echo "<br>$sku has selected image <br>";
} } }