Magento: MySQL Debuggen

Magento: MySQL Debuggen

Magento hat zwar ein gutes Debugging System integriert, allerdings kommt es oft zu Problemen mit dem debugging von MySQL-Queries. Diese stellen einen zu langen String da und werden daher in der Fehlermeldung ab einer gewissen Länge einfach gekürzt. Oft kann man dann kaum noch sinnvolle Informationen aus der Fehlermeldung rauslesen, wie Beispielsweise hier: Aus dieser Fehlermeldung kann man zwar rauslesen, dass es ein Problem mit einem Primary Key gibt, nicht allerdings welche Tabelle das betrifft. Zum Glück haben die Magento Entwickler aber genau für diesen Fall vorgebaut und eine separate MySQL Debugging Funktion eingebaut. Diese kann in der Datei /lib/Varien/Db/Adapter/Pdo/Mysql.php aktiviert werden. Hierfür muss in der Zeile 103 (Version 1.7) die Variable $_debug auf true gesetzt werden: In früheren oder späteren Version kann die Zeile vielleicht etwas variieren, die Datei sollte aber bis zur Magento Version 2.0 die gleiche bleiben. Anschließend werden MySQL-Debug Informationen inklusive der kompletten MySQL-Queries in die Datei /var/debug/pdo_mysql.log geschrieben, wodurch man die Probleme besser verstehen und...
Magento Produkte ohne Bilder finden

Magento Produkte ohne Bilder finden

Wenn der Magento Shop erst einmal tausende von Produkte beinhaltet, ist es nicht leicht immer die Übersicht über alle Datenstände der Produkte zu behalten. „Bei welchem Produkt fehlt nochmal das Bild? Wo ist die Farbe noch nicht hinterlegt?“ sind häufige Fragen, welche sich die Online Shop Redaktion stellt. Früher oder später werden diese Fragen auch immer an den Technischen Betreuer weitergegeben. Wie so oft gibt es auch für dieses Problem in Magento verschiedene Lösungen. Die wohl einfachste Lösung dafür ist wohl diese paar Zeilen Code zu nehmen und in einer Datei auszuführen. Optional kann man hierfür auch noch einen Grid im Admin Backend anlegen, wodurch das ganze auch von den Mitarbeitern des Online Shops einfach und jederzeit verwaltet werden kann. Anschließend kann man die Collection entweder in einen Grid einbinden oder einfach in einem Template oder einem Controller (Achtung: unsauber!) ausgeben lassen. Update (30.5.2013): Da die oben genannte Lösung in verschiedenen Konstellationen nicht perfekt funktioniert, gibt es hier noch eine Erweiterte Version. Da bei verschiedenen Import Vorgängen der Wert ’no_selection‘ nicht richtig gesetzt wird, wird mithilfe dieses Snippets noch überprüft ob der Wert valide ist oder...
Magento: Alle Produkte aus der Datenbank löschen

Magento: Alle Produkte aus der Datenbank löschen

Besonders nach dem Testen eines Produktimport kann es sinnvoll sein, alle Produkte aus Magento zu entfernen. Im Magento Backend besteht hierfür die Möglichkeit, dass man alle Produkte (also auch mehr als die 200 maximal sichtbaren Produkte) löscht. Allerdings werden die meisten die Erfahrung gemacht haben, dass diese Funktion ab einer gewißen Anzahl von Produkten nicht mehr funktioniert oder sehr langsam ist. Auch werden hierbei die Produktnummern nicht zurückgesetzt, was zumindest manchmal eine Anforderung des Kunden sein kann. Einfacher und schneller geht das ganze mit einem MySQL-Query (falls MySQL als Datenbank verwendet wird): Dabei werden allerdings nur die Produkte inkl. den jeweiligen Attribut Values gelöscht. Es werden keine Attribute oder Kategorien gelöscht. Falls es anschließend Probleme mit der Indexierung gibt, muss man die Flat Tables einfach einmal manuell per Hand in phpMyAdmin...
Magento: Google Webfonts über layout Dateien einbinden

Magento: Google Webfonts über layout Dateien einbinden

  Schriften über die Google Webfonts einzubinden gehört mittlerweile fast zum guten Ton. Es ergeben sich dadurch verschiedene Vorteile: Man hat keine Probleme mit dem Copyright der Schriften. Das Einbinden ist sehr einfach und problemlos Es ist zwar, dank CSS, mittlerweile problemlos möglich die Schriften selbst zu hosten und einzubinden, allerdings darf man sich zu recht die Frage stellen: Warum sollte man sich den Stress antun? Bei über 600 Schriften die bei den Google Webfonts zur Zeit gehostet werden, dürfte sicherlich für fast jeden etwas dabei sein. In Magento ergeben sich mit den Google Webfonts allerdings verschiedene Probleme. CSS Dateien werden normalerweise nur über layout Dateien eingebunden. Das hat in sehr vielen Fällen Vorteile, in diesem Fall gestaltet sich das einbinden der Google Webfonts dann allerdings etwas schwieriger. In Foren hab ich daher bereits gelesen, dass man den CSS Link einfach in die page/html/head.phtml Template Datei einbinden soll. Das ist allerdings nicht sauber und sollte daher nur in Ausnahmefällen gemacht werden. Doch es gibt noch eine andere Möglichkeit – das einbinden über einen core/text Block: Auf diesem Weg ist es auch weiterhin möglich, die CSS Datei nur auf bestimmten Seiten einzubinden. Zum Beispiel wenn man die Schriften nur im Checkout Bereich...
Magento: Statischen Block ausgeben

Magento: Statischen Block ausgeben

Eine große Stärke von Magento ist die Flexibilität. Diese Flexibilität wird unter anderem auch von dem Block / Page Konzept gewährleistet. Dadurch ist es möglich bestimmte Content Blöcke auf der Seite immer wieder zu verwenden. Super ausspielen kann Magento diesen Trumpf bei einem Impressum oder den AGB. Das Impressum muss bei einem (deutschen) Shop sehr oft angezeigt werden – ob in den Transaktionsemails oder auf der Webseite. Hier ist es natürlich angenehm, wenn man vVeränderungen nur an einer Stelle im System ausführen muss. Es gibt in Magento verschiedene Möglichkeiten diesen Block dann auf einer Seite oder in einer Email wieder auszugeben. Hier will ich die wichtigsten auflisten. Per PHP Blöcke kann man per PHP direkt im Template ausgeben. Es ist dabei auch möglich den Title und den Content seperat auszugeben. In diesem Beispiel wird der Block mit dem code footer_links ausgegeben. Auf diese Art und Weise wird allerdings nur der Content des Blocks ausgegeben. Um auch den Title auszugeben, sollte man darüber noch folgenden Code einfügen: Durch den Aufruf des Models cms/block kann der Code nicht nur in Templates, sondern auch in Modul Blöcken verwendet werden. Allerdings sollte man versuchen das zu vermeiden, da es kein sauberer Programmierstil ist. In den Template selbst kann man den Aufruf des Models auch durch ein $this ersetzen.  Per XML Statische Blöcke können auch mit den Layout XML Dateien auf einer Seite eingebunden werden. Sinnvoll ist das vor allem bei statischen Blöcken, welche fest im Design verankert sind und trotzdem von Admins gepflegt werden sollen. Eingebunden werden die Statischen Blöcke so: Auch in diesem Beispiel muss der Block Code footer_links durch einen anderen...
Magento: Text kürzen / abschneiden

Magento: Text kürzen / abschneiden

Oftmals kriegt man als Entwickler ein Design vorgesetzt, das nicht skalierbar ist. Das Design schreibt also für manche Bereiche eine bestimmte Höhe vor, auch wenn der Content darin mehr Platz bräuchte. Hier bietet es sich dann meistens an den String mit PHP zu kürzen und anschließend auf den vollständigen Text zu verlinken. In Magento gibt es hier auch eine spezielle Funktion, namens truncate. Aufrufen kann man diese Funktion folgendermaßen: Hierbei wird in der Variable $string der auszugebende Content übergeben und via $length die Länge des neuen Strings...
Magento Skin Url in CMS Blöcken und Pages verwenden

Magento Skin Url in CMS Blöcken und Pages verwenden

In Magento Templates ist es ja üblich anstatt relativer Pfade absolute Pfade mithilfe der Methode zu verwenden. Obwohl diese Funktion auch in CMS Pages und CMS Blöcken zur Verfügung steht, wird diese dort kaum verwendet. Spätestens beim nächsten Domain-Umzug oder beim Einsatz eines Content Delivery Networks ist man dann aber froh über den Einsatz dieser Funktion. In den CMS Blöcken und Pages können absolute Pfade zu Bildern mit dem folgenden Code erstellt werden: Um Bilder einzubinden muss also folgender Code eingebunden werden:...
Fatal error: Allowed memory size of 104857600 bytes exhausted

Fatal error: Allowed memory size of 104857600 bytes exhausted

Jeder der mit PHP experimentiert hat, dürfte diese Fehlermeldung schon mal erhalten haben: Der Fehler deutet darauf hin, dass eine Operation in dem abgebrochenen Skript sehr viel Speicherplatz benötigt. Allerdings gibt es bei den meisten Servern und PHP-Installationen ein Memory Limit von 32MB oder mehr. Falls man vollen Zugriff auf dem Server hat kann man das Memory Limit in der php.ini verändern. Speziell bei Shared Webspace oder Managed Servern hat man allerdings meistens keinen Zugriff auf die php.ini und muss sich daher mit anderen Mitteln weiterhelfen. Eines davon ist das php Memory Limit mittels ini_set zu erhöhen. Voraussetzung hierfür ist allerdings, dass diese Funktion auf dem Server freigeschalten ist. Mithilfe dieses Code Snippets wird das Memory Limit auf 200 MB erhöht. Mit der selben Funktion kann man das Memory Limit auch komplett deaktiveren: Durch das deaktivieren des Memory Limits kann fehlerhafter Code die Erreichbarkeit des Servers beinträchtigen. Daher sollte diese Funktion mit großer Vorsicht verwendet...
Ordner Rekursiv via FTP mit wget in der Shell runterladen

Ordner Rekursiv via FTP mit wget in der Shell runterladen

Der Linux eigene FTP-Client ist leider nicht immer benutzbar. So kann man damit zwar schnell Dateien irgendwo hochladen oder herunterladen, allerdings (meines Wissens nach) keine kompletten Ordner herunterladen. Abhilfe schafft hier das allseits beliebte wget. Dadurch ist es möglich die Ordner Rekursiv herunterzuladen. Anbei ein Shell Snippet: Die Parameter USERNAME und PASSWORD sind hierbei natürlich zu ersetzen. Auch den FTP-Server und das Zielverzeichnis müsste man an den eigenen Server...
Tabellennamen in Magento mit Table Prefix ausgeben

Tabellennamen in Magento mit Table Prefix ausgeben

Magento bietet die Möglichkeit Installationen mit Table Prefix auszuführen. Das bedeutet, dass jede Tabelle vor ihrem eigentlichen Namen einen Prefix im Namen trägt. Damit trotzdem alle Module funktionieren, sollte man beim Programmieren stets darauf achten, dass man Tabellennamen nicht hardcoded in die PHP Dateien schreibt. Hierfür sollte man diese Funktion verwenden:...