Программное обновление Меток Изображений


Я пытаюсь обновить этикетки на изображениях моих продуктов. Я хочу, чтобы они совпадали с названием продукта.

Что я пробовал

$mediaModel = Mage::getModel("catalog/product_attribute_backend_media");
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    $mediaModel->updateImage(
        $product->getId(),
        $image->getFile(),
        array("label" => $title)
    );
}

Но потом я получаю эту ошибку

Неустранимая ошибка: Вызов функции-члена getAttributeCode() для не-объекта в app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php в строке 401

Я тоже пробовал

$mediaModel = Mage::getModel("catalog/product_attribute_media_api");
$images = $mediaModel->items($product->getId());
foreach ($images as $image) {    
    $mediaModel->update(
        $product->getId(),
        $image['file'],
        array("label" => $title)
    );
}

, который работает нормально, но значения не обновляются в администратор.

Как мне это сделать?

Author: Steve Robbins, 2013-05-22

2 answers

Следующий код должен работать для вас.

$product = mage::getModel('catalog/product')->load(16);
$attributes = $product->getTypeInstance(true)->getSetAttributes($product);
$gallery = $attributes['media_gallery'];
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    $backend = $gallery->getBackend();
    $backend->updateImage(
        $product,
        $image->getFile(),
        array('label' => 'Blah')
    );
}
$product->getResource()->saveAttribute($product, 'media_gallery');

Я получал ошибку просто при $product->save(); но сохранение одного атрибута, похоже, работает.

 8
Author: David Manners, 2013-05-22 07:18:28

Приведенный выше код не сработал для меня. Вот измененный код, который в конечном итоге работает:

function _SetProductImagesAlt($product, $altText='') {
  if (is_numeric($product))
  {
    $product = mage::getModel('catalog/product')->load($product);
  }
  else //reload the product
  {
    $product = mage::getModel('catalog/product')->load($product->getId());
  }

  //set alt to the name of the Product if not set otherwise
  if (empty($altText))
  {
    $altText = $product->getName();
  }

  //sanitize string
  $altText = str_replace("\r", "", $altText);
  $altText = str_replace("\n", "", $altText);

  $altText = htmlspecialchars($altText, ENT_QUOTES, 'UTF-8');

  $attributes = $product->getTypeInstance(true)->getSetAttributes($product);
  $images = $product->getMediaGalleryImages();
  $mediaGalleryBackendModel = $attributes['media_gallery']->getBackend();
  foreach ($images as $image) {
    $mediaGalleryBackendModel->updateImage($product, $image->getFile(), array('label' => $altText));
  }
  $product->save();   
}

Примечание: перезагрузка объекта product в строке 8 оказалась важной, если вы использовали тот же объект для добавления нового продукта заранее.

 2
Author: Bojan Hrnkas, 2015-03-31 17:55:34