Sindbad~EG File Manager
<?php
/**
* Shortcode class
*
* @package PopupMaker
* @copyright Copyright (c) 2024, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class PUM_Shortcode
*
* This is a base class for all popup maker & extension shortcodes.
*/
abstract class PUM_Shortcode {
/**
* Per instance version for compatibility fixes.
*
* @var int
*/
public $version = 1;
/**
* Used to force ajax rendering of the shortcode.
*
* @var bool
*/
public $ajax_rendering = false;
/**
* Shortcode supports inner content.
*
* @var bool
*/
public $has_content = false;
/**
* Section/Tab where the content editor will be placed.
*
* @var string
*/
public $inner_content_section = 'general';
/**
* Field priority of the content editor.
*
* @var int
*/
public $inner_content_priority = 5;
/**
* @deprecated 1.7.0
* @var string
*/
public $field_prefix = 'attrs';
/**
* @deprecated 1.7.0
* @var string
*/
public $field_name_format = '{$prefix}[{$field}]';
/**
* Current version used for compatibility fixes.
*
* @var int
*/
public $current_version = 2;
/**
* Class constructor will set the needed filter and action hooks
*/
public function __construct() {
if ( ! did_action( 'init' ) ) {
add_action( 'init', [ $this, 'register' ] );
} elseif ( ! did_action( 'admin_head' ) && current_action() !== 'init' ) {
add_action( 'admin_head', [ $this, 'register' ] );
} else {
$this->register();
}
}
/**
* Register this shortcode with Shortcode UI & Shortcake.
*/
public function register() {
add_shortcode( $this->tag(), [ $this, 'handler' ] );
add_action( 'print_media_templates', [ $this, 'render_template' ] );
add_action( 'register_shortcode_ui', [ $this, 'register_shortcode_ui' ] );
PUM_Shortcodes::instance()->add_shortcode( $this );
}
/**
* The shortcode tag.
*/
abstract public function tag();
/**
* @return mixed
*/
public static function init() {
$class = get_called_class();
return new $class();
}
/**
* Shortcode handler
*
* @param array $atts shortcode attributes
* @param string $content shortcode content
*
* @return string
*/
abstract public function handler( $atts, $content = null );
public function _tabs() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
$tabs = $this->version < 2 && method_exists( $this, 'sections' ) ? $this->sections() : $this->tabs();
return apply_filters( 'pum_shortcode_tabs', $tabs, $this->tag() );
}
public function _subtabs() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
$subtabs = $this->version >= 2 && method_exists( $this, 'subtabs' ) ? $this->subtabs() : [];
foreach ( $this->_tabs() as $tab_id => $tab_label ) {
if ( empty( $subtabs[ $tab_id ] ) || ! is_array( $subtabs[ $tab_id ] ) ) {
$subtabs[ $tab_id ] = [
'main' => $tab_label,
];
}
}
return apply_filters( 'pum_shortcode_subtabs', $subtabs, $this->tag() );
}
/**
* Sections.
*
* @deprecated 1.7.0 Use $this->tabs() instead.
*
* @todo Once all shortcodes are v2+ remove $this->sections()
*
* @return array
*/
public function sections() {
return [
'general' => __( 'General', 'popup-maker' ),
'options' => __( 'Options', 'popup-maker' ),
];
}
/**
* Returns a list of tabs for this shortcodes editor.
*
* @return array
*/
public function tabs() {
return [
'general' => __( 'General', 'popup-maker' ),
'options' => __( 'Options', 'popup-maker' ),
];
}
/**
* Returns a list of tabs for this shortcodes editor.
*
* @return array
*/
public function subtabs() {
return [
'general' => [
'main' => __( 'General', 'popup-maker' ),
],
'options' => [
'main' => __( 'Options', 'popup-maker' ),
],
];
}
/**
* Gets preprocessed shortcode attributes.
*
* @param $atts
*
* @return array
*/
public function shortcode_atts( $atts ) {
if ( ! is_array( $atts ) ) {
$atts = [];
}
foreach ( $atts as $key => $value ) {
/**
* Fix for truthy & value-less arguments such as [shortcode argument]
*/
if ( is_int( $key ) ) {
unset( $atts[ $key ] );
$atts[ $value ] = true;
}
}
return shortcode_atts( $this->defaults(), $atts, $this->tag() );
}
/**
* Array of default attribute values.
*
* @todo Convert this to pull from the std of $this->fields.
*
* @return array
*/
public function defaults() {
$defaults = [];
$fields = PUM_Admin_Helpers::flatten_fields_array( $this->fields() );
foreach ( $fields as $key => $field ) {
$defaults[ $key ] = isset( $field['std'] ) ? $field['std'] : null;
}
return apply_filters( 'pum_shortcode_defaults', $defaults, $this );
}
/**
* Render the template based on shortcode classes methods.
*/
public function render_template() {
if ( $this->version >= 2 && $this->get_template() !== false ) {
echo '<script type="text/html" id="tmpl-pum-shortcode-view-' . esc_attr( $this->tag() ) . '">';
$this->style_block();
$this->template();
echo '</script>';
} else {
/** @deprecated, here in case shortcode doesn't yet have the new $this->template() method. */
$this->_template();
}
}
/**
* Returns the inner contents of the JS templates.
*
* @todo Once all shortcodes have been updated to use template over _template make this abstract.
*
* @return void
*/
public function template() {}
/**
* Render the template based on shortcode classes methods.
*/
public function style_block() {
$styles = $this->get_template_styles();
if ( false !== $styles ) {
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<style>' . $styles . '</style>';
}
}
/**
* @deprecated 1.7.0 Use template() instead.
*/
public function _template() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
}
/**
* Render the template based on shortcode classes methods.
*
* @return string|false
*/
public function get_template_styles() {
ob_start();
$this->template_styles();
/** $this->_template_styles() is @deprecated and here in case shortcode doesn't yet have the new $this->template() method. */
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo $this->_template_styles();
$styles = ob_get_clean();
return ! empty( $styles ) ? $styles : false;
}
/**
* Returns the styles for inner contents of the JS templates.
*
* @todo Once all shortcodes have been updated to use template over _template make this abstract.
*/
public function template_styles() {}
/**
* @deprecated 1.7.0 use template_styles() instead.
*
* @return string
*/
public function _template_styles() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
return '';
}
/**
* Returns the inner contents of the JS templates.
*
* @todo Once all shortcodes have been updated to use template over _template make this abstract.
*
* @return bool|string
*/
public function get_template() {
ob_start();
$this->template();
$template = ob_get_clean();
return ! empty( $template ) ? $template : false;
}
/**
* Register this shortcode in shortcake ui.
*/
public function register_shortcode_ui() {
if ( ! is_admin() || ! function_exists( 'shortcode_ui_register_for_shortcode' ) ) {
return;
}
$shortcode_ui_args = [
'label' => $this->label(),
'listItemImage' => $this->icon(),
'post_type' => apply_filters( 'pum_shortcode_post_types', $this->post_types(), $this ),
'attrs' => [],
];
/**
* Register UI for the "inner content" of the shortcode. Optional.
* If no UI is registered for the inner content, then any inner content
* data present will be backed up during editing.
*/
if ( $this->has_content ) {
$shortcode_ui_args['inner_content'] = $this->inner_content_labels();
}
$fields = PUM_Admin_Helpers::flatten_fields_array( $this->_fields() );
if ( count( $fields ) ) {
foreach ( $fields as $field_id => $field ) {
// Don't register inner content fields.
if ( '_inner_content' === $field_id ) {
continue;
}
// text, checkbox, textarea, radio, select, email, url, number, date, attachment, color, post_select
switch ( $field['type'] ) {
case 'select':
$shortcode_ui_args['attrs'][] = [
'label' => esc_html( $field['label'] ),
'attr' => $field_id,
'type' => 'select',
'options' => $field['options'],
];
break;
case 'postselect':
case 'objectselect':
if ( empty( $field['post_type'] ) ) {
break;
}
$shortcode_ui_args['attrs'][] = [
'label' => wp_kses( $field['label'], wp_kses_allowed_html( 'post' ) ),
'attr' => $field_id,
'type' => 'post_select',
'options' => isset( $field['options'] ) ? $field['options'] : [],
'query' => [ 'post_type' => $field['post_type'] ],
];
break;
case 'taxonomyselect':
break;
case 'text':
default:
$shortcode_ui_args['attrs'][] = [
'label' => $field['label'],
'attr' => $field_id,
'type' => 'text',
'value' => ! empty( $field['std'] ) ? $field['std'] : '',
// 'encode' => true,
'meta' => [
'placeholder' => $field['placeholder'],
],
];
break;
}
}
}
/**
* Register UI for your shortcode
*
* @param string $shortcode_tag
* @param array $ui_args
*/
shortcode_ui_register_for_shortcode( $this->tag(), $shortcode_ui_args );
}
/**
* How the shortcode should be labeled in the UI. Required argument.
*
* @return string
*/
abstract public function label();
/**
* Include an icon with your shortcode. Optional.
* Use a dashicon, or full URL to image.
*
* Only used by Shortcake
*
* @return string
*/
public function icon() {
return 'dashicons-editor-quote';
}
/**
* Limit this shortcode UI to specific post_types. Optional.
*
* @return array
*/
public function post_types() {
return [ 'post', 'page', 'popup' ];
}
/**
* @todo Remove the inner function calls and just have this function define them directly.
*
* @return array
*/
public function inner_content_labels() {
return [
'label' => $this->label(),
'description' => $this->description(),
];
}
/**
* Used internally to merge the inner content field with existing fields.
*
* @return array
*/
public function _fields() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
$fields = apply_filters( 'pum_shortcode_fields', $this->fields(), $this );
if ( $this->has_content ) {
$inner_content_labels = $this->inner_content_labels();
$fields[ $this->inner_content_section ]['main']['_inner_content'] = [
'label' => $inner_content_labels['label'],
'desc' => $inner_content_labels['description'],
'section' => $this->inner_content_section,
'type' => 'textarea',
'priority' => $this->inner_content_priority,
];
}
$fields = PUM_Admin_Helpers::parse_tab_fields(
$fields,
[
'has_subtabs' => $this->version >= 2,
'name' => 'attrs[%s]',
]
);
if ( $this->version < 2 ) {
foreach ( $fields as $tab_id => $tab_fields ) {
foreach ( $tab_fields as $field_id => $field ) {
/**
* Apply field compatibility fixes for shortcodes still on v1.
*/
if ( ! empty( $field['type'] ) && in_array( $field['type'], [ 'select', 'postselect', 'radio', 'multicheck' ], true ) ) {
$fields[ $tab_id ][ $field_id ]['options'] = ! empty( $field['options'] ) ? array_flip( $field['options'] ) : [];
}
}
}
}
return $fields;
}
/**
* @return string
*/
abstract public function description();
/**
* Array of fields by tab.
*
* @return array
*/
abstract public function fields();
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists