Magento программно удаляет изображения товара - PullRequest
22 голосов
/ 19 апреля 2011

Это должно быть настолько простой задачей программирования, что я абсолютно не могу найти какую-либо информацию об этом в сети.По сути, я пытаюсь УДАЛИТЬ изображения продуктов.Я хочу удалить все изображения из медиа-галереи продукта.Могу ли я сделать это, не просматривая миллион строк кода для такой простой задачи?

Обратите внимание, что я уже пробовал это:

$attributes = $product->getTypeInstance()->getSetAttributes();
if (isset($attributes['media_gallery'])) {
    $gallery = $attributes['media_gallery'];
    $galleryData = $product->getMediaGallery();//this returns NULL

    foreach($galleryData['images'] as $image){
        if ($gallery->getBackend()->getImage($product, $image['file'])) {
            $gallery->getBackend()->removeImage($product, $image['file']);
        }
    }
}

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

Ответы [ 14 ]

45 голосов
/ 19 апреля 2011

Хорошо, вот как я наконец-то исправил свою проблему.

if ($product->getId()){
    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");
    $items = $mediaApi->items($product->getId());
    foreach($items as $item)
        $mediaApi->remove($product->getId(), $item['file']);
}

Это ссылка, которая, наконец, заставила меня задуматься: http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media

Жаль, что это не так просто, как $ product-> getImages (), а?

9 голосов
/ 08 января 2013

В Magento 1.7.0.2 я использую этот код для удаления всех изображений из галереи продуктов:

//deleting
Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
$mediaApi = Mage::getModel("catalog/product_attribute_media_api");
$items = $mediaApi->items($product->getId());
$attributes = $product->getTypeInstance()->getSetAttributes();
$gallery = $attributes['media_gallery'];
foreach($items as $item){
    if ($gallery->getBackend()->getImage($product, $item['file'])) {
        $gallery->getBackend()->removeImage($product, $item['file']);
    }
}
$product->save();

С кодом ответа Дэвидса Тея я получил ошибку: Неустранимая ошибка: необработанное исключение «Mage_Eav_Model_Entity_Attribute_Exception» с сообщением «SQLSTATE [23000]: нарушение ограничения целостности: 1452 Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (base_xxx. catalog_product_entity_media_gallery_value, CONSTRAINT FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID FOREIGN KEY ( value_id) ССЫЛКИ `catalog_prod) '

8 голосов
/ 04 июля 2011

Чтобы удалить все изображения из галереи товаров:

$product = Mage::getModel('catalog/product')->load($id);
$mediaGalleryAttribute = Mage::getModel('catalog/resource_eav_attribute')->loadByCode($entityTypeId, 'media_gallery');
$gallery = $product->getMediaGalleryImages();
foreach ($gallery as $image)
    $mediaGalleryAttribute->getBackend()->removeImage($product, $image->getFile());
$product->save();
5 голосов
/ 13 июля 2012

Во время удаления изображений я обнаружил одну интересную вещь.При попытке использования этого кода:

$galleryData = $product->getMediaGallery(); //this returns NULL

Объект галереи мультимедиа зависит от того, как был создан ваш продукт, если:

$product = Mage::getModel('catalog/product')->loadByAttr('sku', $sku);

, тогда галерея мультимедиа будет пустой, если:

$product = Mage::getModel('catalog/product')->load($id);

, то медиа галерея это объект, и вы можете использовать этот объект для удаления изображений из БД.Чтобы удалить изображения из файловой системы, вы должны добавить такой код:

@unlink(Mage::getBaseDir('media') . '\catalog\product\' . $image['file']);

, но если вы хотите изменить изображение и назвать его как предыдущее изображение (image1.png заменить на image1.png), в этом случае вы будетеесть проблема с кэшированием в браузере.

Также вы можете попробовать загрузить медиа галерею для продукта:

$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);
3 голосов
/ 01 сентября 2015
     Just use this code to create .php file and place it to root folder of magento.

    <?php 
    require_once 'app/Mage.php';

    Mage::app();
    Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);

    $products = Mage::getModel('catalog/product')->getCollection();
      //->addAttributeToFilter('entity_id', array('gt' => 14000));

    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");

    foreach($products as $product) {
        $prodID = $product->getId();
        $_product = Mage::getModel('catalog/product')->load($prodID);
        $items = $mediaApi->items($_product->getId());
        foreach($items as $item) {
            $mediaApi->remove($_product->getId(), $item['file']);
        }
    }
?>
3 голосов
/ 24 июля 2015

Это код, который я наконец решил использовать для этой задачи.

protected function _removeMediaGalleryImages(Mage_Catalog_Model_Product $product)
{
    $mediaGalleryData = $product->getMediaGallery();
    if (!isset($mediaGalleryData['images']) || !is_array($mediaGalleryData['images'])) {
        return;
    }

    $toDelete = array();
    foreach ($mediaGalleryData['images'] as $image) {
        $toDelete[] = $image['value_id'];
    }
    Mage::getResourceModel('catalog/product_attribute_backend_media')->deleteGallery($toDelete);
}
3 голосов
/ 19 апреля 2011

Надеюсь, этот ответ не является нежелательным, поскольку технически это не решение, достигаемое с помощью программирования на Magento, как вы просите, но я успешно удалил все изображения галереи для той же цели, просто обрезав соответствующие таблицы в Magento 1.4.2.0 (Я полагаю, что это та же самая структура таблицы в 1.5).

TRUNCATE TABLE `catalog_product_entity_media_gallery`
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`

Затем удалите все файлы изображений в каталоге / media / catalog / product .

Я сам искал способ сделать это программно, но нашел это гораздо более эффективным и не испытал отрицательных побочных эффектов.

1 голос
/ 15 июля 2016

Если вы хотите удалить больше продуктов, таких как 1000 или 5000, используйте нижний с прямым запросом.

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

<?php
require_once 'app/Mage.php';
umask(0);
Mage::app();
set_time_limit(0);
ini_set('display_error','1');


$resource = Mage::getSingleton('core/resource');
$connection = $resource->getConnection('core_write');

$id = 101;
$product = Mage::getModel('catalog/product')->load($id);

$q = "DELETE FROM `catalog_product_entity_media_gallery` where entity_id = '".$product->getId()."'"; 

$connection->query($q);

?>
1 голос
/ 07 ноября 2015

Самый быстрый способ удаления изображения, затем выполните следующие шаги: удалите все записи из таблицы

  1. catalog_product_entity_media_gallery
  2. catalog_product_entity_media_gallery_value'

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

Затем индекс из управления индексами от admin для установки черного изображения.

Затем удалите изображение from dir, затем перейдите в каталог magento в media/catalog/productи из этой папки удалите все файлы.

Другой процесс:

Энди Симпсон, вам нужен скрипт, который is delete all product из вашей системы, который будет delete from DB and file system.

Step1: Создать a php в root direct of magento system, включая Mage.php at first code.

require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);

Step2: установить current store is admin и установить режим разработчика

Mage::app('admin');
Mage::setIsDeveloperMode(true);

Шаг 3: Получить Product Collection и создать цикл для получения одного продукта по одному

$productCollection=Mage::getResourceModel('catalog/product_collection');

Шаг 4: получить изображение продуктапо одному и удалите изображение, используя следующий код:

$remove=Mage::getModel('catalog/product_attribute_media_api')->remove($product->getId(),$eachImge['file']);

ПОЛНЫЙ КОД:

<code><?php
require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);
Mage::app('admin');
Mage::setIsDeveloperMode(true);

$productCollection=Mage::getResourceModel('catalog/product_collection');
foreach($productCollection as $product){
echo $product->getId();
echo "<br/>";
         $MediaDir=Mage::getConfig()->getOptions()->getMediaDir();
        echo $MediaCatalogDir=$MediaDir .DS . 'catalog' . DS . 'product';
echo "<br/>";

$MediaGallery=Mage::getModel('catalog/product_attribute_media_api')->items($product->getId());
echo "<pre>";
print_r($MediaGallery);
echo "
"; foreach ($ MediaGallery as $ eachImge) {$ MediaDir = Mage :: getConfiг () -> getOptions () -> getMediaDir ();$ MediaCatalogDir = $ MediaDir .DS.'каталог' .DS'товар';$ DirImagePath = str_replace ( "/", DS, $ eachImge [ 'файл']);$ DirImagePath = $ DirImagePath;// удалить файл из Dir $ io = new Varien_Io_File ();$ Io-> гт ($ MediaCatalogDir $ DirImagePath.);$ Удалить = Mage :: getModel ( 'Каталог / product_attribute_media_api') -> удалить ($ продукт-> GetId (), $ eachImge [ 'файл']);}}
1 голос
/ 16 марта 2015

Что об этом

Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");
    $items = $mediaApi->items($product->getId());
    $attributes = $product->getTypeInstance()->getSetAttributes();
    $gallery = $attributes['media_gallery'];
    foreach($items as $item){
        if ($gallery->getBackend()->getImage($product, $item['file'])) {
            $gallery->getBackend()->removeImage($product, $item['file']);
        }
    }
    $product->save();
...