Skip to content

Releases: FriendsOfREDAXO/mblock

4.6.4

16 Jun 09:17

Choose a tag to compare

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

30 May 15:04
f7b0a16

Choose a tag to compare

What's Changed

  • Fix für MBlock-Popup-ID-Auflösung bei Link, Media, Linklist und Medialist in dynamischen Blöcken by @thorol in #228

New Contributors

Full Changelog: 4.6.2...4.6.3

4.6.2

29 May 22:20

Choose a tag to compare

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

27 May 17:39

Choose a tag to compare

  • 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

07 May 14:44
6cc9a18

Choose a tag to compare

🚨 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

06 May 13:43

Choose a tag to compare

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

4.5.7

27 Feb 21:29

Choose a tag to compare

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 onclick 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. Onclick-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

24 Feb 13:40

Choose a tag to compare

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

15 Feb 18:45
fb0933e

Choose a tag to compare

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

  • Fix: Remove CKEditor 5 filler and placeholder content on submit by @skerbis in #224

Full Changelog: 4.5.4...4.5.5

4.5.4

01 Dec 21:00
cde3b9b

Choose a tag to compare

Verbesserter Gridblock-Support