Magento e constraint
Cambiare un attributo a mano nel database di Magento sembra un'operazione banale. Non lo è. Due giorni di bestemmie e un DELETE su tre tabelle per tornare alla normalità.
Lavorando di recente su Magento mi sono imbatto sul problema dei constraint del Database Mysql.
Il problema è nato perché dovevo cambiare un cavolo di attributo da semplice a multiplo visto che poi dovevo diventare un filtro sulla ricerca.
In maniera del tutto incosciente dico “ma che vuoi che sia !” e mi vado a cambiare a mano il record del database relativo all’attributo da singolo a multiplo ed il gioco è fatto!
Da qui le immagini dei prodotti sono scoppiate. Il risultato è stato molto semplice il database è completamente andato e non riuscivo più ad aggiornare i prodotti dal mio brillante CSV (con Magmi).
Da questo punto in poi il delirio più totale. Non avevo considerato che il database di Magento (maledetto lui) è pieno di constraint con referenze a 18 milioni di tabelle diverse.
Non me la prendo più di tanto (ho bestemmiato due giorni) e decido di cercare una soluzione:
- ricostruisco la relazione tra le tabelle
- uso il tool di Magento per verificare l’integrità del database che mi dice tutto OK
- a questo punto le mie immagini sono ancora tutte sbriciolate. Praticamente hanno perso i riferimenti al prodotto. CHE FARE?
Cerco online una soluzione valida e trovo uno script interessane di cui riporto il codice
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' => 4788));
$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());
if (count($items) > 0) {
foreach($items as $item) {
$mediaApi->remove($_product->getId(), $item['file']);
}
echo $product->getId() . " done \n";
} else {
echo $product->getId() . " has no images \n";
}
}
Purtroppo lo script funziona a metà visto che agiste sui prodotti e sulle immagini collegate, in realtà le mie immagini sono molte di più e quindi mi trovo anche dopo la pulizia di avere un interfaccia di gestione dei prodotti corretta ma un database pieno di collegamenti ad immagini ormai obsolete.
A questo punto senza ormai soluzioni valide da parte degli sviluppatori di Magento ed avendone provate diverse decido di agire in maniera brusca:
- mi faccio un bel backup del database
- faccio un bel DELETE delle tabelle catalog_product_entity_media_gallery , catalog_product_entity_gallery, catalog_product_entity_media_gallery_value (visto che con i COSTRAINT un truncate è impossibile )
- faccio il mio import delle immagini con MAGMI e tutto è magicamente risolto