Skip to content

9.0.0-beta2

Choose a tag to compare

@skerbis skerbis released this 07 May 15:17
· 183 commits to main since this release
7f8fd13

🚨🚨ACHTUNG BETA. :: NICHT AUF PRODUKTIV-SYSTEMEN VERWENDEN

Version 9.0.0-beta2

Migration

  • Bestehende MBlock-Module mit addMediaField() / addLinkField() benötigen MForm::useCustomLinkForClassicWidgets(true) vor dem MForm::factory()-Aufruf, um Reindex-Probleme beim Klonen von Blöcken zu vermeiden – in einem Modul-Input reicht der einmalige Aufruf; das Zurücksetzen auf false ist nur nötig, wenn im selben Request weitere MForm-Instanzen ohne das Flag folgen (z. B. in boot.php oder Addon-Seiten)
  • Repeater-Ausgabe: MFormRepeaterHelper::decode() ist bei Verwendung des Online/Offline-Toggles (__disabled) erforderlich; für einfache Repeater ohne Toggle bleibt json_decode() ausreichend
  • Namespace-Änderungen: keine neuen Breaking Changes gegenüber v8 (Namespace FriendsOfRedaxo\MForm bleibt)
  • Siehe 08_mblock_migration.md für den Migrationsleitfaden

Neu

  • MFormOutputHelper::createLinkData() / normalizeLinkData() – Unified Link-API als einheitlicher Einstieg für alle Link-Typen
    • Akzeptiert alle Eingabeformen: einfachen String (redaxo://, https://, mailto:, tel:), Array mit id/name (Repeater-Format aus Issue #357), bereits vorbereitetes customlink_*-Array
    • Parameter mode (frontend | raw | strict): steuert ob Backend-Labels (name mit ID-Suffix) erhalten bleiben oder bereinigt werden
    • Optionaler Parameter extern_blank (bool) für target="_blank" bei externen Links
  • MFormOutputHelper::normalizeRepeaterItems() – normalisiert Link-Felder in einem kompletten Repeater-Array in einem Schritt
    • Standard: fügt normalisiertes Array als <feldname>_normalized hinzu (kein Datenverlust)
    • Option replace => true überschreibt das Original-Feld
  • MForm::useCustomLinkForClassicWidgets(true) – rendert addMediaField() und addLinkField() intern über das custom_link-Widget
    • Kein Änderung am Speicherformat (REX_MEDIA_n / REX_LINK_n bleiben identisch)
    • Standard false für vollständige Rückwärtskompatibilität
  • addCustomLinkMultipleField() – mehrere Custom-Links in einem Feld (Repeater-basiert), Single-Format bleibt unverändert
  • addConditionalFieldsetArea() – regelbasierte Anzeige von Formularbereichen
  • addFlexRepeaterElement() – neuer Flex-Repeater als Standardpfad, inkl. stabiler Initialisierung in dynamischen Backend-Kontexten
  • Kopieren / Einfügen für Flex-Repeater – copy_paste => true am addRepeaterElement()
    • Copy-Button pro Item speichert Daten im sessionStorage
    • Einfügen-Button fügt das kopierte Item als neues Element am Ende ein
    • Clipboard bleibt nach Seitenreload erhalten; __disabled-Status wird nicht übernommen
  • MFormRepeaterHelper::decode() – bequemes Dekodieren von Repeater-Werten inkl. Filterung deaktivierter Items
  • MFormRepeaterHelper::filterByField() – Items nach Feldwert filtern (optionaler strikter Vergleich)
  • MFormRepeaterHelper::sortByField() – Items nach Feldwert sortieren (asc/desc, auto numerisch/alphabetisch)
  • MFormRepeaterHelper::groupByField() – Items nach Feldwert gruppieren
  • MFormRepeaterHelper::limitItems() – Items begrenzen / Pagination-Unterstützung
  • Template-API: MForm::registerTemplate($key, $class), MForm::fromTemplate($key), ->applyTemplate($key) über interne Registry (projektweite Defaults wiederverwendbar)
  • YForm Value-Type custom_link_multi – mehrere Custom-Links in einem YForm-Feld (JSON-Array)
  • addMFormMediaField() – MForm-natives Media-Widget ohne Reindex-Problem beim Klonen in MBlock
  • Dokumentationsseite „Was ist neu in MForm 9?" als Einstiegsseite in den Backend-Docs

Erweitert

  • Repeater-UI: Aktiv/Inaktiv-Status pro Item (Auge-Icon), Ausgabe-Filter für deaktivierte Items, verbesserte Toggle-All-Logik
  • Repeater-Header: Statusanzeige als gefüllter Punkt (grün = aktiv, rot = offline)
  • Repeater-Symbole und Bedienung vereinheitlicht (konsistentes Auf-/Zuklappen inkl. verschachtelter Repeater)
  • Linklist/Medialist-Repeater-Widget: robuste Übernahme aus Linkmap/Mediapool-Popups
  • Medialist-Widget: View-Switch zwischen Listen- und Rasteransicht (view, view_switch)
  • Medialist-Widget: Toggle wieder als Symbol-Button in der Toolbar
  • Medialist-Widget: echte Datei-Previews analog zur imagelist
  • imagelist auf das neue List-Widget-Muster umgestellt (schlanker Wrapper um medialist)
  • Neue Demo-Module ergänzt (Conditional Fields Builder, erweiterte Repeater-Szenarien)
  • Dokumentation erweitert: Repeater, Output-Filter, Conditional Fields, neue Einstiegsseite
  • Navigations- und Titelkonsistenz im Backend verbessert
  • Bestehende Helper prepareCustomLink(), getCustomUrl(), getCustomLinkUrl() bleiben unverändert, werden intern auf die neue Normalisierung geroutet

Fixed

  • TinyMCE-Kompatibilität: stabileres Save/Destroy/Reinit bei Add/Move/Sort/Remove im Repeater
  • Medialist-Widget: Preview-URLs korrekt aufbereitet (HTML-Entity-Decode für rex_medialistbutton_preview)
  • YForm Value-Type custom_link: Bug im Classic-Template (extern → external) behoben; Anker-Button über anchor: 0 ausblendbar
  • Verhindert Reindex-Probleme in MBlock beim Klonen von Blöcken (via useCustomLinkForClassicWidgets)