Magento программно удаляет изображения продукта
Это должна быть такая простая задача программирования, что я абсолютно не могу найти никакой информации об этом в сети. В основном, я пытаюсь УДАЛИТЬ изображения продукта. Я хочу удалить все изображения из медиа-галереи продукта. Могу ли я сделать это, не пробираясь через миллион строк кода для такой простой задачи?
Обратите внимание, что я уже пробовал это:
$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']);
}
}
}
Это абсолютно не работает. Я пытаюсь удалить изображения во время импорта, чтобы не набирать дубликаты. Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Хорошо, вот как я, наконец, исправил свою проблему.
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(), eh?
Ответ 2
Чтобы удалить все изображения из галереи продуктов:
$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();
Ответ 3
В 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();
С кодом от Davids Tay ответ, я получил ошибку:
Неустранимая ошибка: исключить исключение "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)
Ответ 4
При удалении изображений я нашел одну интересную вещь. Когда вы попробуете этот код:
$galleryData = $product->getMediaGallery(); //this returns NULL
Объект галереи мультимедиа зависит от того, как был создан ваш продукт, если:
$product = Mage::getModel('catalog/product')->loadByAttr('sku', $sku);
тогда медиа-галерея будет пуста, если:
$product = Mage::getModel('catalog/product')->load($id);
тогда медиа-галерея является объектом, и вы можете использовать этот объект для удаления изображений с db.
Чтобы удалить изображения из файловой системы, вы должны добавить такой код:
@unlink(Mage::getBaseDir('media') . '\catalog\product\' . $image['file']);
но если вы хотите изменить изображение и назовите его как предыдущее изображение (image1.png заменить на image1.png), в этом случае у вас будет проблема кэширования браузера.
Также вы можете попробовать загрузить медиа-галерею для продукта:
$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);
Ответ 5
Надеюсь, этот ответ не является нежелательным, поскольку технически это не решение, достигнутое с помощью программирования 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.
Я искал способ сделать это программно сам, но нашел это намного более эффективным и не испытывал никаких отрицательных побочных эффектов.
Ответ 6
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']);
}
}
?>
Ответ 7
Это код, который я решил использовать для этой задачи.
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);
}
Ответ 8
Что об этом
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();
Ответ 9
Мне пришлось сделать что-то подобное не так давно - нужно было заменить все изображения продукта во время импорта.
Эта ссылка очень помогла: http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/
Надеюсь, это даст вам толчок в правильном направлении.
Ответ 10
DELETE FROM catalog_product_entity_media_gallery WHERE value_id NOT IN (SELECT * FROM (SELECT MIN(value_id) FROM `catalog_product_entity_media_gallery` GROUP BY LEFT(value,17), entity_id having count(*) > 1) x)
почему 17?
В расширении вы дублируете:
/0/0/000116810609_1.jpg
/0/0/000116810609_2.jpg
/0/0/000116810609_3.jpg
/0/0/000116810609_4.jpg
LEFT(value,17)
/0/0/000116810609
/0/0/000116810609
/0/0/000116810609
/0/0/000116810609
Нет, они дубликаты;)
Ответ 11
Самый быстрый способ удалить изображение, а затем выполните следующие шаги:
удалить все записи из
-
catalog_product_entity_media_gallery
-
catalog_product_entity_media_gallery_value'
поскольку magento сохраняет все данные изображения продукта в этой таблице.
Затем указатель от управления индексом от администратора для заданного черного изображения.
Затем удалите изображение from dir
, затем перейдите в свой magento dir в media/catalog/product
и из этой папки удалите весь файл.
Другой процесс:
Энди Симпсон, вам понадобится script, который is delete all product
из вашей системы, который будет delete from DB and file system
.
Шаг1: Создайте a php
в root direct of magento system
, которые включают Mage.php at first code
.
require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);
Шаг 2: установите 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']);
ПОЛНЫЙ КОД:
<?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 "</pre>";
foreach($MediaGallery as $eachImge){
$MediaDir=Mage::getConfig()->getOptions()->getMediaDir();
$MediaCatalogDir=$MediaDir .DS . 'catalog' . DS . 'product';
$DirImagePath=str_replace("/",DS,$eachImge['file']);
$DirImagePath=$DirImagePath;
// remove file from Dir
$io = new Varien_Io_File();
$io->rm($MediaCatalogDir.$DirImagePath);
$remove=Mage::getModel('catalog/product_attribute_media_api')->remove($product->getId(),$eachImge['file']);
}
}
Ответ 12
Если вы хотите удалить больше таких продуктов, как 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);
?>