Editor()
Description #
AnsPress Editor type field object.
Source #
File: lib/form/class-editor.php
class Editor extends \AnsPress\Form\Field {
/**
* The field type.
*
* @var string
*/
public $type = 'editor';
/**
* Uploaded images.
*
* @var array
* @since 4.1.8
*/
public $images = array();
/**
* Prepare field.
*
* @return void
* @since 4.1.8 Remove child `image` field.
*/
protected function prepare() {
$this->args = wp_parse_args(
$this->args,
array(
'label' => __( 'AnsPress Editor Field', 'anspress-question-answer' ),
'editor_args' => array(
'quicktags' => false,
),
)
);
// Call parent prepare().
parent::prepare();
// Make sure all text field are sanitized.
$this->sanitize_cb = array_merge( array( 'description', 'wp_kses' ), $this->sanitize_cb );
}
/**
* Image upload button.
*
* @return void
* @since 4.1.8
*/
public function image_button() {
$btn_args = wp_json_encode(
array(
'__nonce' => wp_create_nonce( 'ap_upload_image' ),
'action' => 'ap_upload_modal',
'form_name' => $this->form_name,
)
);
if ( ap_user_can_upload() ) {
$this->add_html( '<button type="button" class="ap-btn-insertimage ap-btn-small ap-btn mb-10 ap-mr-5" apajaxbtn aponce="false" apquery="' . esc_js( $btn_args ) . '"><i class="apicon-image ap-mr-3"></i>' . __( 'Insert media', 'anspress-question-answer' ) . '</button>' );
}
/**
* Action trigged after image button before editor.
*
* @param string $field_name Original name of the field.
* @param object $field Field object.
* @since 4.1.8
*/
do_action( 'ap_editor_buttons', $this->original_name, $this );
}
/**
* Field markup.
*
* @return void
* @since 4.1.8 Added image button.
*/
public function field_markup() {
parent::field_markup();
$args = $this->get( 'editor_args', array() );
$settings = array(
'textarea_rows' => 10,
'tinymce' => array(
'content_css' => ap_get_theme_url( 'css/editor.css' ),
'wp_autoresize_on' => true,
'statusbar' => false,
'codesample' => true,
'anspress' => true,
'toolbar1' => 'bold,italic,underline,strikethrough,bullist,numlist,link,unlink,blockquote,fullscreen,apcode',
'toolbar2' => '',
'toolbar3' => '',
'toolbar4' => '',
),
'quicktags' => false,
'media_buttons' => false,
'textarea_name' => $this->field_name,
);
if ( true === $args['quicktags'] ) {
$settings['tinymce'] = false;
}
$editor_args = wp_parse_args( $this->get( 'editor_args' ), $settings );
/**
* Can be used to modify wp_editor settings.
*
* @var array
* @since 2.0.1
*/
$editor_args = apply_filters( 'ap_pre_editor_settings', $editor_args );
$this->add_html( '<div class="ap-editor">' );
$this->image_button();
/**
* Filter value before passing it to wp editor.
*
* @param string $value Value.
*
* @since 4.1.8
*/
$value = apply_filters( 'ap_editor_pre_value', $this->value() );
ob_start();
wp_editor( $value, $this->id(), $editor_args );
$this->add_html( ob_get_clean() );
$this->add_html( '</div>' );
/** This action is documented in lib/form/class-input.php */
do_action_ref_array( 'ap_after_field_markup', array( &$this ) );
}
/**
* Callback for replacing `apcode` shortcode.
*
* @param array $matches Matches.
* @return string
*/
public function apcode_cb( $matches ) {
return '[apcode' . $matches[3] . ']' . esc_html( $matches[5] ) . '[/apcode]';
}
/**
* Get all attached images from content.
*
* @return array
*/
private function get_attached_images() {
preg_match_all( '/(?:{{apimage "([^"]*)"[^}]*}})/', $this->value(), $matches, PREG_SET_ORDER, 0 );
$new_matches = array();
if ( ! empty( $matches ) ) {
foreach ( $matches as $index => $m ) {
$new_matches[ $index ] = $m[1];
}
}
return $new_matches;
}
/**
* Callback called in @see ::pre_get.
*
* Checks if current image is in `anspress-temp` directory and
* if so then moves it to `anspress-uploads` directory and return
* new `img` tag with new src.
*
* @param array $matches Regex matches.
* @return string Updated `img` tag.
*/
public function image_process( $matches ) {
if ( false === strpos( $matches[1], 'anspress-temp/' ) ) {
return $matches[0];
}
$files = anspress()->session->get( 'files' );
$uploads = wp_upload_dir();
$basename = basename( $matches[1] );
$temp_file = $uploads['basedir'] . '/anspress-temp/' . $basename;
// Make sure WP_Filesystem is loaded.
if ( ! function_exists( 'WP_Filesystem' ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
// Initialize WP_Filesystem.
if ( ! WP_Filesystem() ) {
// Unable to initialize WP_Filesystem, handle error accordingly.
return;
}
global $wp_filesystem;
// Check temp file is in anspress-temp directory.
if ( ! file_exists( $temp_file ) ) {
$this->add_error( 'fields-error', __( 'Sorry an error occured while processing your image, please remove it and insert again', 'anspress-question-answer' ) );
} else {
$upload_dir = $uploads['basedir'] . '/anspress-uploads/';
// Make dir if not exists.
if ( ! file_exists( $upload_dir ) ) {
$wp_filesystem->mkdir( $upload_dir );
}
// Check file in session and then move.
if ( in_array( $basename, $files, true ) ) {
$this->images[] = $basename;
$newfile = $upload_dir . "/$basename";
$new_file_url = $uploads['baseurl'] . "/anspress-uploads/$basename";
$wp_filesystem->move( $uploads['basedir'] . "/anspress-temp/$basename", $newfile );
return '<img src="' . esc_url( $new_file_url ) . '" />';
}
}
return false;
}
/**
*
* Replace temporary images with img tags.
*
* @return void
* @since 4.1.8 Process uploaded images.
*/
public function pre_get() {
$value = $this->value();
if ( $this->have_errors() || ! $value ) {
return;
}
$this->value = preg_replace_callback( '/<img\s+src="([^"]+)"[^>]+>/i', array( $this, 'image_process' ), $value );
}
/**
* Action to do after post is saved.
*
* Add uploaded images to post meta and delete post meta on delete.
*
* @param array $args Array of arguments.
* @return void
*
* @since 4.1.8 Removed adding and deleting of attachment.
*/
public function after_save( $args = array() ) {
parent::after_save();
if ( empty( $args ) || empty( $args['post_id'] ) || empty( $this->images ) ) {
return;
}
// Add images to post meta.
foreach ( $this->images as $img ) {
add_post_meta( $args['post_id'], 'anspress-image', $img );
}
// Delete file from session.
anspress()->session->delete( 'files' );
}
/**
* Get POST (unsafe) value of a field.
*
* @return null|mixed
*/
public function unsafe_value() {
$request_value = $this->get( ap_to_dot_notation( $this->field_name ), null, $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( isset( $request_value ) ) {
return $request_value;
}
}
}
Expand full source code Collapse full source code View on GitHub: lib/form/class-editor.php:25
Add your comment