Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mögl. Datenverlust mit Tiny 5/6b in MBlock Datenblöcken nach Umsortieren #62

Open
ischfr opened this issue Aug 2, 2023 · 9 comments
Labels
help wanted Extra attention is needed

Comments

@ischfr
Copy link

ischfr commented Aug 2, 2023

Das folgende Problem wurde vor einer Weile schon mal im Slack besprochen.
Da es hier bisher keinen Eintrag dazu gibt, stelle ich das mal ein, damit es nicht vergessen geht.

Voraussetzung:

  • ein Modul, das MBlock (mit oder ohne MForm) für unbegrenzte Datenblöcke nutzt
  • in der MBlock-Datenblock-Definition wird dabei jeweils eine Textarea mit Tiny eingesetzt
    (jeder vom Redakteur angelegte Datenblock erhält also eine Tiny-Instanz)
  • ein Artikel-Block im Backend auf Basis dieses Moduls mit mind. drei befüllten MBlock-Datenblöcken

Testfall - Editieren des Blocks:

  • mehrfaches Ändern der Datenblock-Reihenfolge (entweder durch Sortierpfeile oder Drag)
  • anschließendes Speichern
  • erneutes Öffnen zum Editieren

Ergebnis:
Die Editor-Inhalte mancher Blöcke sind nun entweder vertauscht oder gelöscht.

Beobachtungen:

  • Während des Umsortierens scheint sich die Reihenfolge zunächst richtig zu ändern,
    das Problem wird erst nach dem Speichern und erneutem Aufruf sichtbar.
  • So lange nur Datenblöcke neu angelegt oder bearbeitet werden, funktioniert alles.
  • Wenn nur ein Datenblock um eine Position bewegt wird und man anschließend speichert, scheint das Problem nicht zu bestehen.
  • Die Redactor- und CKE5-Addons haben dieses Problem nicht

Vermutung:
Wenn ich es richtig verstehe, sollen vom Tiny-Addon beim Umsortieren von MBlock die TinyEditor-Instanzen beendet und nach Änderung der Reihenfolge erneut Initialisiert werden. Das scheint nicht so gut zu funktionieren. Evtl. ein Reihenfolge/Timing-Problem?

Evtl. verwandt:
tinymce/tinymce#8477
tinymce/tinymce#7753
https://fiddle.tiny.cloud/33faab (Tiny Version auf 5.x setzen und fiddle mit Run neu starten)

@ischfr
Copy link
Author

ischfr commented Aug 2, 2023

Einfaches Modulbeispiel zum Testen (MForm und MBlock benötigt):

INPUT

<?php

$id = 10;

$mform_mb = MForm::factory()
	->addFieldsetArea('TEST', MForm::factory()
		->addTextField("$id.0.name", array('label'=>'Titel'))
		->addTextAreaField("$id.0.text", ['label'=>'Text', 'class'=>'tiny5-editor', 'data-profile'=>'default']) 
	);

echo MBlock::show($id, $mform_mb->show());

?>

OUTPUT

<?php

dump( rex_var::toArray("REX_VALUE[10]") );

?>

@dergel
Copy link
Member

dergel commented Mar 8, 2024

ich werde erstmal die vorhandenen Issues entfernen und einen Stand fertigstellen, mit welchem man ein Release machen kann. Im Moment ist die aktuelle Version von tinymce 6.8.3 .. deswegen verhält sich vielleicht auch einiges schon anders

@dergel dergel closed this as completed Mar 8, 2024
@ischfr
Copy link
Author

ischfr commented Mar 11, 2024

Danke für das neue Release!

Leider bleibt das Issue bestehen – ich habe das gerade mit der neuen Version getestet und habe bei dem o.g. Testaufbau wieder das gleiche Ergebnis wie vorher.

Insofern halte ich es nach wie vor für riskant, TinyMCE in Kombination mit MBlock einzusetzen, da man sich beim Ändern der Reihenfolge und anschließendem Speichern u. U. Inhalte löscht, ohne es gleich zu merken!

@dergel dergel reopened this Mar 11, 2024
@ischfr
Copy link
Author

ischfr commented Mar 25, 2024

Einige weitere Beobachtungen dazu:

Mblock-IDs:

Wenn man für einen MBlock Textfelder und -areas definiert und dann in einem Block mehrfach einsetzt, dann haben die beim Artikel-Editieren zunächst HTML-IDs wie
"rv2_0_name" und "rv3_0_text" im ersten MBlock und
"rv2_1_name" und "rv3_1_text" im zweiten usw ...

Sobald man die MBlock-Sortierung ändert, werden für alle MBlöcke neue IDs nach einem anderem Muster generiert:
"REX_INPUT_VALUE100name" und "REX_INPUT_VALUE100text", bzw.
"REX_INPUT_VALUE101name" und "REX_INPUT_VALUE101text" usw.

Das ist in MBlock wohl Standardverhalten – war mir bisher nicht bewusst, ist aber m.E. für das folgende relevant.

In dieser Betrachtung haben die Textareas die Klasse "tiny-editor", sollen also wie im obigen Modul-Beispiel als Tiny-Editoren genutzt werden.

TinyMCE-Addon - assets/tinymce/scripts/base.js:

Die Funktion "tiny_init" initialisiert neue Editor-Instanzen aus allen Seiten-Elementen mit der CSS-Klasse "tiny-editor". Sowohl beim ersten Aufruf (on rex:ready), als auch beim wiederholten (on rex:change).
Ein wiederholter Aufruf von tiny_init sollte eigentlich eine vorhandene Editor-Instanz mit tinymce.remove(#INITIAL-ID) beenden, bevor er eine neue Instanz initialisiert.
Dazu wird zunächst pro Tiny-Instanz mit der entsprechenden HTML-ID geprüft, ob sie existiert.

Dieser Vorgang passiert anscheinend erst "on rex:change", also nachdem MBlock bereits neu sortiert und neue IDs vergeben hat. Tiny scheint die Editoren intern mit der ursprünglich genutzten ID zu verwalten. Die neu sortierten und generierten IDs greifen deshalb vermutlich jeweils auf den falschen Editor zu. So lange alle diese Editor-Instanzen nur removed werden, sollte das wohl keinen Unterschied machen ...

Es sei denn, das ID-Benennungsmuster ändert sich ... und genau das passiert beim ersten Ändern der Reihenfolge in MBlock (s.o.). Das führt dazu, dass Tiny die ursprünglichen Instanzen mit der neuen ID nicht mehr findet und entfernen kann. Sie bleiben tinymce-intern bestehen, während zusätzliche initialisiert werden.

Das kann man nachvollziehen, wenn man sich am Ende der tiny_init Funktion von Tiny die Anzahl der Instanzen ausgeben lässt:

console.log('Anzahl Tiny Instanzen: ' + tinymce.get().length);

Wenn man am Anfang der tiny_init Funktion die bestehenden Editor-Instanzen in die Console ausgibt, dann kann man nach einem Sort die ursprünglichen Instanzen mit den alten IDs auch sehen:

if( tinymce.get().length ){
	for(let i=0; i<tinymce.get().length; i++) {
		console.log('Alte Instanz: ' + tinymce.get(i).id);
	}
}

Weiter bin ich hier mit meinem begrenzten Wissen nicht gekommen, aber ich vermute einen Zusammenhang mit dem beschriebenen Problem. Die zusätzlichen Instanzen scheinen Tiny bei zusätzlichen Sorts durcheinander zu bringen.

Ich hoffe, dass diese Hinweise helfen können, das Problem zu beheben.

Vielleicht jemand, der mit dem Tiny-Addon und MBlock vertraut ist?

@tbaddade
Copy link
Member

Ich kann das Verhalten nachstellen.
Aber nur, wenn ich direkt den Speicher-Button des Modul nutzen. Wenn ich den Übernehmen-Button verwende, habe ich nicht diesen Datenverlust.

Ich bin mir nicht sicher, ob dass Issue hier richtig ist. Denn für das Aufarbeiten zum Speichern der Daten, Verschieben der Blöcke und Erhalten der IDs ist MBlock verantwortlich.

@tbaddade
Copy link
Member

Die Daten gehen verloren, weil das name Attribute beim Verschieben der Blöcke angepasst wird und es dadurch bei den Blöcken zu Dopplungen von name kommt.

@alxndr-w alxndr-w added the help wanted Extra attention is needed label Sep 8, 2024
@alxndr-w
Copy link
Member

alxndr-w commented Sep 8, 2024

@alxndr-w alxndr-w closed this as not planned Won't fix, can't repro, duplicate, stale Sep 8, 2024
@tbaddade
Copy link
Member

tbaddade commented Sep 8, 2024

Weshalb wird das Issue genau geschlossen?
Nur weil Joachim den Support für Mblock einstellt, muss ja nicht der Support generell eingestellt werden. Ich halte das Addon immer noch für recht wichtig.

@alxndr-w
Copy link
Member

alxndr-w commented Sep 8, 2024

Es gibt ja den Nachfolger mit dem MForm Repeater, da funktioniert das mit den Editoren im übrigen auch nicht.

Wäre vielleicht gut, erstmal nach vorne zu schauen und das dort zu lösen.

Ansonsten Issue gerne wieder aufmachen. Nur 4-5% der Issues, die ich aktuell schließe, werden nochmal geöffnet.

Ein Fix könnte auch seit einem Jahr beigesteuert werden.

@tbaddade tbaddade reopened this Sep 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

4 participants