Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# MForm - REDAXO Addon für Modul-Input-Formulare

## Version 9.0.0
- Neuer Flex-Repeater als Standardpfad, inkl. stabiler Initialisierung in dynamischen Backend-Kontexten
- Repeater-UI erweitert: Aktiv/Inaktiv-Status pro Item (Auge), Ausgabe-Filter für deaktivierte Items und verbesserte Toggle-All-Logik
- Statusanzeige im Repeater-Header aktualisiert: gefuellter Punkt (gruen = aktiv, rot = offline)
- Repeater-Symbole und Bedienung vereinheitlicht (konsistentes Auf-/Zuklappen inkl. Nested-Repeatern)
- TinyMCE-Kompatibilität verbessert (stabileres Save/Destroy/Reinit bei Add/Move/Sort/Remove)
- Neues Linklist/Medialist-Repeater-Widget mit robuster Übernahme aus Linkmap/Mediapool-Popups
- Medialist-Widget erweitert: View-Switch zwischen Listen- und Rasteransicht (`view`, `view_switch`)
- Medialist-Widget verbessert: Toggle wieder als Symbol-Button in der Toolbar
- Medialist-Widget verbessert: echte Datei-Previews analog zur `imagelist` (statt reinem Dateityp-Text)
- Medialist-Widget fix: Preview-URLs korrekt aufbereitet (HTML-Entity-Decode für `rex_medialistbutton_preview`)
- Neue API: `addCustomLinkMultipleField(...)` fuer mehrere Custom-Links (repeater-basiert), Single-Format bleibt unveraendert
- Neues API-Feature: `addConditionalFieldsetArea(...)` für regelbasierte Anzeige von Formularbereichen
- Neues Template-API: `MForm::registerTemplate($key, $class)`, `MForm::fromTemplate($key)` und `->applyTemplate($key)` ueber interne Registry (projektweite Defaults wiederverwendbar)
- Neue Demo-Module ergänzt, u. a. für Conditional Fields Builder und erweiterte Repeater-Szenarien
- Dokumentation erweitert (Repeater, Output-Filter, Conditional Fields)
- **Neu: 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
- **Neu: YForm Value-Type `custom_link_multi`** – Mehrere Custom-Links in einem YForm-Feld (JSON-Array), identisches Widget wie `addCustomLinkMultipleField()`
- **Neu: YForm Value-Type `custom_link`** – Anker-Button über `anchor: 0` ausblendbar; Bug im Classic-Template (`extern` → `external`) behoben
- **Neu: `MFormRepeaterHelper::decode()`** – bequemes Dekodieren von Repeater-Werten ohne Offline-Items
- Navigations- und Titelkonsistenz im Backend verbessert

## Version 8.1.6
- fix: `notice` Attribut kann nun auch über den Parameter-Array übergeben werden (z.B. `addMediaField`, `addTextField` etc.) – schließt #389

Expand Down
89 changes: 30 additions & 59 deletions README.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,32 @@ MForm erleichtert die Erstellung von REDAXO-Modul-Eingaben. Mit MForm kann man n
**Aber da hört’s noch nicht auf!**
MForm pimpt auch YForm und rex_form mit zusätzlichen Widgets auf. Benutzerdefiniertes Link-Feld oder eine schicke Image-List? Kein Problem, MForm hat die Lösung.

## Neu in Version 8 ###
Und das Highlight in der neuesten Version? Der brandneue Formular-Repeater! Dieses Feature ersetzt das alte MBlock AddOn und bietet die Möglichkeit, Formularelemente nicht nur zu wiederholen, sondern sie auch in mehreren Ebenen zu verschachteln – etwas, das mit MBlock so nicht machbar war. Damit kann man jetzt noch komplexere Formulare aufbauen.

Die beiliegende **Demo-Sammlung** erlaubt das sofortige Ausprobieren von Modul-Codes. Module können direkt installiert und getestet werden. Die Codes sind alle kommentiert.
Und zuästlich gibt es eine ausführliche Doku 📒.
## Neu in Version 9
Version 9 legt den Fokus auf einen robusteren und redaktionsfreundlichen Workflow.

- Neuer Flex-Repeater im Backend mit stabiler Initialisierung (auch in dynamischen Kontexten)
- Neuer Aktiv/Inaktiv-Status pro Repeater-Item (Auge): editierbar bleiben, aber bei der Ausgabe ausblenden
- Der Status ist im Header sofort sichtbar: gefuellter Punkt (gruen = aktiv, rot = offline)
- **Kopieren / Einfügen für Flex-Repeater** – `copy_paste => true` an `addRepeaterElement()`: einzelnes Item kopieren, als neues Element am Ende einfügen
- TinyMCE-Kompatibilität im Repeater verbessert (Add/Move/Sort/Remove)
- Neues Linklist/Medialist-Repeater-Widget mit robuster Popup-Übernahme
- Medialist-Widget mit integriertem View-Switch (Liste/Raster) per Toolbar-Button
- Neue API `addCustomLinkMultipleField(...)` – Repeater-basiertes Multi-Link-Feld; Single-Format bleibt unveraendert
- Neue Conditional-API über `addConditionalFieldsetArea(...)`
- **Neue YForm Value-Types** aus dem mform-Paket:
- `custom_link` – unterstützt jetzt `anchor: 0` zum Ausblenden des Anker-Buttons; Bug im Classic-Template behoben
- `custom_link_multi` – mehrere Links pro YForm-Feld, gespeichert als JSON-Array
- **Neuer Helfer `MFormRepeaterHelper::decode()`** – Repeater-Werte in einem Aufruf ohne Offline-Items dekodieren
- Demo-Sammlung erweitert (Conditional Fields, Copy/Paste-Repeater)
- Doku erweitert (Repeater-Output-Filter, Conditional Fields)

## Features

### Grundlegende Funktionalitäten
- **Erstellen von Moduleingaben per PHP**: Die Basis, um mit MForm zu arbeiten.
- **Mehrspaltige Formulare**: Layout-Optionen zur Strukturierung der Formulare.
- **Inline-Formular-Elemente**: Für eine kompakte Formulargestaltung.
- **HMTL5-Formular-Elemente**: Nutzung moderner Webstandards.
- **HTML5-Formular-Elemente**: Nutzung moderner Webstandards.
- **Datalists**: Für verbesserte Eingabeoptionen in Formularen.

### Erweiterte Gestaltung und Interaktivität
Expand All @@ -40,75 +53,33 @@ Und zuästlich gibt es eine ausführliche Doku 📒.

Der Formular-Repeater ermöglicht es, Formularelemente dynamisch zu wiederholen und dabei eine Verschachtelung in mehreren Ebenen zu realisieren.

### Migration von MBlock zu MForm 8

Der neue Repeater ist nur eingeschränkt mit MBlock kompatibel.

Akuell funktionieren nicht bei einer Migration:

- CustomLinkField // Converter: https://friendsofredaxo.github.io/tricks/addons/mform/custom_link_converter
- addMediaListField
- addLinkListField

***MBlock-Modul***

```php
// Basis-ID für die Verwaltung der Formularelemente
$id = 1;

// Initialisierung von MForm
$mform = new MForm();

// Hinzufügen eines Feldsets
$mform->addFieldsetArea('Team member');

// Hinzufügen eines Textfelds, wobei dynamisch auf ein JSON-Format verwiesen wird
$mform->addTextField("$id.0.name", array('label' => 'Name'));

// Hinzufügen eines Medienfeldes, das durch MBlock in JSON gespeichert wird
$mform->addMediaField(1, array('label' => 'Avatar'));

// Ausgabe des Formulars mit MBlock, welches die dynamische Handhabung der Blöcke erlaubt
echo MBlock::show($id, $mform->show(), array('min' => 2, 'max' => 4));
```

***Das gleiche Modul in MForm 8***

Zur Ermittlung der benötigten Feld-Keys sollte man ggf. vorab einen Dump erzeugen.
Zu beachten: Aus dem Mediafield 1 im urpsrünglichen MBlock-Modul wird: `'REX_MEDIA_1'`

```php
use FriendsOfRedaxo\MForm;

// Initialisierungs-ID des Repeaters mit der Basis-ID des ursprünglichen MBlock-Abschnittes
$id = 1;

// Erstellen einer neuen MForm-Instanz mit der Factory-Methode und direkte Integration eines Repeaters
echo MForm::factory()
->addRepeaterElement(
$id,
1,
MForm::factory()
->addFieldsetArea('Team member',
MForm::factory()
->addTextField('name', ['label' => 'Name'])
->addMediaField('REX_MEDIA_1', ['label' => 'Avatar'])
->addFieldsetArea('Team member', MForm::factory()
->addTextField('name', ['label' => 'Name'])
->addMediaField('image', ['label' => 'Avatar'])
),
true,
true,
['min' => 2, 'max' => 4]
true,
true,
['min' => 1, 'max' => 10]
)
->show();
```


> **MBlock-Migration:** Hinweise zur Migration bestehender MBlock-Module gibt es im [Migrationsleitfaden](docs/08_mblock_migration.md).

## Installation

MForm kann direkt über den Redaxo-Installer Installiert werden. [MForm Redaxo Addon Page](http://www.redaxo.org/de/download/addons/?addon_id=967&searchtxt=mform&cat_id=-1)
MForm kann direkt über den Redaxo-Installer installiert werden. [MForm Redaxo Addon Page](http://www.redaxo.org/de/download/addons/?addon_id=967&searchtxt=mform&cat_id=-1)

1. In REDAXO einloggen
2. Im Backend unter "Installer > Neue herunterladen" "MForm" suche und unter "Funktion" "ansehen" klicken
3. Bei der aktuelle Version in der Liste unter "Funktion" "herunterladen" klicken
3. Bei der aktuellen Version in der Liste unter "Funktion" "herunterladen" klicken
4. Unter "AddOns" MForm installieren und aktivieren

## Ausgabe
Expand All @@ -118,7 +89,7 @@ Informationen hierzu in der [REDAXO Doku](https://www.redaxo.org/doku/main/redax

## Lizenz

MForm ist unter der [MIT Lizenz](LICENSE.md) lizensiert.
MForm ist unter der [MIT Lizenz](LICENSE.md) lizenziert.

## Changelog

Expand Down
84 changes: 26 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,24 @@ MForm facilitates the creation of REDAXO module inputs. With MForm, you can not
**But it doesn’t stop there!**
MForm also enhances YForm and rex_form with additional widgets. Need a custom link field or a chic image list? No problem, MForm has you covered.

## New in Version 8
The highlight of the latest version? The brand-new Form Repeater! This feature replaces the old MBlock AddOn and offers the ability to not only repeat form elements but also nest them at multiple levels – something that was not possible with MBlock. This allows for the construction of even more complex forms.

The included **demo collection** allows for immediate testing of module codes. Modules can be directly installed and tested. The codes are all commented.
And additionally, there is a comprehensive documentation 📒.
## New in Version 9
Version 9 focuses on a more robust and editor-friendly form workflow.

- New Flex Repeater runtime with stable behavior in dynamic backend contexts
- New item activation state in repeater (eye icon): keep entries editable but exclude them from frontend output
- Item status is now visible directly in the header via a filled status dot (green = active, red = offline)
- **Copy/Paste for Flex Repeater** – `copy_paste => true` on `addRepeaterElement()`: copy a single item to session storage, paste it as a new entry at the bottom
- Better TinyMCE compatibility in repeater actions (add/move/sort/remove)
- New Linklist/Medialist repeater widget with robust popup synchronization
- Medialist widget now supports a built-in view switch (list/grid) via toolbar toggle
- New `addCustomLinkMultipleField(...)` API – repeater-based multi-link field; single format stays unchanged
- New Conditional Fields Builder API via `addConditionalFieldsetArea(...)`
- **New YForm Value Types** provided by mform:
- `custom_link` – now supports `anchor: 0` to hide the anchor button; bug in classic template fixed
- `custom_link_multi` – multiple links per YForm field, stored as JSON array
- **New helper `MFormRepeaterHelper::decode()`** – decode repeater values without offline items in one call
- Extended demo collection (Conditional Fields, Copy/Paste Repeater)
- Expanded documentation for repeater output filtering and conditional field usage

## Features

Expand Down Expand Up @@ -40,70 +53,25 @@ And additionally, there is a comprehensive documentation 📒.

The Form Repeater allows dynamic repetition of form elements while realizing nesting at multiple levels.

### Migration from MBlock to MForm 8

The new repeater is only compatible with MBlock to a limited extent.

It does not currently work during a migration:

- CustomLinkField // Converter: https://friendsofredaxo.github.io/tricks/addons/mform/custom_link_converter
- addMediaListField
- addLinkListField


***MBlock Module***

```php
use FriendsOfRedaxo\MForm;

// Base ID for managing form elements
$id = 1;

// Initialize MForm
$mform = new MForm();

// Add a fieldset
$mform->addFieldsetArea('Team member');

// Add a text field, referring dynamically to a JSON format
$mform->addTextField("$id.0.name", array('label' => 'Name'));

// Add a media field saved by MBlock in JSON
$mform->addMediaField(1, array('label' => 'Avatar'));

// Output the form with MBlock, which allows dynamic handling of blocks
echo MBlock::show($id, $mform->show(), array('min' => 2, 'max' => 4));
```

***The same module in MForm 8***

To determine the necessary field keys, a dump might be needed beforehand.
Note: From the original MBlock Mediafield 1, it becomes: `'REX_MEDIA_1'`

```php
use FriendsOfRedaxo\MForm;

// Repeater initialization ID with the base ID of the original MBlock section
$id = 1;

// Create a new MForm instance with the factory method and directly integrate a repeater
echo MForm::factory()
->addRepeaterElement(
$id,
1,
MForm::factory()
->addFieldsetArea('Team member',
MForm::factory()
->addTextField('name', ['label' => 'Name'])
->addMediaField('REX_MEDIA_1', ['label' => 'Avatar'])
->addFieldsetArea('Team member', MForm::factory()
->addTextField('name', ['label' => 'Name'])
->addMediaField('image', ['label' => 'Avatar'])
),
true,
true,
['min' => 2, 'max' => 4]
true,
true,
['min' => 1, 'max' => 10]
)
->show();
```


> **MBlock migration:** See [docs/08_mblock_migration.md](docs/08_mblock_migration.md) for a step-by-step migration to MForm 9.

## Installation

Expand Down
Loading