Warum man in Update Scripten keine Entitäten löscht!

Veröffentlicht am 27.07.2011 von datenbrille in der Schublade Magento, SQL | Comments Off

Ich habe mit einem neueren Release von meinen Shop auch mal die Datenbank aufgeräumt und überflüssige Kategorien und Attribute gelöscht. Was ich nicht wusste ist, das Magento bei jedem Script oder Durchgang die Foreign Key Contraints abschaltet.

Ich hatte mich bei der Entwicklung auch gefragt warum in Magento 1.5 es nicht mehr erlaubt ist Category zu löschen, wenn man nicht im Backend eingelogt ist. Gibt es da einen Zusammenhang? Ich weiß es leider nicht, aber vielleicht ihr.

Ich konnte das Problem auch nicht mit MySQL-Mitteln lösen.


Translations in der Datenbank und das gute alte Locale

Veröffentlicht am 27.07.2011 von datenbrille in der Schublade Magento, Upgrade | Comments Off

Kleiner Tipp bei der Migration von älteren Magento Versionen auf die Version 1.5.X.X. Die Translations werden nun aus der DB mit einem Locale Parameter geladen. Soweit kein Problem, solange das Locale zu den Übersetzungen passt. Bei mir war es leider nicht so.

Code aus Magento 1.5.1.0:

    protected function _loadDbTranslation($forceReload = false)
    {
        $arr = $this->getResource()->getTranslationArray(null, $this->getLocale());
        $this->_addData($arr, $this->getConfig(self::CONFIG_KEY_STORE), $forceReload);
        return $this;
    }

Code aus Magento 1.3.2.4. Man beachte den fehlenden Locale Parameter bei getTranslationArray().

    protected function _loadDbTranslation($forceReload = false)
    {
        $arr = $this->getResource()->getTranslationArray();
        $this->_addData($arr, $this->getConfig(self::CONFIG_KEY_STORE), $forceReload);
        return $this;
    }

Fehlende Tabellen nach Magento Upgrade nachrüsten.

Veröffentlicht am 04.07.2011 von datenbrille in der Schublade Magento, Upgrade | Tags: | Comments Off

Ich führe gerade ein Upgrade einer Magento 1.3 Installation auf die Version 1.5 durch. Dabei ist mir im System Log folgendes aufgefallen:

PHP Fatal error:  Uncaught exception ‘PDOException’ with message ‘SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘core_file_storage’ doesn’t exist’.

Nach ein wenig suchen im Magento Core ist mir aufgefallen, dass diese Tabellen “on the fly” anlegt werden. Jedoch nur wenn die Datenbank als Cache-Backend verwendet wird. Der Fehler hat bei mir nur das Log voll geschrieben. Der Shop war nicht beeinträchtigt.

Die Lösung ist folgender Schnippsel:

/** @var $model Mage_Core_Model_File_Storage_Directory_Database */
$model = Mage::getModel('core/file_storage_directory_database');
$model->prepareStorage();
/** @var $model Mage_Core_Model_File_Storage_Database */
$model = Mage::getModel('core/file_storage_database');
$model->prepareStorage();

Wichtig ist dabei die Reihenfolge! Die zweite Tabelle erstellt Foreign Keys auf die erste. Das ganze habe ich in ein Update Script eines der Module gepackt und nun werden sie einfach einmalig erstellt.


Unterschiedliche Toolbars in der Produktliste

Veröffentlicht am 22.08.2010 von jkuensebeck in der Schublade Magento-Templates | Tags: , | 2 Kommentare »

Das Problem

2 verschiedene Toolbars in Magento
Ich habe gerade dieses Design auf dem Tisch. Eine Produktliste, oben eine Toolbar mit Sortieroptionen, unten eine Toolbar mit Pager, bestimmt kein Problem: Die Template-Engine von Magento ist doch wie gemacht für so etwas.
zum kompletten Eintrag »


Model->load($id) vs. Model->getCollection()->getItemById($id)

Veröffentlicht am 20.08.2010 von jkuensebeck in der Schublade Magento | Tags: , , | Ein Kommentar »

Neulich bin ich in einer älteren Version einer in Deutschland sehr beliebten Extension über einen lustigen kleinen Performance-Killer gestolpert: Es sollte ein Quote-Object anhand der ID geladen werden, das sah im Code folgendermaßen aus:

$quote = Mage::getModel('sales/quote')->getCollection()->getItemById($quote_id);

harmlos, oder? Nein!

Diese eine Zeile brauchte ca. 30 Sekunden, und das auf einem wirklich performanten Kundenserver.
Wie kommt’s?
zum kompletten Eintrag »


Unübersetzte Strings finden

Veröffentlicht am 17.08.2010 von jkuensebeck in der Schublade Magento | Tags: , | Ein Kommentar »

Als dirty Hack einfach die Mage::log(…) Zeile zwischen DEN BEIDEN SCHREIENDEN KOMMENTAREN!!! in app/code/core/Mage/Core/Model/Translate.php einfügen:

/**
 * Return translated string from text.
 *
 * @param string $text
 * @param string $code
 * @return string
 */
 protected function _getTranslatedString($text, $code)
 {
   $translated = '';
   if (array_key_exists($code, $this->getData())) {
     $translated = $this->_data[$code];
   }
   elseif (array_key_exists($text, $this->getData())) {
     $translated = $this->_data[$text];
   }
   else {
     $translated = $text;
     // THE LINE THAT SAVES THE DAY FOLLOWS:
     Mage::log('UNTRANSLATED STRING: "'.$code.' - '.$text.'"');
     // THAT WAS THE LINE THAT SAVED THE DAY
   }
   return $translated;
}

und anschliessend sich die fehlenden Übersetzungen per

grep 'UNTRANSLATED STRING' var/log/system.log

anzeigen lassen.

Vielleicht gibt es das später auch noch mal in schön, mal sehen…


HOW-TO: Der Autovervollständigung auf die Sprünge helfen und die eigene Produktivität um ca. 170% steigern

Veröffentlicht am 17.08.2010 von jkuensebeck in der Schublade Magento, Magento-Templates | Tags: , , , | 2 Kommentare »

Da ich der Meinung bin, dass das Lesen von Dokumentationen Verschwendung meiner wertvollen Zeit ist, lasse ich das lieber von anderen erledigen, z.B. meiner IDE (d.h. momentan Netbeans, mit PDT für Eclipse funktioniert der ganze Spass aber genauso).

Die Autovervollständigung der IDE

Meistens funktioniert die Autovervollständigung bei der Magento-Entwicklung ja recht gut, wenn ich z.B. in einem eigenen Controller zum kompletten Eintrag »


Magento SQL Profiler

Veröffentlicht am 07.08.2010 von jkuensebeck in der Schublade Magento | Tags: , , , | Ein Kommentar »

Magento (bzw. wir das Zend-Framework) hat einen eingebauten SQL-Profiler im Gepäck, um diesen zu aktivieren einfach in der local.xml im Connection-Knoten folgende Zeile ergänzen:

<resources>
 <db>
 <table_prefix><![CDATA[]]></table_prefix>
 </db>
 <default_setup>
 <connection>
 <host><![CDATA[localhost]]></host>
 <username><![CDATA[root]]></username>
 <password><![CDATA[]]></password>
 <dbname><![CDATA[magento_test]]></dbname>
 <active>1</active>
 <profiler>1</profiler>
 </connection>
 </default_setup>
 </resources>

zum kompletten Eintrag »