Wie rufe ich den GEÄNDERTEN Text aus dem Joomla Editor ab?


7

Ich habe eine Seite, auf der der Benutzer den Intro-Text eines bestimmten Artikels bearbeiten kann, und ich verwende diesen Code, um dies zu ermöglichen:

$editor = & JFactory::getEditor();
$params = array('smilies'=> '0' ,'style'  => '0' ,'layer'  => '0' ,'table'  => '0' ,'clear_entities'=>'0');
echo $editor->display('introtext',$this->introtext  , '96%', '100px', 250, 40, false, null, null, null, $params);

Das Problem ist, dass ich beim Speichern der Änderungen mit jQuery / AJAX nur auf den ursprünglichen HTML-Code zugreifen kann, mit dem der Editor initialisiert wurde. Ich habe während der Entwicklung den TinyMCE-Editor verwendet, aber die Benutzer bevorzugen JCE, sodass für mich gefundene editerspezifische Antworten nicht ausreichen.

Wie kommt man zu dem bearbeiteten Text, den der Benutzer speichern möchte, um gepostet zu werden? Ich hatte angenommen, dass dies oder ähnliches funktionieren würde, aber es funktioniert eindeutig nicht:

var newHTML = $('#introtext').val();

1
Ich muss wirklich anfangen, JCE zu testen, da die Leute es zu lieben scheinen. Nur als Randnotiz (wenn Sie Joomla 1.5 nicht verwenden), brauchen Sie das &vorher nicht JFactory. Bietet JCE in seiner "API" nicht etwas an, das geänderte Inhalte erhalten kann? Ich bin mir nicht sicher, ob ihre Unterstützung kostenlos ist oder nicht, aber es könnte sich lohnen, sie zu fragen
Lodder,

@Lodder Sie benötigen das &vorher nicht, JFactorywenn Sie PHP5 verwenden - ich denke nicht, dass dies notwendigerweise mit einer bestimmten Version von Joomla zusammenhängt (abgesehen von der Tatsache, dass <1.5 unter PHP5 möglicherweise nicht funktioniert)? joomla.stackexchange.com/questions/411/…
MrWhite

@ w3d - Richtig. Ich bin mir nicht sicher, was ich dort gedacht habe
Lodder

Gute Punkte ... der Preis für Ausschneiden / Einfügen ... nicht sicher, ob ich seit '03, lol
GDP

Antworten:


3

Wenn ich mich richtig erinnere, verwendet JCE einen Iframe für den Inhalt. Daher müssen Sie zuerst einen Verweis auf den Iframe abrufen und dann auf das innere Dokument des Iframes zugreifen, das das innere HTML als den gesuchten Text bereitstellt. Ich habe das einmal gemacht, aber leider kann ich erst am Sonntag auf den Code zugreifen.

Ich würde mit so etwas beginnen (so erinnere ich mich daran, kann es momentan nicht testen):

var iframe = document.getElementById('jform_articletext_ifr');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var currentText = innerDoc.innerHTML;

Mit currentText als "neuem" Text.


Dies scheint auch bei TinyMCE der Fall zu sein, daher sind weitere Nachforschungen erforderlich, aber leider musste ich meinen Code ohne dieses Wissen wiederholen, sodass ich ihn nicht überprüfen kann. Vielen Dank für die Anweisung - würde gerne von jemandem hören, der dies verfolgt und bestätigt!
BIP

2

Die Frage nach "BIP" war

"Wie kommt man zu dem bearbeiteten Text, den der Benutzer speichern möchte, um gepostet zu werden?"

"elk" hat mich auf den richtigen Weg gebracht, aber ich habe auf jQuery zurückgegriffen, um den bearbeiteten Text tatsächlich zu erhalten. Das habe ich getan:

jQuery ("# ​​Array_ifr"). content (). find ("body"). find ("p"). html ();

Wo " Array_ifr" ist die ID des iframe the JCE editor uses. Ich fand dies, indem ich die Elemente mit Firebug untersuchte.

Das hat bei mir in einem Joomla funktioniert! Umwelt, aber ich sehe es nicht als Problem in anderen. Hoffe das hilft anderen Leuten bei ihrer Codierung.


Dies funktioniert für einen einzelnen Absatz. Wenn mehr Text vorhanden ist (mehrere Absätze und / oder andere Tags), löschen Sie das letzte ".find ('p')". Dadurch wird der gesamte Inhalt zurückgegeben.
Sheldon Seale

1

Es gibt keine mir bekannte Methode. Sie müssen den Originaltext speichern und bei der Übermittlung einen Vergleich durchführen.

Weitere Details, sodass der Editor im Allgemeinen auf globaler Ebene festgelegt ist, Benutzer jedoch ihr Profil ändern können, um ihren bevorzugten Editor auszuwählen.

Joomla 3.x + era lädt den Editor mit einem, JFormFieldEditorder den ausgewählten Editor lädt . Der Benutzer nimmt Änderungen im Editor vor, aber wie Sie bemerkt haben, werden sie nicht sofort im Feld angezeigt. zB in einem Artikel, der das #jform_articletextElement wäre.

Für die meisten Editoren verfügt das Formularelement jedoch zum Zeitpunkt des Speicherns des Elements jform[articletext]über den aktualisierten Inhalt. (Dies scheint nicht für die AJAX-Editoren zu gelten, die ich gesehen habe).

Ich spekuliere hier nur, aber ich stelle mir vor, dass sie (die Redakteure) ein submitEreignis an das Hauptformular anhängen und ihren Inhalt an diesem Punkt in das Feld einfügen. Der andere Ort, den Sie überprüfen können, ist der Link "Toggle Editor", den JCE und TinyMCE haben.

In einem Artikel hat TinyMCE diesen Klickereignisauslöser an die Schaltfläche "Editor umschalten" angehängt:

function onclick(event) {
    tinyMCE.execCommand('mceToggleEditor', false, 'jform_articletext');
    return false;
}

Dadurch wird der Inhalt des Editors in das Feld verschoben #jform_articletext.

Ein anderer Ansatz kann darin bestehen, ein submitEreignis an den aktiven Editor zu senden , der hoffentlich dazu führt, dass das Feld mit dem geänderten Text aktualisiert wird.

Da jeder Editor die Behandlung submitauf unterschiedliche Weise implementieren kann und nicht alle über die Schaltfläche "Editor umschalten" von MCE verfügen, müssen Sie möglicherweise für jeden Editor, den Sie unterstützen möchten, einen Sonderfall erstellen.


1
Ein Vergleich mit was? Das OP scheint überhaupt nicht auf den neu bearbeiteten Text zugreifen zu können?
MrWhite

Meine schlechte, ich verrückte eine zu einfache Antwort basierend auf angenommenen Kenntnissen, im Grunde ist jeder Editor eine andere Javascript-Anwendung, Joomla erwartet nur, dass das Feld, an das der Editor angehängt ist, zum Zeitpunkt der Übermittlung aktualisiert wird.
Craig

1

versuche kurz vorher zu setzen

<?php echo $editor->save('introtext'); ?>
var newHTML = $('#introtext').val();

oder

var newHTML = <?php echo $editor->getContent('introtext'); ?>

Daher wird der Text aus dem Editor in diese neue HTML- Variable kopiert

Natürlich muss sich Ihr Javascript-Code in derselben PHP-Formulardatei befinden (nicht in einer eigenständigen JS-Datei).


1
Haben Sie diesen Code vor dem Posten getestet? (Wenn nicht, machen Sie es sich bitte zur Gewohnheit, damit zukünftige Forscher Ihre Lösungen nahtlos implementieren können.) Sollte newHTMLder von PHP gelieferte Wert nicht in Anführungszeichen gesetzt werden?
Mickmackusa

0

Dieser Thread ist ziemlich alt, aber das könnte anderen helfen ...

Die Antwort von Elk ist fast genau richtig, außer dass ich sie ändern musste

var currentText = innerDoc.body.innerHTML;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.