web-dev-qa-db-fra.com

Comment récupérer le texte modifié dans Joomla Editor?

J'ai une page qui permet à l'utilisateur de modifier le texte d'introduction d'un article particulier, et j'utilise ce code pour lui permettre de le faire:

$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);

Le problème est que lorsque je vais enregistrer les modifications avec jQuery/AJAX, je ne peux accéder qu'au code HTML d'origine avec lequel l'éditeur a été initialisé. J'ai utilisé TinyMCE editor lors du développement, mais les utilisateurs préfèrent JCE. Par conséquent, les réponses spécifiques à l'éditeur trouvées avec Google ne me conviennent pas.

Comment obtient-on le texte édité que l'utilisateur souhaite sauvegarder pour être posté? J'avais supposé que ceci, ou similaire, fonctionnerait, mais clairement cela ne fonctionne pas:

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

Si je me souviens bien, JCE utilise un iframe pour le contenu. Ainsi, vous devez d'abord obtenir une référence à l'iframe, puis accéder au document interne de l'iframe, qui fournira le innerHTML en tant que texte que vous recherchez. Je l'ai fait une fois, mais malheureusement, je n'ai pas accès au code avant dimanche.

Je commencerais par quelque chose comme ceci (c'est comme ça que je m'en souviens, je ne peux pas le tester pour le moment):

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

CurrentText étant le "nouveau" texte.

3
elk

La question par "PIB" était

"Comment accéder au texte édité que l’utilisateur veut sauvegarder pour pouvoir être posté ?.

"elk" m'a lancé sur la bonne voie, mais j'ai eu recours à jQuery pour obtenir le texte modifié. C'est ce que j'ai fait:

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

Où "Array_ifr "est l’identifiant du iframe the JCE editor uses. J'ai trouvé cela en examinant les éléments avec Firebug.

Cela a fonctionné pour moi dans un Joomla! environnement, mais je ne vois pas que ce soit un problème dans les autres. J'espère que cela aide les autres à coder.

2
Sheldon Seale

À ma connaissance, il n'y a aucune méthode. Vous devez stocker le texte original, puis faire une comparaison lors de la soumission.

Plus de détails, donc l'éditeur est généralement défini sur un niveau global, mais les utilisateurs peuvent choisir de modifier leur profil pour sélectionner leur éditeur préféré.

Joomla 3.x + era charge l'éditeur en utilisant un JFormFieldEditor qui charge l'éditeur sélectionné. L'utilisateur apporte des modifications dans l'éditeur, mais comme vous l'avez indiqué, elles ne sont pas immédiatement reflétées dans le champ. par exemple. dans un article qui serait le #jform_articletext élément.

Cependant, pour la plupart des éditeurs, l’élément de formulaire jform[articletext] a le contenu mis à jour. (Cela ne semble pas s'appliquer aux AJAX éditeurs que j'ai vus).

Je ne fais que spéculer ici, mais j'imagine qu'ils (les éditeurs) associent un événement submit au formulaire principal et injectent leur contenu dans le champ à ce moment-là. L'autre endroit que vous pouvez vérifier est le lien "Basculer l'éditeur" que JCE et TinyMCE ont.

Dans un article, TinyMCE a le déclencheur d'événement cliquer associé au bouton "Basculer l'éditeur":

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

Ce qui provoque le vidage du contenu de l'éditeur vers le champ #jform_articletext.

Une autre approche peut être d’envoyer un événement submit à l’éditeur actif, l’amenant éventuellement à le mettre à jour avec le texte modifié.

Étant donné que chaque éditeur peut implémenter le traitement de submit d'une manière différente et que tous ne possèdent pas le bouton "Basculer l'éditeur" de MCE, vous devrez peut-être créer un cas spécial pour chaque éditeur que vous souhaitez prendre en charge.

1
Craig

essayez de mettre juste avant

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

ou

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

le texte de l'éditeur sera donc copié dans cette variable newHTML variable

bien sûr, votre code javascript doit être dans le même fichier sous forme php (pas dans un fichier js autonome)

1

Ce fil est assez ancien mais cela pourrait aider les autres ...

la réponse de wapiti est presque exactement exacte, sauf que je devais modifier

var currentText = innerDoc.body.innerHTML;
0
mhall