AddOn


MBlock Multiple-Blöcke in Modul-Input-Formularen

Beschreibung

MBlock - multiple Datenblöcke innerhalb eines Moduls anlegen und sortieren.

Mit MBlock ist es möglich innerhalb eines Moduls belieb viele Datenblöcke zu erzeugen. Die Datenblöcke können dann einfach per Drag & Drop oder auch via Up-/Down-Button sortiert werden.

Die aktuellste MBlock Version auf Github: https://github.com/FriendsOfREDAXO/mblock


Umsetzung

Versionen

4.6.6

Für REDAXO
^5.18.0
Veröffentlicht am
26.06.2026

Checkbox-Werte bleiben rückwärtskompatibel: Beim Reindexing wurden Checkbox-Values clientseitig auf 1/0 normalisiert. Dadurch gingen benutzerdefinierte Werte wie checked verloren und bestehende Modul-Logik konnte brechen. MBlock erhält nun den ursprünglichen Basiswert pro Checkbox und überschreibt nur noch echte boolesche Werte kontrolliert.

4.6.5

Für REDAXO
^5.18.0
Veröffentlicht am
24.06.2026

Version 4.6.5 - 2026-06-24

Bug Fixes

  • Media-Popup mit langer Widget-ID wieder korrekt: In der MBlock-Bridge und beim Reinitialisieren der REDAXO-Widgets wurde die REX_MEDIA_*-ID bisher auf reine Ziffern gekürzt. Bei IDs wie REX_MEDIA_1GBS... führte das zu falschem opener_input_field=REX_MEDIA_1. Der vollständige ID-Suffix wird jetzt erhalten und an openREXMedia/viewREXMedia/addREXMedia/deleteREXMedia weitergegeben.
  • Nur erstes MBlock-Element wurde gespeichert: Beim Initial-Render konnten mehrere Blöcke denselben Feldnamen-Index [0] behalten. Dadurch kollidierten POST-Keys und spätere Elemente wurden überschrieben. Beim ersten mblock_init() wird jetzt ein zusätzlicher mblock_reindex() ausgeführt, sodass Namen sofort korrekt auf [0], [1], ... verteilt sind.

4.6.4

Für REDAXO
^5.18.0
Veröffentlicht am
16.06.2026

Version 4.6.4 - 2026-06-16

Bug Fixes

  • CKEditor-5-Sync beim Submit stabilisiert: In mblock_sync_all_cke5_to_textareas wurde eine fehlerhafte const-Neuzuweisung im DOM-Fallback behoben (TypeError: invalid assignment to const).

4.6.3

Für REDAXO
^5.18.0
Veröffentlicht am
30.05.2026

What's Changed

New Contributors

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.6.2...4.6.3

4.6.2

Für REDAXO
^5.18.0
Veröffentlicht am
30.05.2026

Version 4.6.2 - 2026-05-30

Bug Fixes

  • Warnings bei MForm custom/core Toggle behoben: Die Replacer-Logik für REX_MEDIALIST_SELECT_* und REX_LINKLIST_SELECT_* ersetzt den Name-Identifier jetzt null-sicher. Dadurch treten keine PHP-Deprecations mehr auf (str_replace(): Passing null to parameter #1) wenn systemId in einzelnen Widget-HTML-Varianten noch nicht gesetzt ist.
  • Settings-Serialisierung gehärtet: MBlockSettingsHelper normalisiert Array-Werte vor dem Rendern der data-*-Attribute. Dadurch wird die Warnung Array to string conversion vermieden.

4.6.1

Für REDAXO
^5.18.0
Veröffentlicht am
27.05.2026
  • rex_select mit optgroup verursacht TypeError: In den Select-Replacern werden innerhalb von optgroup jetzt nur noch echte option-Elemente verarbeitet. Whitespace-Textknoten (DOMText) werden ignoriert, dadurch tritt der Crash Argument #2 ($option) must be of type DOMElement, DOMText given nicht mehr auf. Siehe Issue #227, gemeldet von @tbaddade.
  • Defektes Link-Beispiel repariert: Die Beispiel-Datei base2_link_example.ini enthielt beschädigte/duplizierte Startzeilen und ungültigen PHP-Code. Das Beispiel ist wieder lauffähig.

4.6.0

Für REDAXO
^5.18.0
Veröffentlicht am
07.05.2026

🚨 Bitte unbedingt bei Verwendung von MForm 9 Updatehinweise beachten kurz

MForm::useCustomLinkForClassicWidgets(true);
Erzeugt die Kompatibilität zu MForm 9

Beispiel:

/ useCustomLinkForClassicWidgets(true) sorgt dafür, dass addMediaField / addLinkField
// über das custom_link-Widget gerendert werden → kein Reindex-Problem beim Klonen.
// Das Speicherformat (REX_MEDIA_1 / REX_LINK_n) bleibt identisch.

MForm::useCustomLinkForClassicWidgets(true);

$mform = MForm::factory()
    ->addFieldsetArea('Team-Mitglied', MForm::factory()

Version 4.6.0 - 2026-05-07

Bug Fixes

  • MForm 9 Widgets in MBlock sauber reindexiert: custom_link, custom_medialist, custom_linklist und imglist werden nach Add/Sort jetzt mit ihren aktuellen Widget-IDs, Popup-Callbacks und internen Referenzen neu initialisiert. Dadurch funktionieren Picker nach dem Verschieben und in neu angelegten Blöcken zuverlässig weiter.
  • Neue MBlocks starten mit leeren MForm-Widgets: Beim Klonen eines neuen Blocks werden MForm-Widgetzustände jetzt gezielt zurückgesetzt. Betroffen sind custom_link sowie die mform-list-widget-Familie (medialist, linklist, imglist). Sichtbare Texte, Hidden-Values, Select-Optionen und gerenderte Listen werden nicht mehr aus dem Quellblock übernommen.

Rückwärtskompatibilität

  • Kein Datenbank- oder Content-Break: Bestehende MBlock-Module, gespeicherte Inhalte und Datenstrukturen bleiben unverändert kompatibel.
  • Kein harter Addon-Conflict erforderlich: MBlock selbst bleibt zu älteren MForm-Versionen lauffähig. Die Fixes in 4.5.9 fokussieren auf custom_link und die mform-list-widget-Familie.

4.5.8

Für REDAXO
^5.18.0
Veröffentlicht am
06.05.2026

SourceMap-Fehler (404) auf Live-Servern: Der sourceMappingURL-Kommentar in der mblock.min.js wurde entfernt, um 404-Fehler in den Browser-Entwicklertools auf Live-Servern zu vermeiden, die keine .map Dateien ausliefern. Die Map-Datei bleibt weiterhin für Entwicklungszwecke in den Sourcen erhalten. @olien

ℹ️ Mai 2026: Das AddOn befindet sich im Maintenance-Status ab 4.5.7 werden keine neuen Features mehr entwickelt.

4.5.7

Für REDAXO
^5.18.0
Veröffentlicht am
27.02.2026

Bug Fixes

  • REX_LINK – 3. Block überschreibt Link von Block 2: mblock_update_rex_ids hat REX_LINK_-Inputs beim Reindexieren nicht berücksichtigt, sodass alle neuen Blöcke dieselbe Link-ID aus dem Template behielten. Link-Popup-Callbacks schrieben dadurch stets in Block 2. REX_LINK_ wird nun korrekt mit dem Block-Index reindexiert.
  • REX_LINK – _NAME-Input nach Reindexierung nicht auffindbar (null is not an object evaluating getElementById("REX_LINK_X_NAME")): Der textuelle Anzeigefeld-Input (_NAME) bekam beim generischen Durchlauf einen anderen eindex als der hidden-Input → ID-Mismatch. _NAME-Inputs werden jetzt im generischen Loop übersprungen und synchron zum hidden-Input mit derselben ID-Basis aktualisiert.
  • deleteREXLink nach Drag & Drop kaputt: Das generische Regex-Replace in mblock_update_rex_buttons hat bei deleteREXLink('X') die schließende Quote entfernt → ungültiges JavaScript. -Handler werden jetzt per spezifischem Pattern korrekt mit Quotes ersetzt.
  • REX_LINK Buttons in Modulen ohne rex-js-widget-link-Klasse nicht aktualisiert: closest('.rex-js-widget-link') schlug bei HTML-basierten Link-Feldern ohne diese Klasse fehl. Die Widget-Suche verwendet jetzt eine Fallback-Kette (.input-group, .rex-js-widget), die auch bei eigenen Templates greift.

4.5.6

Für REDAXO
^5.18.0
Veröffentlicht am
24.02.2026

Version 4.5.6 - 2026-02-24

Bug Fixes

  • Radio-Button (Copy & Paste) – Wert nicht übernommen: Alle Radio-Inputs einer Gruppe teilen denselben name-Attribut. Bisher wurde der formData-Eintrag bei jeder Iteration überschrieben, sodass immer das letzte (nicht ausgewählte) Radio gewann. Die Erfassung speichert jetzt pro Gruppe nur den tatsächlich gewählten Wert als neuen radio_group-Typ.
  • Radio-Button (Copy & Paste) – active-Klasse als Fallback: MForm Bild-Radios und Color-Radios markieren die aktive Option zusätzlich mit class="active" am <label>. Diese Klasse wird nun beim Erfassen als Fallback ausgewertet, falls prop('checked') im DOM-Klon nicht gesetzt ist.
  • Radio-Button (Copy & Paste) – Tab-Panel-Reset: Nach dem Einfügen triggert mblock rex:ready, wodurch Tab-Panel- und MForm-Initialisierungen alle active-Klassen auf Labels zurücksetzen. Die Radio-Wiederherstellung wird deshalb zweistufig durchgeführt: einmal direkt beim Einfügen und nochmals nach dem rex:ready/trigger('change')-Zyklus über die neue restoreRadioGroups()-Methode.

4.5.5

Für REDAXO
^5.18.0
Veröffentlicht am
15.02.2026

Fehlerbehebungen

  • CKEditor 5-Füllinhalt: Automatische Bereinigung von Ersatzinhalten für CKEditor 5 (<p><br data-cke-filler="true"></p>) und Platzhaltern (<p class="ck-placeholder" ...>) bei der Formularübermittlung hinzugefügt. Dadurch wird verhindert, dass leere Blöcke mit unsichtbaren HTML-Artefakten gespeichert werden.

Cleanup Script for Existing Data

Use the following PHP script Example:

<?php
/**
 * MBlock CKEditor 5 Filler Cleanup Script
 * 
 * Run this script in the REDAXO PHP Console (System > Console) or via CLI
 * to remove existing filler content from your database.
 */

$tables = [
    'rex_article_slice' => 20, // Check value1 - value20
    // Add custom YForm tables here if needed:
    // 'rex_my_table' => ['description', 'text_column'],
];

$filler1 = '<p><br data-cke-filler="true"></p>';
$filler2 = '<br data-cke-filler="true">';

// JSON escaped variants (often found in MBlock data)
$filler1_json = '<p><br data-cke-filler=\"true\"><\/p>';
$filler2_json = '<br data-cke-filler=\"true\">';

echo "<h2>Cleaning CKEditor 5 Filler Content...</h2>";

foreach ($tables as $table => $columns) {
    if (is_int($columns)) {
        // Generate value1...valueN for slices
        $cols = [];
        for ($i = 1; $i <= $columns; $i++) {
            $cols[] = 'value' . $i;
        }
    } else {
        $cols = (array) $columns;
    }

    $sql = rex_sql::factory();

    foreach ($cols as $col) {
        // 1. Standard HTML replacement
        $query = "UPDATE `$table` SET `$col` = REPLACE(`$col`, :filler1, '') WHERE `$col` LIKE :search1";
        $sql->setQuery($query, ['filler1' => $filler1, 'search1' => '%data-cke-filler%']);
        if ($sql->getRows() > 0) echo "Updated $table.$col (HTML Variant 1): " . $sql->getRows() . " rows<br>";

        $query = "UPDATE `$table` SET `$col` = REPLACE(`$col`, :filler2, '') WHERE `$col` LIKE :search2";
        $sql->setQuery($query, ['filler2' => $filler2, 'search2' => '%data-cke-filler%']);
        if ($sql->getRows() > 0) echo "Updated $table.$col (HTML Variant 2): " . $sql->getRows() . " rows<br>";

        // 2. JSON Escaped replacement (common in mblock)
        $query = "UPDATE `$table` SET `$col` = REPLACE(`$col`, :filler1, '') WHERE `$col` LIKE :search1";
        $sql->setQuery($query, ['filler1' => $filler1_json, 'search1' => '%data-cke-filler%']);
        if ($sql->getRows() > 0) echo "Updated $table.$col (JSON Variant 1): " . $sql->getRows() . " rows<br>";

        $query = "UPDATE `$table` SET `$col` = REPLACE(`$col`, :filler2, '') WHERE `$col` LIKE :search2";
        $sql->setQuery($query, ['filler2' => $filler2_json, 'search2' => '%data-cke-filler%']);
        if ($sql->getRows() > 0) echo "Updated $table.$col (JSON Variant 2): " . $sql->getRows() . " rows<br>";

        // 3. Regex Replacement for Placeholders (PHP-based because SQL lacks REGEX replace)
        // Matches: <p class="ck-placeholder" data-placeholder="..."></p>
        $fetchQuery = "SELECT id, `$col` FROM `$table` WHERE `$col` LIKE '%ck-placeholder%'";
        // Iterate only over rows that actually match
        $iterator = rex_sql::factory()->getArray($fetchQuery);
        $localUpdateCount = 0;

        foreach ($iterator as $row) {
            $original = $row[$col];
            $current = $original;

            // Regex for HTML variant
            $current = preg_replace('/<p class="ck-placeholder" data-placeholder="[^"]+"><\/p>/', '', $current);

            // Regex for JSON escaped variant (need to be careful with backslashes)
            // Pattern: <p class=\"ck-placeholder\" data-placeholder=\"...\"><\/p>
            $current = preg_replace('/<p class=\\\\"ck-placeholder\\\\" data-placeholder=\\\\"[^"]+\\\\"><\\\\\/p>/', '', $current);

            if ($current !== $original) {
                // Determine ID column name (usually 'id')
                $idCol = 'id'; 

                $upd = rex_sql::factory();
                $upd->setTable($table);
                $upd->setWhere([$idCol => $row[$idCol]]);
                $upd->setValue($col, $current);
                $upd->update();
                $localUpdateCount++;
            }
        }
        if ($localUpdateCount > 0) echo "Updated $table.$col (Placeholders via PHP Regex): " . $localUpdateCount . " rows<br>";
    }
}
echo "<br><strong>Cleanup complete!</strong> Clear the cache manually if needed.";

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.5.4...4.5.5

4.5.4

Für REDAXO
^5.18.0
Veröffentlicht am
01.12.2025

Verbesserter Gridblock-Support

4.5.3

Für REDAXO
^5.18.0
Veröffentlicht am
01.12.2025

4.5.3
fixed: CKE5: Interne Links wurden in # umgeschrieben. redaxo links wurden als nicht gültig betrachtet

MBlock - REDAXO Addon für Modul-Input-Blöcke

Version 4.5.1 - 2025-11-26

Bug Fixes

  • Double Icons: Fixed duplicate icons in copy/paste buttons when Bloecks addon is active.
  • TinyMCE Drag & Drop: Fixed issue where TinyMCE editors became unresponsive after moving blocks (Drag & Drop or Arrow Buttons).

Version 4.5.0 - 2025-11-26

Features

  • TinyMCE Support: Added full support for TinyMCE (v4, v5, v6, v7, v8) in MBlock instances.
  • CKEditor 5 Improvements: Enhanced copy & paste functionality for CKEditor 5, ensuring content is correctly preserved and restored.

Improvements

  • Code Modernization: Updated PHP classes to use strict types and modern array syntax.
  • Performance: Optimized JavaScript for better editor initialization and cleanup.
  • Cleanup: Removed debug code and unnecessary files.

fixed: https://github.com/FriendsOfREDAXO/mblock/issues/216

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.3.8...4.5.0

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.5.0...4.5.1

4.3.7

Für REDAXO
^5.18.0
Veröffentlicht am
23.10.2025

Fixed:
Das aktuelle MBlock meldet bei mir einen JS-Fehler: MBlock: Sortable.js ist nicht verfügbar
@iceman-fx

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.3.6...4.3.7

4.3.6

Für REDAXO
^5.18.0
Veröffentlicht am
21.10.2025

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.3.5...4.3.6

4.3.5

Für REDAXO
^5.18.0
Veröffentlicht am
10.10.2025

Fixes a JavaScript conflict between the mblock and search_it plugins by disabling toplevel variable mangling in the Terser minification configuration. The issue was causing "redeclaration of let h" errors when both plugins were active, preventing search_it's incremental indexing from working properly.

Disabled toplevel mangling in Terser configuration to preserve global variable names
Added explanatory comments documenting why this change was necessary
Prevents naming collisions while maintaining effective minification of local variables

4.3.4

Für REDAXO
^5.18.0
Veröffentlicht am
10.10.2025

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.3.3...4.3.4

4.3.3

Für REDAXO
^5.18.0
Veröffentlicht am
29.09.2025

4.3.2 - 4.3.3

What's Changed

New Contributors

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/4.3.1...4.3.2

4.2.1

Für REDAXO
^5.18.0
Veröffentlicht am
28.08.2025

4.2.0 🎉 :: Hello Gridblock

  1. Verbesserter Support für Gridblock
  2. Erweiterte Dokumentation

Hinweis für markitup- und ckeditor-Nutzer

Copy & Paste funktioniert leider nicht!

Es sollte in den betreffenden Modulen oder global in den Einstellungen deaktiviert werden.
Nicht traurig sein, dafür könnt ihr immerhin online/offline nun nutzen.

Beispiel

echo MBlock::show(1, $form, [
    'min' => 1,              // Minimale Anzahl Items
    'max' => 10,             // Maximale Anzahl Items  
    'template' => 'modern',  // Template-Name
    'copy_paste' => false,    // Copy & Paste aktivieren
    'online_offline' => true // Online/Offline Toggle , hidden field muss angelegt sein. 
]);

4.1.1

Für REDAXO
^5.18.0
Veröffentlicht am
26.08.2025

🚨🚨🚨🚨🚨 4.0 - 4.1.1 NICHT FÜR GRIDBLOCK EINSETZEN 🚨🚨🚨🚨🚨
🚨🚨🚨🚨🚨Bitte noch die 3.x verwenden ... 4.2.0 wird es richten 🚨🚨🚨🚨🚨

Hier gibt's ein paar Fixes.
Alles wird wieder gut

Sorry an die Gridlockfreunde

3.4.13

Für REDAXO
^5.6.0
Veröffentlicht am
25.08.2023
Require / PHP Extensions
xml

What's Changed

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/3.4.12...3.4.13

3.4.12

Für REDAXO
^5.6.0
Veröffentlicht am
02.03.2023
Require / PHP Extensions
xml

Behebt einen Darstellungsfehler, wenn kein initiales Fieldset gesetzt wurde.

3.4.11

Für REDAXO
^5.6.0
Veröffentlicht am
04.02.2023
Require / PHP Extensions
xml

Updated Examples to MForm >= 7
Added notice about MForm version

3.4.10

Für REDAXO
^5.6.0
Veröffentlicht am
03.02.2023
Require / PHP Extensions
xml

What's Changed

3.4.9

Für REDAXO
^5.6.0
Veröffentlicht am
20.01.2023
Require / PHP Extensions
xml

What's Changed

New Contributors

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/3.4.8...3.4.9

3.4.8

Für REDAXO
^5.6.0
Veröffentlicht am
05.01.2023
Require / PHP Extensions
xml

What's Changed

New Contributors

Full Changelog: https://github.com/FriendsOfREDAXO/mblock/compare/3.4.7...3.4.8

3.4.7

Für REDAXO
^5.6.0
Veröffentlicht am
14.09.2022
Require / PHP Extensions
xml

3.4.6

Für REDAXO
^5.6.0
Veröffentlicht am
09.08.2022
Require / PHP Extensions
xml

Fix für Gridblock @https://github.com/iceman-fx/gridblock/issues/61
Danke @novinet-dsteffen @iceman-fx

3.4.5

Für REDAXO
^5.6.0
Veröffentlicht am
01.08.2022
Require / PHP Extensions
xml

PRESAVE-Action: Die REX_VALUES werden nach einer PRESAVE Aktion aus dem $_POST geladen.
Dadurch sind Validierungen ohne Neueingabe des Contents jetzt möglich. @skerbis

3.4.4

Für REDAXO
^5.6.0
Veröffentlicht am
06.12.2021
Require / PHP Extensions
xml

Fixes return types for YForm 4 in yform values

3.4.3

Für REDAXO
^5.6.0
Veröffentlicht am
25.11.2021
Require / PHP Extensions
xml

3.4.0 - 3.4.3

  • Fixed: don't remove \' in media widget id
  • Notice: add mblock:change and set rex:change to deprecated. rex:change will remove in next minor version
  • Fixed: refresh disabled button status by drag and drop movements
  • Fixed: don't add empty link and media list option
  • dark mode support for REDAXO >= 5.13 thx to: @eaCe
  • Compatibility: compare fix for REDAXO widgets

3.1.0

Für REDAXO
^5.6.0
Veröffentlicht am
15.01.2019
Require / PHP Extensions
xml

added rex:change event after item movements

3.0.0

Für REDAXO
^5.6.0
Veröffentlicht am
17.12.2018
Require / PHP Extensions
xml

ACHTUNG!!
Dies ist ein Major-Release.

  • MBlock funktioniert nun vollständig mit rex:ready
    Der verwendete Editor sollte rex:ready nutzen.
  • Spezieller Code für Editoren entfernt.

Ausführliche
Release-Notes:
https://github.com/FriendsOfREDAXO/mblock/releases/tag/3.0.0