Magento2 Module mit Konfigurationen verlinken

In der Regel werden Magento® 2 Module mit einer ./etc/adminhtml/system.xml Datei implementiert, welche dazu dient, zusätzliche Konfigurationen unter Stores > Configuration zur Verfügung zu stellen um diverse Funktionen im konfigurierbar zu machen.

Magento System Configuration

Allerdings ist es nicht immer offensichtlich, wo diese zu finden sind. Es kommt vor, dass man solche Einstellungen erst nach Minuten unter Stores > Configuration findet, was unter umständen frustrierend sein kann. Darum möchte ich gerne meine Lösung teilen, welche ich inzwischen in jedem meiner Module implementiere und welche aus meiner Sicht durch jedem Backend-Entwickler in wenigen Minuten implementiert werden kann.

XML Layout

Zuerst muss eine existierende Layout Datei ( zum Beispiel ./view/adminhtml/layout/namespace_module_custom_index.xml ) ergänzt werden.

Innerhalb des Reference Containers content muss folgender Block platziert werden.

Wichtig hier ist die Referenz zum Template Namespace_Module::info.phtml welche im nächsten Schritt genauer erklärt wird.

Template

Die Referenz Namespace_Module::info.phtml im folgenden Block erwartet eine info.phtml Datei im Verzeichnis ./view/adminhtml/templates/ welche lediglich folgenden HTML Code enthalten sollte.

Der Link-Text sowie der Parameter für getUrl muss natürlich noch geändert werden. Mein Beispiel zeigt auf Stores > Configuration > Advanced > Admin.

Magenizr AdminUser Info Block

Cheers

Checkbox aus UI Component Listing in Magento2 entfernen

In der Regel werden UI Component Listings mit MassActions und Checkboxen erstellt, so dass in der Übersicht mehrere Elemente mit einer Aktion ( massAction ) gelöscht werden können.

Magento UI Component Listing Checkbox

In einigen Fällen braucht es diese Funktion jedoch nicht. Zum Beispiel wenn Datensätze nur hinzugefügt oder geändert werden sollen können, und/oder das Löschen von Datensätzen nur in der Detailansicht möglich sein soll.

Um die oben gezeigte Checkbox zu entfernen muss die XML Datei geöffnet werden, welche das für das neue Listing zuständig ist. Zum Beispiel:

In dieser Datei sollte sich die XML Node selectionColumn befinden, welche ohne weiteres entfernt werden kann.

An der Stelle genügt es den Magento cache zu leeren um die Änderungen zu sehen.

Magento UI Component Listing Checkbox Entfernt

PayPal Express Checkout und Unable to Place the order

Ich habe schon einige Probleme mit PayPal und Magento gelöst, aber folgendes war neu. Kunden konnten vom Warenkorb aus über den Check out with PayPal Button ganz normal die Bezahlung vornehmen. Nach erfolgreicher Bezahlung wurde jedoch die Fehlermeldung ” Unable to Place the order ” angezeigt und die Bestellung unterbrochen. Einige Kunden dachten etwas während der Bestellung falsch gemacht zu haben, und versuchten es gleich noch einmal. Nun wurde die Fehlermeldung ” Transaction refused because of an invalid argument. A successful transaction has already been completed for this token. ” angezeigt.

Kurz, beim ersten Versuch wurde das PayPal Konto bzw. die Kreditkarte des Kunden bereits belastet. Darum konnte beim zweiten Versuch die Transaction nicht noch einmal vorgenommen werden. Hinzu kam, dass trotz korrekten IPN Response im Backend keine Bestellung erstellt wurde. Der Grund war folgender:

Bei solchen Fehlermeldungen lohnt es sich immer einen Blick in die EAV tables zu werfen. In meinem Fall wurde aus irgendeinem Grund die increment_last_id vom Typ sales/order_invoice geändert.

Die Länge der ID wird zudem in entity_model festgelegt, was in meinem Fall nicht übereinstimmte.

Da es keinen Grund gab die länge der Rechnungs Nummer zu ändern, habe ich diese wieder “recovered”.

Da ich zu diesem Zeitpunkt nicht wusste, wie viele Bestellungen schon vorgenommen wurden, habe ich ausserdem increment_prefix auf 2 gesetzt, einfach um sicher zu gehen, dass es keine weiteren Konflikte gibt. Vermutlich hätte ich auch die Rechnungsnummer einfach auf 100001000 setzen können, denn so viele Bestellungen sind definitiv nicht eingegangen.

Wie auch immer, das Problem mit den PayPal Express Bezahlungen wurde damit gelöst und funktioniert auch zwei Wochen nach dem Change noch.

Template Variable Image und Media Sources

Neben der Standard Media Resource Filesystem habe ich für die Rolle Content Editor eine isolierte Media Resource Catalog erstellt, so dass Editoren keinen Zugriff auf die gesamte Dateistruktur von MODx haben, sondern nur auf das Verzeichnis data/catalog/*.

Heute habe ich eine neue Template Variable vom Typ Image für ein Portrait erstellt, um Bilddateien aus dem Verzeichnis data/catalog/* auswählen zu können, jedoch hatte ich keine Möglichkeit das Bild zu ändern oder ein neues auszuwählen.

MODx Template Variable Access Media
MODx Template Variable Access Media

Um das Problem zu lösen, habe ich die Template Variable als Administrator editiert, und im letzten Reiter Media Sources den Source geändert.

MODx Template Variable Image Source
MODx Template Variable Image Source

Nun habe ich Zugriff auf alle Dateien im Verzeichnis data/catalog/*.

MODx Template Variable Access Media
MODx Template Variable Access Media

Magento 2 – Installieren

Magento 2 - Installation - Featured

In diesem Artikel erkläre ich Schritt für Schritt, wie du Magento 2 unter Ubuntu mit Hilfe von Git und Composer installieren kannst.

1. Systemvoraussetzungen

Zunächst musst du überprüfen ob auf deiner Entwicklungsumgebung mindestens Apache Version 2.2 oder höher verwendet wird.

Du solltest ebenfalls mindestens PHP Version 5.5.x verwenden.

Magento 2 setzt zudem mindestens MySQL Version 5.6 voraus. Falls deine Version kleiner ist, wirst du im Magento 2 Installer Probleme haben.

Informiere dich allenfalls selbst wie du dein System mit apt-get update und upgrade aktualisieren kannst.

2. Vorbereitungen

Für die Installation muss einiges vorbereitet werden.

2.1 Composer

Die Installation von Magento 2 wird mit Composer vorgenommen. Es vereinfacht den gesamten Installationsprozess um einiges und stellt sicher, dass am während oder am Ende keine Pakete fehlen. Falls du bisher noch nicht mit Composer gearbeitet hast, wirst du jetzt quasi dazu gezwungen damit anzufangen. Überprüfe kurz ob Composer korrekt installiert ist, bevor du zum nächsten Schritt übergehst.

Falls Composer nicht installiert ist, kannst du dies mit apt-get nachholen.

2.2 Git

Für die nächsten Schritte als auch in Zukunft musst du mit Git arbeiten. Keine Sorge, falls du bisher noch nicht mit Git gearbeitet hast. Für die Magento 2 Installation must du nur einen Befehl ausführen, ohne Vorkenntnisse zu haben. Falls Git nicht installiert ist, kannst du dies mit apt-get install git nachholen.

Für einen Personal Access Token, den du später in die Datei auth.json einfügen musst, brauchst du zudem einen kostenlosen GitHub Account den du unter https://github.com/join erstellen kannst.

2.1.1 Personal Access Token

Einen Personal Access Token bei GitHub zu erstellen ist recht einfach. Gehe dazu einfach in den Bereich Settings deines Profils und öffne anschliessend den Tab Personal Access Tokens auf der linken Seite.

GitHub - Einstellungen aufrufen
GitHub – Einstellungen aufrufen

Dort klickst du auf den Link Generate a personal access token. Auf der nächsten Ansicht definierst du eine kurze Beschreibung ( z.b Magento 2 ) und erstellst den neuen Token mit den vorausgewählten Scopes.

GitHub - Neuen Token erstellen und Scopes auswählen
GitHub – Neuen Token erstellen und Scopes auswählen

Auf der nachfolgenden Seite wird dir der Token nur einmal angezeigt. Diesen musst du also kopieren und sicher aufbewahren.

GitHub - Neuen Token jetzt kopieren
GitHub – Neuen Token jetzt kopieren

2.2 Magento Connect

Du brauchst zudem einen kostenlosen Account auf Magento Connect um dort einen Sicherheitsschlüssel für die Magento 2 Installation zu generieren. Das ganze hört sich komplizierter an als es tatsächlich ist.

  • Log dich auf Magento Connect ein.
  • Klicke auf My Account oben rechts.
  • Auf der linken Seite öffne den Tab Developers.
  • Klicke auf den Link Secure Keys.
  • Erstelle einen neuen Key und verwende als Name zum Beispiel den Namen deines Kunden.
  • Dort wo vorher ” There are no Secure Keys … ” zu sehen war solltest du nun einen Public Key und einen Private Key sehen.
Magento Connect - Neuen Secure Key erstellen
Magento Connect – Neuen Secure Key erstellen

2.3 Benutzer und Berechtigungen

Hin und wieder passiert es, dass Dateien für die Konfiguration ( z.b Auth.json, local.xml oder andere Dateien ) mit dem User root kopiert oder entpackt werden, der Webserver welcher mit dem User apache oder www-data läuft, darauf jedoch keinen Zugriff hat. Das Resultat ist oft ein Installationsprozess welcher mittendrin mit einer Exception abbricht. Um solche Probleme hier zu vermeiden, erstellst du einen neuen SSH Account und verknüpfst diesen mit der Gruppe vom Apache.

2.3.1 Benutzer erstellen

Log dich zunächst mit SSH auf deine Entwicklungsumgebung ein. Entweder mit root oder einem anderen Benutzer der dir erlaubt mit super-user rechten zu arbeiten.

Nun erstellst du den neuen Benutzer. In diesem Fall passt magento_user ganz gut.

Du wirst im Anschluss aufgefordert ein Passwort für diesen Benutzer zu erstellen. Für die Entwicklungsumgebung genügt ein einfaches Passwort.

Jetzt musst du den neuen Benutzer magento_user in die Gruppe hinzufügen, welche von Apache verwendet wird. In den meisten Fällen ist es www-data, was aber je nach Linux Distribution anders sein kann.

Füge nun den Benutzer magento_user in die Gruppe von www-data hinzu.

Überprüfe anschliessend ob die Gruppeneinstellungen für den Benutzer magento_user korrekt übernommen wurden.

Zum Schluss musst du den Webserver einmal neu starten.

Du kannst dich nun als magento_user einloggen und mit den nächsten Schritten weiterfahren.

2.4 Dateisystem

Wenn wir gerade beim Thema Berechtigung sind, kannst du gleich die Berechtigungen für Dateien und Verzeichnisse korrekt setzen. Zuerst setzt du die Gruppe www-data.

Nun kannst du im gleichen Verzeichnis die Berechtigungen setzen. Verzeichnisse benötigen volle Berechtigung ( 770 ) ausschliesslich für den Besitzer. Für Dateien gilt, Lese und Schreibberechtigung für den Besitzer und die Gruppe, und keine Berechtigung für andere.

2.5 Auth.json

Einloggt als magento_user erstellst du nun die Datei auth.json im Home Verzeichnis.

In der Datei auth.json fügst du folgende JSON Konfiguration ein.

3. Installation durchführen

Gehe nun in dein Hauptverzeichnis, für das ein VirtualHost existiert und welches über den Browser aufrufbar ist.

3.1 Source klonen

Starte git clone und warte bis der Source fertig geladen ist.

In meinem Beispiel verwende ich -b 2.0 um den Source aus dem Release Branch zu kopieren. Ohne -b 2.0 wird der Source vom Develop Branch heruntergeladen welcher evt. noch untested Code enthält.

3.2 Installation starten

Nun kannst du mit der Installation beginnen. Bitte stelle sicher, dass du weiterhin als magento_user eingeloggt bist um Berechtigungsprobleme zu vermeiden.

Composer wird Anhand der von Magento 2 mitgelieferten Datei composer.json diverse Abhängigkeiten überprüfen und gegebenenfalls die Installation mit detaillierten Fehlermeldungen abbrechen. Es lohnt zudem einen Blick in die Datei composer.json zu werfen um zu verstehen, was wahrend der Installation passiert.

Hier ein Beispiel für eine Fehlermeldung.

Je nach Server Setup kann es also sein, dass diverse PHP Erweiterungen manuell nachinstalliert werden müssen. Sind alle Abhängigkeiten auf dem Server installiert, kann die Installation mit dem Composer wiederholt werden. Die Installation sollte mit Generating autoload_files Erfolgreich enden.

3.3 Setup starten

Um mit dem Setup zu beginnen, musst du nun die URL in deinem Browser aufrufen welche im VirtualHost definiert ist. Du solltest folgenden Screen sehen. Klicke auf Agree and Setup Magento um mit dem Installer fortzufahren.

Magento - Setup
Magento – Setup

3.3.1 Installer

Im Magento 2 Installer wird unter anderem die Datenbank hinzugefügt, sowie einige Standard Konfigurationen vorgenommen.

Magento 2 - Installer
Magento 2 – Installer

3.3.2 Readiness Check

Mit dem Readiness Check überprüft Magento 2 nochmals ob alle nötigen Erweiterungen installiert sind. Du solltest nur fortfahren wenn der Readiness Check erfolgreich ist.

Magento 2 - Installer Readiness Check
Magento 2 – Installer Readiness Check

3.3.3 Add Database

Falls du für deinen VirtualHost noch keine Datenbank erstellt hast, kannst du dies hier kurz nachholen.

Im folgendem Beispiel erstelle ich nur einen neuen Benutzer mit allen Berechtigungen sowie eine Date

Anschliessend kannst du den neuen Benutzer

Magento 2 - Installer - Add Database
Magento 2 – Installer – Add Database

3.3.4 Web Configuration

In diesem Schritt wird die BaseURL sowie der Pfad zum Admin Panel festgelegt.

3.3.5 Customize Your Store

Hier kannst du die Standard Zeitzone, Währung sowie Sprache festlegen. Falls du dir nicht sicher bist, kannst du einfach fortfahren und die Anpassungen später vornehmen.

3.3.6 Create Admin Account

Erstelle einen Admin Account und stelle sicher, dass du das Passwort in Zukunft auch nicht vergisst.

3.3.6 Install

You’re ready! Super, du kannst nun mit der Installation fortfahren. Warte bitte bis die Installation abgeschlossen ist. Wird die Installation erfolgreich abgeschlossen, bekommst du im Anschluss eine Zusammenfassung. Dieses solltest du dir wenn möglich als PDF drucken, oder zumindest solltest du den Encryption Key sicher ablegen.

Magento 2 - Installer - Success
Magento 2 – Installer – Success

Fehlermeldungen, Verbesserungsvorschläge und Kritik bitte unten als Kommentar.

Magento und max_input_vars

Es gibt Tage als Magento Entwickler bei denen man einfach nur verzweifelt, und zwar dann, wenn man komplexe Produkte oder Kategorien erstellen möchte. In den letzten zwei Wochen habe ich mich gleich mit zwei solchen Problemen beschäftigt, bei denen leider keine Fehlermeldung (system.log, exception.log etc.) zu sehen war welche zumindest ein bisschen weiterhelfen würde. Konkret geht es um die Standardeinstellung in der php.ini.

Diese Standardeinstellung führt dazu, dass komplexe Formulare im Admin Panel zwar Erfolgreich abgeschickt werden können, jedoch nicht alles vom Server akzeptiert wird. Will man also Kategorien mit mehr als 1000 Produkten speichern oder 100 bis 150 Bundle Items zu einem Bundle Produkt hinzufügen, gibt es hier möglicherweise Probleme.

Das Problem kann gelöst werden indem man den Wert für max_input_vars in der php.ini oder in der .htaccess auf 2000 oder mehr erhöht, aber nicht unbedingt mehr als benötigt.

Das ganze kann man mit LocationMatch auf das Admin Panel beschränken.

Malware in Bilddateien finden

Maleware Inside Image Exif Header

Es ist ein Alptraum. Die Liveumgebung deines Kunden wurde gehackt und du weisst nicht, wie genau und welche Daten gestolen wurden. Schnell muss also untersucht werden, wo die Schwachstelle liegt um solche Angriffe in Zukunft besser abzufangen. Natürlich gibt es verschiedene Wege sich Zugang zu einer Liveumgebung zu verschaffen. In diesem Post möchte ich nur kurz darauf eingehen, wie mittels Bilddateien beliebiger Code eingeschleust werden kann.

Wie auf Snapfast und Sucuri beschrieben, kann beliebiger Code in EXIF von Bilddateien untergebracht werden. Oft genügt schon ein einfaches Script um einen neuen Administrator account zu erstellen. Alles weitere passiert dann im Hintergrund, oft unerkannt.

Leider hilft ein svn status oder git status nicht um geänderte Dateien zu erkennen, denn oft sind Verzeichnisse wie /media/ nicht versioniert.

Hier ein einfacher Befehl wie du solche Bilddateien mit “find” aufspüren kannst.

Sollten Dateien auf dem Produktivsystem infiziert sein, bekommst du folgendes Suchergebnis.

5 praktische Beispiel für die tägliche Arbeit mit Magento

1. Sicherung von media/catalog

So erstellst du eine Sicherung von media/catalog ohne dem /cache/ Verzeichnis.

Das gleiche mit dem aktuellen Datum im Dateinamen.

2. Dateien ohne Berechtigungen für Apache

So findest du Dateien welche nicht die nötigen Berechtigungen für Apache besitzen. Das macht Sinn wenn du Berechtigungsprobleme früh erkennen möchtest. Zum Beispiel Schreib- oder Leseberechtigungen bei Dateien oder Verzeichnissen für diverse Upload Funktionen.

3. SQL / CSV Dateien im Projektverzeichnis

Manchmal ist es keine gute Idee Datenbank Sicherungen oder andere exportierte Dateien mit sensiblen Informationen im Projektverzeichnis abzulegen. Je nach Sicherheitseinstellungen können solche Dateien von dritte heruntergeladen werden. Um mögliche Sicherungen auf dem Produktivsystem auffinden zu können, brauchst du nur ein einfachen ” find ” Befehl mit der Option ” iregex “.

4. Report Dateien der letzten 24 Stunden

Hier sind weitere Optionen fuer ” -ctime “.

5. Logdateien leeren

Schnell wachsende Logdateien wie system.log oder exception.log können eine Ursache für einen Serverausfall sein. Mit Hilfe von ” truncate ” kannst du log Dateien ohne Risiko auf deinem Produktivsystem leeren.

Wenn du nicht alles entfernen möchtest, kannst du auch einen Teil für die Fehlersuche behalten.

Praktische Beispiele für deine Magento Logdatei Analyse

Verbessere deine wöchentliche Logdatei Analyse mit ein paar einfachen ” grep ” Befehlen. Verwende diese vor jedem Rollout um sicher zu gehen, dass dein Code einwandfrei funktioniert und keine Fehlermeldungen generiert. Um bei grösseren Logdateien die Übersicht zu behalten, kannst du mit ” tail ” die letzten 1000 Zeilen überprüfen, oder zunächst einfach mit ” wc -l ” schauen wie hoch die Anzahl an Fehlermeldungen überhaupt ist.

Zähle die Resultate mit ” wc -l ” am Ende.

Zeige die letzten 1000 Zeilen von system.log mit ” tail -n 1000 ” an.

1. System.log

1.1 Zugriffe auf ein Array mit einem Key welcher nicht existiert

1.2 Zugriff auf eine Variable welche nicht definiert ist

1.3 Debug Ausgaben mit Mage::log() generiert

1.4 Diverse fehlgeschlagene Versuche eine Datei oder ein Verzeichnis zu erstellen oder manipulieren

1.5 Falsch definierte oder nicht existierende Template Dateien

1.6 Fehler bei Zugriff auf ein Objekt

1.7 Parameter an eine Funktion nicht korrekt übergeben

1.8 Ungültige Variable an eine Schleife übergeben

Alles mit einmal finden:

2. Exception.log

2.1 Generelle Probleme mit XML Dateien

2.2 Spezifische Probleme mit dem Authorize.net Gateway

2.3 Spezifische Probleme mit dem PayPal Gateway

2.4 Generelle Probleme mit CURL

Alle mit einmal finden:

3. Reports

Report Dateien auf der Konsole zu überprüfen ist mühsam. Mit den folgenden Befehlen kannst du schnell die neusten 10 Reports mit einmal durchsuchen.

3.1 MySQL Verbindungen

3.2 Invalid config field

3.3 Unable to read response

3.4 External urls redirect

Alle mit einmal finden:

4. Apache error logs

4.1 Fehlende Dateien im Projektverzeichnis

Geplante Tasks für Apache Benutzer einrichten

Geplante Tasks (Cron jobs) für PHP Applikationen sollten einem spezifischen Benutzer ohne root Berechtigungen zuordnet werden, also zum Beispiel www-data. So verhinderst du unter anderem, dass bei einem System Update die geplanten Tasks für root überschrieben werden.

1. Apache user suchen

Den Benutzer welcher von Apache verwendet wird, kannst du aus der Prozessliste entnehmen.

2. Tab editieren

Editiere den crontab mit der Option -u und dem Benutzer welcher von Apache verwendet wird. Dieser Befehlt erstellt eine Benutzerspezifische Datei in /var/spool/cron/crontabs/.

Füge deinen Cronjob ein und speichere alle Änderungen mit CTRL-O.

3. Syslog überprüfen

Anschliessend kannst du schauen ob dein Cronjob korrekt ausgeführt wird.