Magento e constraint

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:

  1. ricostruisco la relazione tra le tabelle
  2. uso il tool di Magento per verificare l’integrità del database che mi dice tutto OK
  3. 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:

  1. mi faccio un bel backup del database
  2. 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 )
  3. faccio il mio import delle immagini con MAGMI e tutto è magicamente risolto