Pimcore 6

Seit dem 13. Juni 2019 existiert die neue finale Pimcore Major Version 6. Dabei wurde der Technologie-Stack aktualisiert und das Symfony Framework wurde auf Version 4 aktualisiert. Zu den Highlights gehört das überarbeitete User-Interface. Es wurde vor allem an der Übersichtlichkeit der GUI gearbeitet. Ferner kann man jetzt die gesamte UTF-8 Bandbreite an Zeichen verwenden.

Eine Liste aller Anpassungen und Neuerungen findet ihr hier:
Pimcore 6: Digital Experience Management Rethought

Update von Version 5 auf 6

Aktuell gibt es leider noch keine offizielle Upgrade Anleitung oder auch einen fertigen Docker Container für Pimcore 6.

Pimcore Tutorial Teil 1b: Installation via Composer

Heute beschreibe ich eine alternative Installation von Pimcore, nämlich mit Composer.

 

Für Ubuntu geht ihr hier folgendermaßen vor:

Installation von Composer

Schritt 1:

Ihr aktualisiert den Paket-Manager:

Anschließend installiert ihr mit apt-get install folgende Pakete:

Je nach verwendeter PHP Version kann die Zeile auch folgendermaßen aussehen, wobei die statt der 7.2 dort auch 7.1 oder irgendeine andere 7er Versionsnummer stehen kann:

Jetzt habt ihr Voraussetzungen erfüllt, um Composer auf eurem System zu installieren, daher können wir nun mit Schritt 2 fortfahren.

Schritt 2: 

Ihr wechselt in euer Home-Verzeichnis und installiert anschließend Composer mit folgenden zwei Befehlen:

Anschließend könnt ihr die Installation mit einem kleinen Script in der Kommandozeile (Bash) überprüfen, wobei ihr den aktuellen SHA-384 Wert (Installer Signature) von der Composer Seite verwenden und entsprechend im folgenden Skript austauschen solltet:

In der Regel bekommt ihr eine Erfolgsmeldung zurück.

Installer verified 

Ihr könnt Composer auch global auf dem System installieren. Dazu gebt ihr in die Shell folgendes ein:

Das installiert Composer für alle Benutzer auf eurem System unter /usr/local/bin. Ihr erhaltet in etwa folgende Ausgabe nach der Installation:

Jetzt könnt ihr eure Composer Installation testen:

Danach erhaltet ihr folgende Ausgabe:

Nun könnt ihr Composer auf eurem System einsetzen.

IP-Sperren für bestimmte (Drupal-)Verzeichnisse in der .htaccess

Um Content-Management-Systeme wie Drupal abzusichern, macht es Sinn, dass Backend zur Pflege und Verwaltung nur bestimmten IP-Bereichen zugänglich zu machen. Eine Möglichkeit für jedes nahezu jedes CMS besteht darin, dies über die Apache-Konfiguration in der .htaccess durchzuführen, sofern das Apache-Modul mod-rewrite aktiviert ist. Wir leiten jede nicht zulässige IP-Adresse auf eine Fehlerseite (403) weiter. Ich zeige das hier mal an einem Beispiel für Drupal 7 und einer aktuellen Apache-Version (>2.4.x):

Seit der Apache 2.4 Version kann man für größere IP-Bereiche die CIDR  Schreibweise verwenden. Eine Seite zur Berechnung der IP-Bereiche findet man unter mxtoolbox oder jodies, letzterer sieht ein wenig altbacken, dafür aber übersichtlicher aus.

Befindet sich auf dem Server noch eine ältere Apache Version, z. B. 2.2.x, dann könnt ihr die RewriteCond expr so nicht verwenden. In diesem Fall sieht die Konfiguration folgendermaßen aus:

Und dann existiert noch ein Sonderfall, der ab und an bei größeren Server-Farmen, gerade bei größeren Firmen vorkommen kann, die Seiten werden über einen Proxy-Server aufgerufen und die Remote-IP Adresse (%{REMOTE_ADDR}) ist deshalb für alle Besucher die selbe. In diesem Fall muss man die X-FORWARDED-FOR Server-Variable abrufen. Das Beispiel sieht dann folgendermaßen aus (Apache > 2.4.x):

Und für den Apache bis 2.2.x:

Gerade die beiden letzten Beispiele haben mir bei einigen Server-Konfigurationen etwas Kopfzerbrechen bereitet. Ich hoffe, es hilft dem einen oder anderen weiter.

Pimcore Tutorial Teil 1a: Installation

Ich überlege schon seit längerem, ein mehrteiliges Pimcore Tutorial zu schreiben. Und jetzt ergibt sich vielleicht der passende Zeitrahmen.

Pimcore ist ein CMS, Rapid Development Tool, Asset Management, PIM und noch einiges mehr, basierend auf PHP. In älteren Versionen (bis Pimcore 4) basierte es noch auf dem Zend Framework (ZF Version 1.x). Seit Pimcore 5 bildet Symfony 2 die Basis, wobei es einen Backport für alte ZF basierte Module bietet. Pimcore wurde ursprünglich von der österreichischen Agentur Elements.at entwickelt. Für die weitere Entwicklung wurde das aber in ein eigenes Unternehmen ausgelagert, die Pimcore GmbH, welche ebenfalls in Salzburg, Österreich ansäßig ist.

Nun aber zum eigentlichen Thema, der Erstellung eines Projekts mit Pimcore (Version 5).

Wie bei jedem neuen Projekt steht zuerst die Installation, und darum soll es heute gehen.

Pimcore benötigt neben einem PHP-fähigen Webspace noch eine MySQL Datenbank (oder MariaDB). Die Datenbank muss das Charset utf8mb4 haben.

Pimcore bietet mehrere Möglichkeiten zur Installation. Zum einen kann man es über die Kommandozeile installieren, sofern man über einen SSH-Zugang verfügt. Dann kann man im entsprechenden Ordner, z. B. /var/www/projekt/web, das Paket herunterladen und entpacken.

Falls man als root angemeldet ist, sollte man, bevor man irgendetwas installiert, zum User mit entsprechenden Zugriffsrechten für das Webverzeichnis wechseln, z. B. www-data.

Wechsel ins Installationsverzeichnis:

Anschließend wird Pimcore herunter geladen und im Verzeichnis entpackt:

Das Pimcore-Archiv kann nun wieder entfernt werden. Es wird nicht länger benötigt.

Falls der Shell-Zugriff nicht ohne weiteres möglich ist, ist es alternativ natürlich auch möglich, sich das Pimcore-Paket unter https://pimcore.com/en/download herunterzuladen, lokal zu entpacken und via FTP auf den Server zu kopieren (beim lokalen Arbeiten natürlich in das Verzeichnis des Webservers). Hierbei ist lediglich zu achten, dass Pimcore außerhalb des Webroot installiert werden darf, da der web Ordner im Pimcore-Paket das eigentliche Webroot-Verzeichnis wird.

Jetzt hat man einige neue Ordner und Dateien in seinem Installationsverzeichnis. Der document root des vhost sollte auf den neu erstellten Ordner web im Installationsverzeichnis zeigen.

Pimcore InstallationsformularJetzt könnt ihr die Seite unter der konfigurieren URL aufrufen, z. B. localhost. Abschließend müsst ihr die Angaben zur Datenbank machen und der Pimcore Installer erledigt den Rest. Ihr könnt bei der Installation noch zwischen verschiedenen Profilen wählen, einem fertigen System mit Beispiel-Daten zu Objekten und Templates (mit oder ohne Twig) oder einem komplett leeren Pimcore-Projekt.

Danach könnt ihr euch unter der URL http://localhost/admin/login mit eurem gewählten Passwort in das Backend einloggen und euch mit den verschiedenen Optionen vertraut machen.

Im nächsten Beitrag beschreibe ich eine alternative Installations-Methode über Composer, da das mittlerweile bei größeren Projekten zum Standard geworden ist.

 

Anzeigen von verwandten Taxonomy-Begriffen des angezeigten Nodes in View Filter

Letztens musste ich für eine Produkt-Detailseite alle verwandten Produkte in einer Blockview anhand bestimmter Taxonomien anzeigen. Nun kann man sich bei Drupal schnell in eine Sackgassen konfigurieren und man möchte frustriert aufgeben, oder den Umweg über eine programmatische Lösung gehen, denn zu zahlreich sind die Einstellungsmöglichkeiten, gerade im Views-Modul.

Es gibt hierfür eine Lösung, sich entsprechendes Verhalten im Backend zusammen zu klicken, wenn man sich durch das Wording in Drupal nicht verwirren läßt.

Und so geht´s:

1. Fügt eine Relationship zu eurer View hinzu: „Content. Taxonomy terms on node
2. Fügt einen Context-Filter hinzu: „Taxonomy Term: Term ID

Die Einstellungen für die Relationship sind noch eindeutig. Hier wählt man die Taxonomie aus, welche die entsprechende Relation hat, z. B. „Main Category“.

Jetzt kommt der vielleicht verwirrende Part, da Drupal im Wording beim Context-Filter von einem URL-Parameter ausgeht, wir den Parameter aber gar nicht über die URL mitgeben, sondern ihn über die entsprechende Relation bereitstellen.

Man nimmt folgende Einstellungen im Context-Filter vor:

  1. Auswählen des „Provide default value“ Radio-Buttons.
  2. Beim Drop-Down-Feld „Type“ wählt ihr „Taxonomy term ID from URL“ aus (obwohl wir gar nichts über die URL übertragen und das kann durchaus für Verwirrung sorgen, wenn man sich durch die Einstellungen klickt).
  3. Auswählen von „Load default filter from node page„.
  4. Auswählen von „Limit terms by vocabulary„.
  5. Auswahl der Taxonomy Vokabeln, die ihr zur Filterung benötigt.

Das war´s, jetzt solltet ihr in der View, z. B. einen Block, alle Produkte sehen, die mit der aktuellen Seite in Relation stehen.

Pimcore Tutorials

Ich finde, es gibt derzeit immer noch viel zu wenige Tutorials zu Pimcore, welches es mittlerweile schon in Version 4 gibt. Dabei handelt es sich hierbei für mich immer noch um das eleganteste CMS auf PHP-Basis. Auch wenn das dahinter liegende Zend Framework immer noch in Version 1 dahin vegetiert, eine Portierung auf Version 2 ist einfach zu aufwendig und führt auch am Ziel vorbei, dafür wird mittlerweile für das Backend ExtJS 6 verwendet.

Ich muss mich seit einiger Zeit hauptsächlich mit Drupal und WordPress plagen. Nichts gegen diese beiden Systeme. Sie haben beide ihre Berechtigung, nur hierfür etwas zu Entwickeln macht keinen Spaß.

In letzter Zeit erhalte ich aber wieder vermehrt Anfragen für Pimcore und muss häufiger wieder Systeme hierfür aufsetzen. Und vor 2 Jahren wollte ich schon mal eine Tutorial Reihe zum Aufsetzen eines guten Basis-Systems schreiben. Und gerade juckt es mich wieder in den Fingern. Vielleicht hauche ich dem Block damit auch wieder ein wenig Leben ein.

Einen schönen Abend noch.

Nachträglich hinzugefügtes Element im DOM ansprechen

Ich muss zugeben, ich hatte öfter das Problem, Elemente auf einer Webseite mit jQuery anzusprechen, die nachträglich via Ajax oder .append() dem DOM hinzugefügt wurden. Höchstwahrscheinlich bin ich auch der Letzte, der die ideale Lösung wohl nicht kannte, obwohl es bereits seit 2011 möglich und bekannt ist.

Normale DOM Elemente mit Click-Handler behandeln:

Das geht solange gut, wie alle Elemente schon im DOM vorhanden sind, kommt aber etwas nachträglich hinzu, zum Beispiel nachgeladen durch Ajax, dann kennt der Click-Handler den Selektor noch nicht und dann kann man auf das Element klicken wie man möchte, es wird nichts passieren. Es wird nicht mal eine Fehlermeldung ausgegeben, weil es keinen Fehler gibt.

Jetzt endlich, bin ich über eine gute Lösung für das Problem gestolpert.

Nachträgliche, dem DOM hinzugefügte Elemente, mit Click-Handler behandeln:

In diesem Fall wird das neue Element in jedem Fall gefunden. Das ganze bedeutet natürlich auch, dass in diesem Beispiel der gesamte DOM einer Seite durchlaufen wird, bis der gewünschte Selektor gefunden wird, wegen $(document).on().

Aus Performancegründen wäre vielleicht die Wahl eines vorhanden, näher an dem neuen Element liegender Container, die bessere Wahl, solange dieser bereits vorhanden ist. Das sollte aber nicht wirklich ein Problem sein 😉

Abgefahrene CSS Shapes

Ich habe gerade eigentlich etwas ganz anderes zum Thema CSS gesucht, und dann was zum Thema Border und CSS gefunden, the Shapes of CSS. Mit CSS und Borders ist ja schon einiges möglich, aber da waren doch Ergebnisse bei, die mich sehr überraschten. Alte Bekannte wie Kreise, oder Dreiecke wirken dagegen auf einmal altbacken 😉

Ihr solltet auf jedenfall mal dort rein schauen, gibt noch viele andere Ideen von diversen Entwicklern, die Euch inspirieren könnten.

Das obige Beispiel ist von:  Nicolas Gallager

Noch nie so viel geschlafen

Ich muss zugeben, ich habe glaube ich noch nie so viel geschlafen, wie in der letzten Woche. Jeden Tag zwischen 0 und 1 Uhr ins Bett und dann eigentlich immer bis ca. 12 Uhr mittags gepennt. Ok, zugegeben, ich war krank, aber selbst im Urlaub schlafe ich selten mehr als 7 Stunden, da ich sonst das Gefühl habe, ich könnte etwas in der Zeit verpassen.

Jedenfalls war das super erholsam und man sollte immer so viel schlafen können, wie man möchte und braucht. Während der Arbeitswoche ist das aber tatsächlich unmöglich. Morgens, gegen 7:20 Uhr stehe ich auf, und komme meist exakt 12 Stunden später, also gegen 19:20 Uhr wieder nach Hause. Wenn man dann noch etwas im Haushalt und für das leibliche Wohl zu tun hat, sind es meist schnell nur noch 9 Stunden, die man schlafen könnte und dabei ist noch nicht berücksichtigt, dass man sich um sein geistiges Wohl gekümmert hat, also Hobbys pflegen, oder ein Buch lesen. Das nervt.

Der Tag sollte einfach 30 Stunden haben, dann muss ich nicht erst krank werden, um von allem genug zu bekommen.