Neu in Craft CMS 5.10
Craft 5.10 ist gestern erschienen. Die wichtigste Neuerung ist ein Lösch-Workflow, der einen daran hindert, versehentlich etwas zu löschen. Überraschenderweise gibt es so etwas in Craft schon seit Jahren, nur hat es kaum jemand bemerkt.
Löschblockaden
Wer im Control Panel ein Element löscht, sieht jetzt unter Umständen ein Modal, das alles auflistet, was dem Löschen im Weg steht. An erster Stelle stehen Relationen: Verweisen andere Einträge auf das zu löschende Element, werden diese angezeigt. Die Relation lässt sich dann entweder auf ein anderes Element umleiten oder entfernen. Sobald alle Blockaden beseitigt sind, wird das Element gelöscht.
Das CKEditor-Plugin registriert eine Blockade für Elemente, auf die in CKEditor-Feldern verwiesen wird. Commerce 5.7 registriert Blockaden für Benutzer mit Bestellungen oder Abonnements.
Dass es sich hierbei um mehr als nur einen Warndialog handelt, zeigt sich daran, was gleichzeitig als veraltet markiert wurde. DeleteUsers, User::$inheritorOnDelete, DefineUserContentSummaryEvent und Craft.DeleteUserModal werden allesamt auslaufen. Craft kennt dieses Verhalten bereits seit einem Jahrzehnt, allerdings nur bei Benutzern: Wer jemanden löscht, wird gefragt, was mit dessen Einträgen geschehen soll. Version 5.10 nimmt diese Idee auf, verallgemeinert sie zum DeletionBlockerInterface und macht sie für jeden Elementtyp und jedes Plugin zugänglich.
Dieses Muster begegnet mir in dieser Versionsreihe immer wieder. Etwas, das bisher nur in einer Ecke des Systems funktionierte, wird auf eine höhere Ebene gehoben und allgemein nutzbar gemacht. Matrix-Blöcke wurden zu Einträgen und der Titel zu einem Feldlayout-Element. Jetzt wird aus der Abfrage beim Löschen von Benutzern ein Lösch-Framework.
Relationen und Löschen
Schon seit einiger Zeit hatte ich das vage Gefühl, dass Craft bei Relationen und Soft-Deletes am wenigsten sattelfest ist. Beim Durchgehen der Changelogs stellte ich fest, dass dieses Gefühl nicht unbegründet ist.
Version 5.4 behob, dass beim endgültigen Löschen eines Elements die verschachtelten Elemente nicht mitgelöscht wurden, und ermöglichte erstmals das endgültige Löschen verschachtelter Elemente aus eingebetteten Indexansichten.
Version 5.5 korrigierte, dass beim Wiederherstellen eines Elements auch verschachtelte Elemente zurückkehrten, die absichtlich gelöscht worden waren, und dass Einträge, die zusammen mit ihrer Sektion gelöscht wurden, beim Wiederherstellen der Sektion nicht wiederhergestellt wurden.
Version 5.7 beseitigte Fehler in den Methoden getOwner() und getPrimaryOwner(), die bei Abfragen von verschachtelten Elementen zusammen mit Elementen eines anderen Owner-Typs falsche Ergebnisse lieferten.
Schließlich behebt Version 5.10, dass verschachtelte Inhalte nach mehreren aufeinanderfolgenden Bearbeitungen unerwartet verändert oder gelöscht wurden, und dass Abfrageparameter von Relationsfeldern die Zielsites der Abfrage ignorierten.
Keiner dieser Fehler ist identisch, doch sie betreffen alle denselben Bereich: nämlich das, was mit den Dingen geschieht, die an einem Objekt hängen, wenn sich dessen Zustand ändert. Die Löschblockaden kümmern sich um den Moment vor dem Löschen, also die sichtbare Hälfte. Die Verwaltung im Hintergrund musste seit Version 5.4 in fast jedem Release nachgebessert werden. Das ist gut zu wissen für alle, denen schon einmal ein Kunde gemeldet hat, dass gelöschte Inhalte plötzlich wieder da waren. Oder eben nicht.
Matrix-Feldaktionen, überarbeitet
Im Januar habe ich über die Massenaktionen in Version 5.9 geschrieben: Blöcke in einem Matrix-Feld auswählen und anschließend aufklappen, zuklappen, kopieren, duplizieren oder löschen.
In Version 5.10 wird ein Teil davon wieder zurückgenommen. Matrix-Felder haben keine Duplizieren- und Löschen-Aktionen auf Feldebene mehr. Aufklappen, Zuklappen und Kopieren wirken nun immer auf alle verschachtelten Einträge, unabhängig von der getroffenen Auswahl. Aktionen auf Elementebene beziehen sich dagegen jetzt auf die gesamte Auswahl, wenn man sie an einem Block auslöst, der Teil davon ist.
Es geht um den Unterschied zwischen einer Aktion auf Feldebene und einer Aktion auf eine Auswahl. Version 5.9 hat diesen Unterschied verwischt. Wer zum Beispiel drei Blöcke ausgewählt und dann auf Löschen auf Feldebene geklickt hat: Was sollte in diesem Fall eigentlich passieren? Ich bin mir nicht sicher, ob ich es selbst gewusst hätte. Nach vier Monaten erkannt und zurückgenommen: Das ging schnell. Neu ist außerdem die Aktion „Paste above“ in Matrix- und Adressfeldern, und Adressfelder erhalten die Feldaktion „Copy all addresses“.
Zeitzonen
Es gibt jetzt eine Benutzereinstellung für die Zeitzone, und Zeitstempel im Control Panel enthalten das entsprechende Zeitzonenkürzel. Die Twig-Filter |time und |datetime akzeptieren ein Argument namens withTimeZone.
Wer nur Projekte innerhalb einer Zeitzone betreut, kann diesen Abschnitt überspringen. Wer mit Redakteuren in Berlin und New York arbeitet, hat schon erlebt, wie ein Beitrag für den falschen Nachmittag eingeplant wurde.
Alternativtext aus Dateimetadaten
Bei Assets, deren Metadaten beim Hochladen einen beschreibenden Text enthalten, wird das Feld für den Alternativtext nun automatisch befüllt.
Das setzt voraus, dass die Bilder mit intakten Metadaten ankommen. Nach meiner Erfahrung trifft das bei Agenturfotografie manchmal zu, bei allem anderen jedoch nie. Aber wenn ein Fotograf oder eine Bilddatenbank die Arbeit gemacht hat, ging dieser Text bisher irgendwo zwischen Shooting und CMS verloren. Jetzt kommt er an.
Min Authors
Craft 5.0 ermöglichte mehrere Autoren pro Eintrag, begrenzt über die Einstellung "Max Authors". Mit Version 5.7 wurde "Max Authors" optional, um beliebig viele Autoren zuzulassen, und der Wert 0 blendete das Autorenfeld vollständig aus. Version 5.10 regelt mit "Min Authors" jetzt auch die Untergrenze.
Ein Feld im Layout ersetzen
Bei einem bestehenden Feldlayout-Element lässt sich nun ändern, auf welches benutzerdefinierte Feld es verweist. Die Komponenten-Chips verfügen dafür über die Aktion „Replace“.
Eine kleine Neuerung mit konkreter Vorgeschichte: Craft 5 hat Feldinstanzen eingeführt, sodass dasselbe Feld unter verschiedenen Namen mehrfach auftauchen kann. Dadurch wurde es wahrscheinlicher, dass ein Layout-Element auf das falsche Feld zeigte. Bisher half nur, das Element zu entfernen und das richtige Feld neu hinzuzufügen, wobei Name, Anweisungen und Bedingungen der Instanz verloren gingen.
Weiter unten
Das Veröffentlichungsdatum von Einträgen wird nicht mehr automatisch beim Anlegen gesetzt, sondern erst, wenn ein Eintrag zum ersten Mal als aktiviert gespeichert wird. Bis dahin ist postDate null, anstatt dateCreated zu entsprechen. Templates, die sich darauf verlassen, sollten überprüft werden.
Twig liegt nun in Version 3.24 vor, in der Null-Safe-Operatoren eingeführt wurden. Außerdem gibt es neue Twig-Funktionen heading() sowie h1() bis h6(). Bei Textbedingungen stehen die Ausdrücke "does not equal", "is one of" und "is not one of" zur Verfügung, bei numerischen Bedingungen die beiden letzten. Delete-Queries in GraphQL akzeptieren nun das Argument hardDelete. Mit dem SecFetchSiteFilter gibt es eine Herkunftsprüfung, die als modernere Alternative zu CSRF-Tokens gedacht ist.
Element-Slideouts aktualisieren sich jetzt, wenn dasselbe Element in einem anderen Tab bearbeitet wird. Damit verringert sich erneut die Lücke zwischen Slideouts und vollständigen Bearbeitungsseiten.
Das Release behebt zudem drei Sicherheitslücken: eine Remote-Code-Execution mit hohem Schweregrad sowie JavaScript-Injection und Path Traversal mit mittlerem Schweregrad.
Craft 6 läuft parallel
Craft 6.0.0-alpha.2 erschien am selben Tag und enthält alle Funktionen aus Version 5.10.
Testen werde ich es nicht. Die Beta von Craft 5 hatte ich bereits in einem Live-Projekt im Einsatz und würde das auch wieder so machen, doch eine Alpha ist etwas anderes: Die Oberfläche steht noch nicht fest, und vieles, was ich melden würde, wird ohnehin noch umgebaut. In der Beta ist der Funktionsumfang festgelegt. Dann hilft mein Feedback tatsächlich, und ich kann das Risiko einschätzen. Bis dahin lese ich lieber darüber.
Das wirft allerdings die Frage auf, wie viel von Version 5.x noch übrig bleibt. Craft 6 ist für das letzte Quartal des Jahres angekündigt. Ein so umfangreiches Point-Release im Mai ist damit entweder ein Zeichen dafür, dass bei der 5er-Reihe noch Potenzial besteht, oder es ist das letzte große Update vor dem Umstieg.
Alles, was hier nicht erwähnt wird, steht im vollständigen Changelog.