7

问题

现在的情况

我在使用第三方 ioncube loader 编码的 feedloader 插件时遇到了问题,该插件不再受到原作者的支持(因为他们开始努力了),而不是花两周时间从头开始完全编写它,我已经决定在导入运行后解决它遇到的问题。

兼容性

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

问题诊断

除了设置基本图像(正确设置小图像和缩略图图像)之外,导入几乎所有内容都正确,如下面的屏幕截图所示:

第一个也是唯一一个图像未被选为默认基础图像

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

此外,函数 $product->getMediaGalleryImages() 不返回任何图像,所以我不能使用 @SKV 在Set Base Image Programmatically建议的解决方案.. 除非我做错了什么。

4

3 回答 3

25
$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;
    }
}
于 2013-10-03T08:12:44.807 回答
6

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

<?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();

如果有人应该使用它,请务必从您自己的 Mage 方法链中删除“addAttributeToFilter”。如果您要将其作为独立脚本运行(不首先禁用实时索引),请在运行开始时添加此代码():

    $pCollection = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
    foreach ($pCollection as $process) {
        $process->setMode(Mage_Index_Model_Process::MODE_MANUAL)->save();
    }

在运行()结束时:

    foreach ($pCollection as $process) {
        $process->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)->save();
    }

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

于 2013-10-03T12:54:51.933 回答
0

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

$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>";
} } }
于 2015-08-24T11:58:09.750 回答