Cargar tinyMCE / wp_editor () a través de AJAX [duplicado]

4

Hay varias preguntas sobre esto ( como esto , o that ), pero ninguno de ellos me ofrece una solución .

La situación: Tengo un metabox. Dentro de este metabox quiero agregar dinámicamente editores tinyMCE.

El código:

PHP:

add_action('wp_ajax_insert_tinymce', 'insert_tinymce');
function insert_tinymce(){
    wp_editor('','editor-id');
    exit;
}

JS:

$.post(
    global.ajaxurl,
    {
        action : 'insert_tinymce'
    },
    function(response) {

        $(response).appendTo('#target-div');

        console.log(tinyMCE); // no instance of 'editor-id'
        console.log(tinyMCEPreInit.mceInit); // 'editor-id' not listed
        console.log(tinyMCE.activeEditor); // null
    }
);

El resultado es una ventana de editor (con html y pestañas visuales), un botón de carga y un área de texto pero completamente sin botones.

Lo que intenté (como se sugiere en las otras preguntas):

// In the response function
tinyMCE.init({
    skin : "wp_theme",
    mode : "exact",
    elements : "editor-id",
    theme: "advanced"
});


// In the response function
tinyMCE.init(tinyMCEPreInit.mceInit['editor-id']);


// in the PHP
ob_start();
wp_editor( '', 'editor-id' );
echo ob_get_clean();

Este primero funciona, pero tendría que establecer muchas configuraciones manualmente, además de que no se muestren mis botones personalizados.

El segundo obviamente no funciona, porque no hay editor-id listado en tinyMCEPreInit.mceInit

El tercero (búfer de salida) no hace ninguna diferencia.

Me he dado cuenta de que wp_editor() agrega las instancias de tinyMCE a tinyMCEPreInit y lo agrega a través de admin_print_footer_scripts hook. Así que tendría que actualizar dinámicamente tinyMCEPreInit (sin perder la instancia del editor principal) y luego disparar tinyMCE.init(tinyMCEPreInit.mceInit['editor-id']) - MAYBE

Cualquier ayuda muy apreciada ;-)

¡Gracias!

    
pregunta xsonic 26.10.2012 - 11:28

1 respuesta

3

tu publicación aquí me ayudó a encontrar una solución. Junto con la propiedad mceInit, también tuve que recuperar el qtInit que wp_editor genera también.

El siguiente es el código relevante dentro de mi clase. Básicamente he ejecutado wp_editor para que se genere el javascript. Uso ganchos para recuperar el javascript, de modo que pueda repetirlo en la respuesta ajax.

// ajax call to get wp_editor
add_action( 'wp_ajax_wp_editor_box_editor_html', 'wp_editor_box::editor_html' );
add_action( 'wp_ajax_nopriv_wp_editor_box_editor_html', 'wp_editor_box::editor_html' );

// used to capture javascript settings generated by the editor
add_filter( 'tiny_mce_before_init', 'wp_editor_box::tiny_mce_before_init', 10, 2 );
add_filter( 'quicktags_settings', 'wp_editor_box::quicktags_settings', 10, 2 );

class wp_editor_box {

    /*
    * AJAX Call Used to Generate the WP Editor
    */

    public static function editor_html() {
        $content = stripslashes( $_POST['content'] );
        wp_editor($content, $_POST['id'], array(
            'textarea_name' => $_POST['textarea_name']
        ) );
        $mce_init = self::get_mce_init($_POST['id']);
        $qt_init = self::get_qt_init($_POST['id']); ?>
        <script type="text/javascript">
            tinyMCEPreInit.mceInit = jQuery.extend( tinyMCEPreInit.mceInit, <?php echo $mce_init ?>);
            tinyMCEPreInit.qtInit = jQuery.extend( tinyMCEPreInit.qtInit, <?php echo $qt_init ?>);
        </script>
        <?php
        die();
    }

    /*
    * Used to retrieve the javascript settings that the editor generates
    */

    private static $mce_settings = null;
    private static $qt_settings = null;

    public static function quicktags_settings( $qtInit, $editor_id ) {
        self::$qt_settings = $qtInit;
                    return $qtInit;
    }

    public static function tiny_mce_before_init( $mceInit, $editor_id ) {
        self::$mce_settings = $mceInit;
                    return $mceInit;
    }

    /*
    * Code coppied from _WP_Editors class (modified a little)
    */
    private function get_qt_init($editor_id) {
        if ( !empty(self::$qt_settings) ) {
            $options = self::_parse_init( self::$qt_settings );
            $qtInit .= "'$editor_id':{$options},";
            $qtInit = '{' . trim($qtInit, ',') . '}';
        } else {
            $qtInit = '{}';
        }
        return $qtInit;
    }

    private function get_mce_init($editor_id) {
        if ( !empty(self::$mce_settings) ) {
            $options = self::_parse_init( self::$mce_settings );
            $mceInit .= "'$editor_id':{$options},";
            $mceInit = '{' . trim($mceInit, ',') . '}';
        } else {
            $mceInit = '{}';
        }
        return $mceInit;
    }

    private static function _parse_init($init) {
        $options = '';

        foreach ( $init as $k => $v ) {
            if ( is_bool($v) ) {
                $val = $v ? 'true' : 'false';
                $options .= $k . ':' . $val . ',';
                continue;
            } elseif ( !empty($v) && is_string($v) && ( ('{' == $v{0} && '}' == $v{strlen($v) - 1}) || ('[' == $v{0} && ']' == $v{strlen($v) - 1}) || preg_match('/^\(?function ?\(/', $v) ) ) {
                $options .= $k . ':' . $v . ',';
                continue;
            }
            $options .= $k . ':"' . $v . '",';
        }

        return '{' . trim( $options, ' ,' ) . '}';
    }

}


// the ajax respnose code
success : function(response){
    textarea.replaceWith(response);
    tinyMCE.init(tinyMCEPreInit.mceInit[data.id]);
    try { quicktags( tinyMCEPreInit.qtInit[data.id] ); } catch(e){}
}
    
respondido por el Mike Allen 02.11.2012 - 06:04

Lea otras preguntas en las etiquetas