Magento par programmation supprimez des images de produits
cela doit être une tâche de programmation si simple que je ne peux absolument pas trouver d'informations à ce sujet sur le net. En gros, j'essaie de supprimer les images de produit. Je veux supprimer toutes les images de la galerie de médias d'un produit. Puis-je le faire sans parcourir un million de lignes de code pour une tâche aussi simple?
s'il vous Plaît noter que j'ai déjà essayé ceci:
$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']);
}
}
}
cela ne fonctionne absolument pas. J'essaie de supprimer des images lors d'une importation pour ne pas gardez les doublons accumulés. Toute aide serait grandement appréciée.
13 réponses
OK, c'est comme ça que j'ai finalement réglé mon problème.
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']);
}
voici le lien qui a finalement remis ma tête en place: http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media
dommage que ce ne soit pas aussi simple que $product - > getImages (), hein?
Pour supprimer toutes les images à partir d'un produit de la galerie:
$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();
//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();
Avec le code de Davids Tay réponse, j'ai obtenu l'erreur:
Erreur fatale: uncaught exception "Mage_Eav_Model_Entity_Attribute_exception’ with message" SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (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
CLÉ ÉTRANGÈRE ( value_id
) REFERENCES `catalog_prod)’
lors de la suppression des images j'ai trouvé une chose intéressante. Quand vous essayez ce code:
$galleryData = $product->getMediaGallery(); //this returns NULL
galerie des Médias de l'objet dépend de la façon dont votre produit a été créé, si:
$product = Mage::getModel('catalog/product')->loadByAttr('sku', $sku);
alors la galerie des médias sera vide, si:
$product = Mage::getModel('catalog/product')->load($id);
alors media gallery est object et vous pouvez utiliser cet objet pour supprimer des images de db. Pour supprimer des images du système de fichiers, vous devez ajouter un tel code:
@unlink(Mage::getBaseDir('media') . '\catalog\product\' . $image['file']);
mais si vous voulez changer l'image et la nommer comme image précédente (image1.png remplacer par image1.png) dans ce cas, vous devrez problème de mise en cache du navigateur.
vous pouvez Également essayer de charger la galerie multimédia de produit:
$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);
J'espère que cette réponse n'est pas inopportune, car ce n'est techniquement pas une solution obtenue via la programmation Magento comme vous le demandez, mais j'ai réussi à purger toutes les images de Galerie moi-même pour le même but simplement en tronquant les tables pertinentes dans Magento 1.4.2.0 (je crois que c'est la même structure de table dans 1.5 aussi bien).
TRUNCATE TABLE `catalog_product_entity_media_gallery`
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`
ensuite, supprimez tous les fichiers image dans le / media / catalog / product répertoire.
j'ai chercher un moyen pour faire cela programmatically moi-même, mais a trouvé cela beaucoup plus efficace et n'ont pas éprouvé d'effets secondaires négatifs.
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']);
}
}
?>
C'est le code que j'ai finalement décidé d'utiliser pour cette tâche.
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);
}
ce
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();
moyen le plus rapide de supprimer l'image,puis suivez les étapes ci-dessous: supprimer tous les enregistrements de
catalog_product_entity_media_gallery
catalog_product_entity_media_gallery_value'
table parce que magento est enregistrer toutes les données d'image du produit à cette table.
puis index à partir de la gestion de L'Index à partir de l'administrateur pour définir l'image noire.
puis supprimer l'image from dir
puis allez à votre magento dir à media/catalog/product
et à partir de ce dossier supprimer tous les fichiers.
une Autre Processus:
Andy Simpson, vous avez besoin d'un script qui is delete all product
de votre système qui va delete from DB and file system
.
Etape 1: Créer a php
root direct of magento system
dont Mage.php at first code
.
require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);
Etape 2: set current store is
admin et de définir le mode Développeur
Mage::app('admin');
Mage::setIsDeveloperMode(true);
Step 3: Get Product Collection
et de créer une boucle pour obtenir un produit par un par un
$productCollection=Mage::getResourceModel('catalog/product_collection');
Step 4: aller chercher le produit par l'image de l'un et de supprimer une image à l'aide de code ci-dessous:
$remove=Mage::getModel('catalog/product_attribute_media_api')->remove($product->getId(),$eachImge['file']);
CODE COMPLET:
<?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']);
}
}
si vous voulez supprimer plus de produits comme 1000 ou 5000 puis utiliser le bas un avec requête directe.
Avant d'essayer celui-ci prendre de sauvegarde de votre base de données
<?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);
?>
j'ai dû faire quelque chose de similaire il n'y a pas si longtemps - nécessaire pour remplacer toutes les images de produit lors d'une importation.
ce lien a beaucoup aidé: http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/
espérons que cela vous donnera un coup de pouce dans la bonne direction.
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)
pourquoi 17 ?
Le expamle vous avez en double comme ceci:
/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
Non, ils sont des doublons ;)
placez le script ci-dessous dans magento root et exécutez
<?php
require_once("app/Mage.php");
umask(0);
Mage::app();
$ob = new Clean();
$ob->removemedia();
Class Clean {
function removemedia() {
$read = Mage::getSingleton('core/resource')->getConnection('core_read');
$select = $read->select()
->from('catalog_product_entity_media_gallery', '*')
->group(array('value_id'));
$flushImages = $read->fetchAll($select);
echo count($flushImages);
$array = array();
foreach ($flushImages as $item1) {
$array[] = $item1['value'];
}
$valores = $array;
$pepe = 'media' . DS . 'catalog' . DS . 'product';
$leer = $this->listDirectories($pepe);
foreach ($leer as $item) {
try {
$item = strtr($item, '\', '/');
if (!in_array($item, $valores)) {
$valdir[]['filename'] = $item;
unlink('media/catalog/product' . $item);
}
} catch (Zend_Db_Exception $e) {
} catch (Exception $e) {
//Mage::log($e->getMessage());
}
}
}
function listDirectories($path) {
if (is_dir($path)) {
if ($dir = opendir($path)) {
while (($entry = readdir($dir)) !== false) {
if (preg_match('/^\./', $entry) != 1) {
if (is_dir($path . DS . $entry) && !in_array($entry, array('cache', 'watermark'))) {
$this->listDirectories($path . DS . $entry);
} elseif (!in_array($entry, array('cache', 'watermark')) && (strpos($entry, '.') != 0)) {
$this->result[] = substr($path . DS . $entry, 21);
}
}
}
closedir($dir);
}
}
return $this->result;
}
}