Repository navigation
Flex-Repeater: Slot-Werte roh lesen, Entities nur noch als Rückfall umwandeln - #463
Conversation
…mwandeln
Beim Lesen eines Slot-Werts wurden Entities umgewandelt, bevor das JSON
gelesen wurde. Für den escapten Platzhalter (decode('REX_VALUE[1]')) ist das
richtig; per Slot-Id kommt der Wert aber roh aus der Datenbank, und Entities
darin gehören zum Inhalt der Felder.
Ausgabe: Ein " in einem Feld (Linktitel mit Anführungszeichen aus
TinyMCE) machte das JSON ungültig, decode() lieferte [] und das Modul blieb
leer. Als Text getippte Tags (<h2>) kamen als Markup zurück.
Eingabemaske: Beim Öffnen eines Slices stand getippter Text als Markup im
Editor und wurde so gespeichert.
decodeRaw() liest zuerst das rohe JSON und wandelt Entities nur um, wenn das
scheitert; der Aufruf mit dem escapten Platzhalter liefert dasselbe wie
bisher. dataVersion() nutzt decodeRaw(). MFormValueHandler liest ohne
htmlspecialchars_decode(): Mit ENT_NOQUOTES ändert es kein Zeichen der
JSON-Struktur, sondern nur die Feldwerte.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (5)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. Moin WalkthroughDie Änderung dekodiert gültiges JSON zuerst unverändert. Dadurch bleiben HTML-Entities in gespeicherten Werten und Repeater-Daten erhalten. Neue Tests prüfen das Laden von Werten und verschiedene Repeater-Eingaben. ChangesEntity-Erhaltung beim JSON-Decoding
Priority: ➖ Normal Estimated code review effort: 2 (Simple) | ~15 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to No actionable merge-blocking issue is established; the change is ready for normal merge checks. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Danke, @anveno! Ich habe den PR nach dem Merge noch einmal gegengeprüft und zwei Dinge ergänzt. Gegencheck
Was ich anders bzw. zusätzlich gemacht habe
Releases: 10.0.2 und 9.5.3. 🤖 Generated with Claude Code |
…lt Entities, Release 10.0.2 (#464) Die Flex-Tab-Leiste hob Bootstraps float:right von .pull-right auf. Rechte Reiter bekommen jetzt order:1, der erste davon margin-left:auto. MBlockToRepeaterConverter::convertData() liest wie decodeRaw() (#463) zuerst roh; ein " im Editor-Inhalt liess die Konvertierung sonst scheitern. CHANGELOG nennt jetzt auch #463, Doku zu decode()/values() angepasst. Fixes #462 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…kport #463), Release 9.5.3 (#465) Per Slot-Id kommt der Wert roh aus der Datenbank; decode() wandelte Entities vor dem json_decode() um. Ein " aus TinyMCE machte das JSON ungueltig (Modul leer), <h2> als Text kam als Markup zurueck. decode() und MBlockToRepeaterConverter::convertData() lesen jetzt zuerst roh und wandeln Entities nur als Rueckfall um; MFormValueHandler liest ohne htmlspecialchars_decode(). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Betroffen: MForm 10.0.0, 10.0.1 und
main(ff6f911), REDAXO 5.21.4, PHP 8.4. Der Zweig 9.x (9.5.2) hatdieselben Stellen, dort nicht nachgestellt.
Problem
Beim Lesen eines Slot-Werts werden Entities umgewandelt, bevor das JSON gelesen wird. Für den escapten
Platzhalter (
decode('REX_VALUE[1]')) ist das richtig. Per Slot-ID (decode(1)) kommt der Wert aber roh ausder Datenbank, und Entities darin gehören zum Inhalt der Felder.
MFormOutputHelper::decodeRaw(), damitdecode(),values(),value(),isRepeater()):Steht in einem Feld ein
", ist das JSON nach dem Umwandeln ungültig unddecode()liefert[]. Dasganze Modul bleibt im Frontend leer. TinyMCE schreibt Anführungszeichen in Attributen genau so, z. B. bei
einem Linktitel
Sagt "Hallo". Als Text getippte Tags (<h2>) kommen als echtes Markup zurück.MFormValueHandler::loadRexVars()):htmlspecialchars_decode()vor demjson_decode().Beim Öffnen eines Slices steht getippter Text als Markup im Editor und wird beim Speichern so übernommen,
Teile gehen verloren.
Reproduktion
Repeater mit TinyMCE-Feld, Ausgabe über
MFormRepeaterHelper::decode(1).Sagt "Hallo"speichern → Frontend leer.<h2>Titel</h2>tippen und speichern → im Frontend eine Überschrift; Slice öffnen und wieder speichern→ gespeichert ist die Überschrift statt des Texts.
Änderung
decodeRaw()liest zuerst das rohe JSON. Nur wenn das scheitert, werden wie bisher Entities umgewandelt undder
<br>-Rückfall angewendet. Der Aufruf mit dem escapten Platzhalter liefert dasselbe wie vorher.dataVersion()nutztdecodeRaw().MFormValueHandlerliest ohnehtmlspecialchars_decode(). MitENT_NOQUOTESwandelt es nur<,>und
&um, also kein Zeichen der JSON-Struktur: Es hat nie entschieden, ob ein Wert lesbar ist, sondernnur die Feldwerte verändert.
Tests
RepeaterEntityDecodeTest(Unit) undValueHandlerEntityTest(REDAXO): ohne die Änderung 6 rot, mit ihrläuft die ganze Suite. Im Browser vorher und nachher geprüft.
Hinweise
decode(1)Entities in den Werten umwandelt, bekommt die Werte jetztso, wie sie gespeichert sind.
MBlockToRepeaterConverter::convertData(),rex_var_custom_link_multiund imYForm-Value
custom_link_multi; hier nicht angefasst.gleich, MBlock lädt seine Werte selbst.
🤖 Generated with Claude Code
Summary by CodeRabbit