Come ottenere l'input dell'editor TinyMCE quando viene utilizzato nel front-end?

17 feb 2012, 08:40:30
Visualizzazioni: 36.2K
Voti: 8

Non sono sicuro del perché non sia riuscito a trovare questa informazione, ma qualcuno sa come ottenere l'input dell'editor TinyMCE? Lo sto utilizzando nel front-end e voglio essere in grado di salvare nel database qualsiasi cosa l'utente abbia digitato nel TinyMCE, ma non riesco a trovare il modo migliore per catturare quel valore.

Le due soluzioni che ho implementato con un certo successo sono:

  1. tinyMCE.activeEditor.getContent(); - Questa sembra ottenere solo il valore dell'editor visuale, quindi se sono nell'editor HTML e faccio delle modifiche e poi salvo, queste non vengono rilevate.

  2. $('#html_text_area_id').val(); - Questa è l'opposto, sembra ottenere solo il valore dell'editor HTML.

So che c'è un modo migliore - semplicemente non riesco a trovarlo...

P.S. Sì, implementerò misure di sicurezza per assicurarmi che le persone non possano compromettere il database.

2
Commenti

Quando inizializzi tinyMCE, di solito lo colleghi a un textarea, quindi usa semplicemente l'id di quel textarea con il metodo val() di jQuery

Bainternet Bainternet
17 feb 2012 09:32:41

Sì, ho provato ma ottiene solo il valore dell'editor html. Se sono nell'editor visuale, apporto modifiche e poi provo a salvare, tutte le modifiche fatte nell'editor visuale non vengono salvate.

Sam Sam
17 feb 2012 22:49:19
Tutte le risposte alla domanda 6
6
23

A quanto pare WordPress tiene traccia del tipo di editor (visual o HTML) attivo come una classe che viene aggiunta al wrapper del contenuto, quindi ecco una soluzione che ti permetterà di ottenere il contenuto più recente nell'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
Commenti

Hmm, idea interessante. La proverò e vi farò sapere. Grazie!

Sam Sam
18 feb 2012 01:48:55

Ha funzionato perfettamente. Grazie per l'aiuto! Se avessi abbastanza reputazione voterei la tua risposta.

Sam Sam
18 feb 2012 19:27:56

Felice che abbia funzionato per te, puoi accettare la risposta come corretta e sarà più che sufficiente :)

Bainternet Bainternet
18 feb 2012 20:09:25

Ci ho messo molto tempo a trovare una risposta a questo. Avevo anche bisogno di un modo per impostare il contenuto. Nel caso qualcun altro abbia bisogno di un modo per impostare il contenuto, ecco una Gist con entrambe le funzioni (get/set): https://gist.github.com/RadGH/523bed274f307830752c. Funziona anche con ID personalizzati di wp_editor, non solo con quello predefinito.

Radley Sustaire Radley Sustaire
17 lug 2014 21:46:21

Molto utile anche per me ;)

Vignesh Pichamani Vignesh Pichamani
15 ott 2014 14:37:55

Questo non ha funzionato per me. Tuttavia, mi ha dato un'idea su come potrebbe essere realizzato. In una risposta separata, ho usato il concetto di questa risposta per identificare quale scheda è quella attiva ma utilizzando il colore di sfondo come identificatore.

Abel Melquiades Callejo Abel Melquiades Callejo
15 dic 2015 22:43:29
Mostra i restanti 1 commenti
0

Questo è il codice che ho aggiunto al mio javascript, proprio prima che il form venga inviato.

// Trova e cicla attraverso tutti gli editor 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 );

    // Se l'editor è in modalità "visual" allora dobbiamo fare qualcosa.
    if ( editor && container.hasClass( 'tmce-active' ) ) {
        // Salva il contenuto dall'editor nell'area di testo:
        editor.save();
    }
});
2 ago 2014 17:54:35
1

Questo ha funzionato per me:

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

Dove description è l'ID dell'editor tinymce e il codice dopo il else della risposta accettata non ha funzionato per me.

23 mar 2017 08:21:44
Commenti

Per favore, spiega in cosa differisce dalla risposta accettata? Quali nuove informazioni stai fornendo?

Fayaz Fayaz
23 mar 2017 09:28:59
0

Ho avuto bisogno di molto più codice per farlo funzionare, e ricevevo anche un errore JavaScript: Deprecated TinyMCE API call: <target>.onKeyUp.add(..) Questo era causato da un aggiornamento di WordPress dalla versione 3.x alla 4. Quindi ho dovuto prima pulire la cache del browser.

Inizialmente ho aggiunto una callback al filtro wp tiny_mce_before_init nel mio file functions.php, questo mi ha permesso di aggiungere una funzione di callback js da eseguire quando gli editor vengono inizializzati:

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

/**
 * Filtro callback per aggiungere event listener all'editor tinymce.
 * @param  array $init Un array di funzioni js di setup come stringhe.
 * @return array       Restituisce un nuovo array di stringhe di funzioni js.
 */
function filter_cb_mce_before_init( array $init ) {
        $init['setup'] = "function(ed){
                if(get_tinymce_content)  //non richiesto, lo uso come flag per verificare se sono nella pagina corretta
                    ed.on('change', function(){ get_tinymce_content() });
            }";
        return $init;
    }

Poi la funzione JavaScript per fare qualsiasi cosa si voglia con il contenuto quando cambia. Aggiungi questo JavaScript usando wp_enqueue_scripts alla pagina che desideri.

  /**
   * Ottiene il contenuto dell'editor 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} Restituisce il contenuto
   */
  function get_tinymce_content(){

    //cambia con il nome dell'editor impostato in 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);
}

Il codice ha funzionato quando ho usato il seguente per stampare l'editor in qualsiasi pagina:

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

Puoi ottenere i contenuti in base alla modalità corrente dell'editor.

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();
    }

La scheda Visuale ha una classe switch-tmce che puoi usare per identificarla come scheda. Saprai che è stata selezionata se ha il colore di sfondo più chiaro. Quindi, puoi usare anche questo per determinare quale delle due schede è attiva.

Questa è una soluzione adattiva basata sulla risposta di Bainternet. Probabilmente ci sono altri modi migliori per farlo, ma questo ha funzionato bene per me.

15 dic 2015 22:37:00
0

Puoi anche utilizzare l'evento addeditor:

  /// Scatta quando un editor viene aggiunto alla collezione EditorManager.
  tinymce.on('addeditor', function( event ) {
    var editor = event.editor;
    var $textarea = $('#' + editor.id);
    console.log($textarea.val());
  }, true );

Documentazione dell'evento 'addeditor' di TinyMCE

15 nov 2016 19:16:25