This repository has been archived on 2024-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
usergalaxy/cmb2/includes/types/CMB2_Type_Wysiwyg.php

93 lines
2.8 KiB
PHP

<?php
/**
* CMB wysiwyg field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author WebDevStudios
* @license GPL-2.0+
* @link http://webdevstudios.com
*
* @method string _id()
* @method string _desc()
*/
class CMB2_Type_Wysiwyg extends CMB2_Type_Textarea {
/**
* Handles outputting a 'wysiwyg' element
* @since 1.1.0
* @return string Form wysiwyg element
*/
public function render() {
$field = $this->field;
$a = $this->parse_args( 'wysiwyg', array(
'id' => $this->_id(),
'value' => $field->escaped_value( 'stripslashes' ),
'desc' => $this->_desc( true ),
'options' => $field->options(),
) );
if ( ! $field->group ) {
return $this->rendered( $this->get_wp_editor( $a ) . $a['desc'] );
}
// wysiwyg fields in a group need some special handling.
$field->add_js_dependencies( 'wp-util' );
$field->add_js_dependencies( 'cmb2-wysiwyg' );
// Hook in our template-output to the footer.
add_action( is_admin() ? 'admin_footer' : 'wp_footer', array( $this, 'add_wysiwyg_template_for_group' ) );
return $this->rendered(
sprintf( '<div class="cmb2-wysiwyg-wrap">%s', parent::render( array(
'class' => 'cmb2_textarea cmb2-wysiwyg-placeholder',
'data-groupid' => $field->group->id(),
'data-iterator' => $field->group->index,
'data-fieldid' => $field->id( true ),
'desc' => '</div>' . $this->_desc( true ),
) ) )
);
}
protected function get_wp_editor( $args ) {
ob_start();
wp_editor( $args['value'], $args['id'], $args['options'] );
return ob_get_clean();
}
public function add_wysiwyg_template_for_group() {
$group_id = $this->field->group->id();
$field_id = $this->field->id( true );
$options = $this->field->options();
$options['textarea_name'] = 'cmb2_n_' . $group_id . $field_id;
// Initate the editor with special id/value/name so we can retrieve the options in JS.
$editor = $this->get_wp_editor( array(
'value' => 'cmb2_v_' . $group_id . $field_id,
'id' => 'cmb2_i_' . $group_id . $field_id,
'options' => $options,
) );
// Then replace the special id/value/name with underscore placeholders.
$editor = str_replace( array(
'cmb2_n_' . $group_id . $field_id,
'cmb2_v_' . $group_id . $field_id,
'cmb2_i_' . $group_id . $field_id,
), array(
'{{ data.name }}',
'{{{ data.value }}}',
'{{ data.id }}',
), $editor );
// And put the editor instance in a JS template wrapper.
echo '<script type="text/template" id="tmpl-cmb2-wysiwyg-' . $group_id . '-' . $field_id . '">';
// Need to wrap the template in a wrapper div w/ specific data attributes which will be used when adding/removing rows.
echo '<div class="cmb2-wysiwyg-inner-wrap" data-iterator="{{ data.iterator }}" data-groupid="'. $group_id .'" data-id="'. $field_id .'">'. $editor .'</div>';
echo '</script>';
}
}