Cum să obții inputul unui editor TinyMCE când îl folosești în front-end?

17 feb. 2012, 08:40:30
Vizualizări: 36.2K
Voturi: 8

Nu sunt sigur de ce nu am reușit să găsesc acest lucru, dar știe cineva cum să obțină inputul din editorul TinyMCE? Îl folosesc în front-end și vreau să pot salva în baza de date ceea ce a introdus utilizatorul în TinyMCE, dar nu pot găsi cea mai bună metodă de a capta acea valoare.

Cele două soluții pe care le-am implementat cu oarecare succes sunt:

  1. tinyMCE.activeEditor.getContent(); - Aceasta pare să obțină doar valoarea din editorul vizual, așa că dacă sunt în editorul HTML și fac modificări și apoi salvez, acestea nu sunt preluate.

  2. $('#html_text_area_id').val(); - Aceasta este opusul, pare să obțină doar valoarea din editorul HTML.

Știu că există o metodă mai bună - doar că nu reușesc să o găsesc...

P.S. Da, voi implementa măsuri de securitate pentru a mă asigura că utilizatorii nu pot compromite baza de date.

2
Comentarii

Când inițializezi tinyMCE, de obicei îl legi la un textarea, așa că folosește id-ul acelui textarea cu val() din jQuery

Bainternet Bainternet
17 feb. 2012 09:32:41

Da, am încercat asta dar obțin doar valoarea din editorul html. Dacă sunt în editorul vizual, fac modificări și apoi încerc să salvez, modificările făcute în editorul vizual nu sunt salvate.

Sam Sam
17 feb. 2012 22:49:19
Toate răspunsurile la întrebare 6
6
23

Se pare că WordPress ține evidența tipului de editor (vizual sau HTML) care este activ ca o clasă adăugată la wrapper-ul de conținut, așa că iată o soluție care va obține cel mai recent conținut din editor

function get_tinymce_content(){
    if (jQuery("#wp-content-wrap").hasClass("tmce-active")){
        return tinyMCE.activeEditor.getContent();
    }else{
        return jQuery('#html_text_area_id').val();
    }
}
17 feb. 2012 23:12:30
Comentarii

Hmm, idee interesantă. O să testez asta și revin cu feedback. Mulțumesc!

Sam Sam
18 feb. 2012 01:48:55

A funcționat perfect. Mulțumesc pentru ajutor! Dacă aș fi avut suficiente puncte de reputație, aș fi votat soluția.

Sam Sam
18 feb. 2012 19:27:56

Mă bucur că a funcționat, poți marca răspunsul ca acceptat - asta e la fel de bine :)

Bainternet Bainternet
18 feb. 2012 20:09:25

A durat mult timp să găsesc un răspuns pentru asta. Aveam nevoie și de o metodă pentru a seta conținutul. În cazul în care și altcineva are nevoie de o modalitate de a seta conținutul, iată un Gist cu ambele funcții (get/set): https://gist.github.com/RadGH/523bed274f307830752c. Aceasta funcționează și cu ID-uri personalizate ale wp_editor, nu doar cu cele implicite.

Radley Sustaire Radley Sustaire
17 iul. 2014 21:46:21

Foarte folositor și pentru mineee ;)

Vignesh Pichamani Vignesh Pichamani
15 oct. 2014 14:37:55

Aceasta nu a funcționat pentru mine. Totuși, mi-a dat o idee despre cum ar putea fi realizat. Într-un răspuns separat, am folosit conceptul acestui răspuns pentru a identifica care tab este cel activ, dar folosind culoarea de fundal ca identificator.

Abel Melquiades Callejo Abel Melquiades Callejo
15 dec. 2015 22:43:29
Arată celelalte 1 comentarii
0

Acesta este codul pe care l-am adăugat în javascript, chiar înainte ca formularul să fie trimis.

// Găsește și parcurge toți editorii TinyMCE.
jQuery('#the-form').find( '.wp-editor-area' ).each(function() {
    var id = jQuery( this ).attr( 'id' ),
        sel = '#wp-' + id + '-wrap',
        container = jQuery( sel ),
        editor = tinyMCE.get( id );

    // Dacă editorul este în modul "vizual", atunci trebuie să facem ceva.
    if ( editor && container.hasClass( 'tmce-active' ) ) {
        // Salvează conținutul din editor în textarea:
        editor.save();
    }
});
2 aug. 2014 17:54:35
1

Aceasta a funcționat pentru mine:

if (jQuery("#wp-description-wrap").hasClass("tmce-active")){
    description1 = tinyMCE.activeEditor.getContent( { format : 'html' } );
}else{
    description1 = jQuery('[name="description"]').val();

Unde description este ID-ul editorului tinymce iar codul după else din răspunsul acceptat, nu a funcționat în cazul meu.

23 mar. 2017 08:21:44
Comentarii

Te rog explică, în ce diferă de răspunsul acceptat? Ce informații noi oferi?

Fayaz Fayaz
23 mar. 2017 09:28:59
0

Am avut nevoie de mult mai mult cod pentru a-l face să funcționeze și am primit și o eroare JavaScript: Deprecated TinyMCE API call: <target>.onKeyUp.add(..) Aceasta a fost cauzată de o actualizare WordPress de la versiunea 3.x la 4. Așa că a trebuit mai întâi să golesc cache-ul browserului.

În primul rând, am adăugat un callback la filtrul wp tiny_mce_before_init în fișierul meu functions.php, acest lucru mi-a permis să adaug o funcție de callback js care să fie declanșată când editorii sunt inițializați:

add_filter( 'tiny_mce_before_init', array( $obj, 'filter_cb_mce_before_init' ) );

/**
 * Funcție de callback pentru filtru pentru a adăuga ascultători de evenimente la editorul tinymce.
 * @param  array $init Un array de funcții js de setup ca șiruri de caractere.
 * @return array       Returnează un nou array de șiruri de funcții js.
 */
function filter_cb_mce_before_init( array $init ) {
        $init['setup'] = "function(ed){
                if(get_tinymce_content)  //nu este necesar, îl folosesc ca flag pentru a verifica dacă sunt pe pagina corectă
                    ed.on('change', function(){ get_tinymce_content() });
            }";
        return $init;
    }

Apoi, funcția JavaScript pentru a face orice este dorit cu conținutul atunci când acesta se schimbă. Adăugați acest JavaScript folosind wp_enqueue_scripts la pagina dorită.

  /**
   * Obține conținutul editorului tinyMCE.
   * @link http://wordpress.stackexchange.com/questions/42652/how-to-get-the-input-of-a-tinymce-editor-when-using-on-the-front-end
   * @return {string} Returnează conținutul
   */
  function get_tinymce_content(){

    //schimbă la numele editorului setat în wp_editor()
    var editorID = 'my_editor_id';

    if (jQuery('#wp-'+editorID+'-wrap').hasClass("tmce-active"))
        var content = tinyMCE.get(editorID).getContent({format : 'raw'});
    else
        var content = jQuery('#'+editorID).val();

    console.log(content);
}

Codul a funcționat când am folosit următoarele pentru a afișa editorul pe orice pagină:

<?php wp_editor( @$event->description, 'my_editor_id', array(
    'media_buttons' => false,
    'textarea_name' => 'data[description]',
    'quicktags'     => array("buttons"=>"link,img,close"),
) ); ?>
5 ian. 2015 07:44:19
0

Puteți obține conținutul în funcție de modul curent al editorului.

function get_tinymce_content()
    {
    if (jQuery(".switch-tmce").css('background-color')=='rgb(245, 245, 245)')
        return tinyMCE.activeEditor.getContent();
    else
        return jQuery('#html_text_area_id').val();
    }

Tab-ul Vizual are o clasă switch-tmce pe care o puteți folosi pentru a-l identifica ca tab. Veți ști că este activat dacă are culoarea de fundal mai deschisă. Astfel, puteți folosi această informație pentru a determina care dintre cele două tab-uri este activ.

Aceasta este o soluție adaptivă bazată pe Bainternet's răspuns. Probabil că există și alte metode mai bune de a face acest lucru, dar aceasta a funcționat bine pentru mine.

15 dec. 2015 22:37:00
0

De asemenea, poți folosi evenimentul addeditor:

  /// Se declanșează când un editor este adăugat în colecția EditorManager.
  tinymce.on('addeditor', function( event ) {
    var editor = event.editor;
    var $textarea = $('#' + editor.id);
    console.log($textarea.val());
  }, true );

Documentația evenimentului 'addeditor' din TinyMCE

15 nov. 2016 19:16:25