# powerkit/2.9.1/modules/basic-elements/admin/class-powerkit-basic-elements-admin.php

Powerkit – Supercharge your WordPress Site, version 2.9.1. 464 lines.

- Page: https://pluginprobe.com/plugins/powerkit/2.9.1/code/modules/basic-elements/admin/class-powerkit-basic-elements-admin.php
- Raw: https://pluginprobe.com/plugins/powerkit/2.9.1/raw/modules/basic-elements/admin/class-powerkit-basic-elements-admin.php
- Modified: 2024-03-23T15:14:22+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/powerkit/2.9.1/code/modules/basic-elements/admin/class-powerkit-basic-elements-admin.php#L10-L20`.

```php
<?php
/**
 * The admin-specific functionality of the module.
 *
 * @link       https://codesupply.co
 * @since      1.0.0
 *
 * @package    Powerkit
 * @subpackage Modules/Admin
 */

/**
 * The admin-specific functionality of the module.
 */
class Powerkit_Basic_Elements_Admin extends Powerkit_Module_Admin {

	/**
	 * Initialize
	 */
	public function initialize() {
		add_action( 'wp_ajax_powerkit_basic_shortcodes_sections', array( $this, 'powerkit_basic_shortcodes_ajax_panel' ) );
		add_filter( 'mce_buttons', array( $this, 'powerkit_basic_shortcodes_register_buttons' ) );
		add_filter( 'mce_external_plugins', array( $this, 'powerkit_basic_shortcodes_register_plugin' ) );
	}


	/**
	 * Register shorcodes button for TinyMCE buttons (Visual tab).
	 *
	 * @since  1.0.0
	 * @param  array $buttons First-row list of buttons.
	 * @return array Buttons.
	 */
	public function powerkit_basic_shortcodes_register_buttons( $buttons ) {
		if ( current_user_can( 'edit_posts' ) ) {
			array_push( $buttons, 'powerkit_basic_shortcodes_button' );
		}

		return $buttons;
	}

	/**
	 * Register shortcodes plugin
	 *
	 * @since  1.0.0
	 * @param  array $plugins An array of external TinyMCE plugins.
	 * @return array Plugins.
	 */
	public function powerkit_basic_shortcodes_register_plugin( $plugins ) {
		if ( current_user_can( 'edit_posts' ) ) {
			$plugins['powerkit_basic_shortcodes'] = trailingslashit( plugin_dir_url( __FILE__ ) ) . 'js/admin-powerkit-basic-elements.js';
		}

		return $plugins;
	}

	/**
	 * Generate Section Fileds
	 *
	 * @since 1.0.0
	 * @param array $section Sections Fields.
	 * @param array $counter Unique field identifier.
	 */
	public function generate_section_fields( $section, $counter = 0 ) {
		if ( isset( $section['fields'] ) && is_array( $section['fields'] ) ) {

			// Default Field Settings.
			$default_field = array(
				'type'    => 'input',
				'name'    => '',
				'label'   => '',
				'desc'    => '',
				'default' => '',
				'attrs'   => array(),
				'style'   => 'vertical', // For radio.
				'suffix'  => '',         // For inputs.
				'options' => array(),    // For select, radio.
				'fields'  => array(),    // For repeater.
			);

			foreach ( $section['fields'] as $field ) {

				$counter++;

				// Merge Settings.
				$field = array_merge( $default_field, $field );

				// Attrs.
				$attrs = null;

				if ( ! empty( $field['attrs'] ) ) {
					foreach ( $field['attrs'] as $key => $value ) {
						$attrs[] = sprintf( '%s="%s"', $key, $value );
					}
					$attrs = implode( ' ', $attrs );
				}

				// Output by type.
				switch ( $field['type'] ) {
					case 'section':
						?>
							<tr>
								<th><h3><?php echo wp_kses_post( $field['label'] ); ?></h3></th><td>&nbsp;</td>
							</tr>
						<?php
						break;
					case 'input':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<input name="<?php echo esc_attr( $field['name'] ); ?>" type="text" value="<?php echo esc_attr( $field['default'] ); ?>" <?php echo wp_kses_data( $attrs ); ?>><?php echo esc_attr( $field['suffix'] ); ?>
								</td>
							</tr>
						<?php
						break;
					case 'textarea':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<textarea name="<?php echo esc_attr( $field['name'] ); ?>" <?php echo wp_kses_data( $attrs ); ?>><?php echo wp_kses_post( $field['default'] ); ?></textarea>
								</td>
							</tr>
						<?php
						break;
					case 'select':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<select name="<?php echo esc_attr( $field['name'] ); ?>" <?php echo wp_kses_data( $attrs ); ?>>
										<?php if ( isset( $field['options'] ) && $field['options'] ) : ?>
											<?php foreach ( $field['options'] as $key => $option ) : ?>
												<option value="<?php echo esc_attr( $key ); ?>" <?php selected( $field['default'], esc_attr( $key ) ); ?>><?php echo esc_attr( $option ); ?></option>
											<?php endforeach; ?>
										<?php endif; ?>
									</select>
								</td>
							</tr>
						<?php
						break;

					case 'checkbox':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<input name="<?php echo esc_attr( $field['name'] ); ?>" type="checkbox" value="true" <?php checked( (bool) $field['default'], true ); ?> <?php echo wp_kses_data( $attrs ); ?>>
								</td>
							</tr>
						<?php
						break;

					case 'radio':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<?php if ( isset( $field['options'] ) && $field['options'] ) : ?>
										<?php foreach ( $field['options'] as $key => $option ) : $counter++; ?>
											<?php $id = sprintf( 'field-%s-%s-%s', $section['name'], $field['name'], $counter ); ?>
											<input id="<?php echo esc_attr( $id ); ?>" name="<?php echo esc_attr( $field['name'] ); ?>" type="radio" value="<?php echo esc_attr( $key ); ?>" <?php checked( $field['default'], $key ); ?> <?php echo wp_kses_data( $attrs ); ?>>
											<label for="<?php echo esc_attr( $id ); ?>"><?php echo esc_attr( $option ); ?></label>
											<?php if ( 'vertical' === $field['style'] ) : ?>
												<br>
											<?php else : ?>
												&nbsp;
											<?php endif; ?>
										<?php endforeach; ?>
									<?php endif; ?>
								</td>
							</tr>
						<?php
						break;

					case 'content':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:<small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td>
									<textarea name="<?php echo esc_attr( $field['name'] ); ?>" <?php echo wp_kses_data( $attrs ); ?>><?php echo wp_kses_post( $field['default'] ); ?></textarea>
								</td>
							</tr>
						<?php
						break;

					case 'repeater':
						?>
							<tr>
								<th><?php echo wp_kses_post( $field['label'] ); ?>:</label><small><?php echo wp_kses_post( $field['desc'] ); ?></small></th>
								<td class="basic-shortcodes-repeater-field">
									<div data-repeater-list="<?php echo esc_attr( $field['base'] ); ?>" >
										<table class="form-table" data-repeater-item>
											<tbody>
												<?php $this->generate_section_fields( $field, $counter ); ?>
											</tbody>
											<tfoot>
												<tr>
													<th></th>
													<td>
														<span class="button-secondary" data-repeater-delete><?php esc_html_e( 'Delete Item', 'powerkit' ); ?></span>
													</td>
												</tr>
											</tfoot>
										</table>
									</div>
									<span data-repeater-create class="button-primary"><?php esc_html_e( 'Add Item', 'powerkit' ); ?></span>
								</td>
							</tr>
						<?php
						break;
				}
			}
		}
	}

	/**
	 * Ajax Load Admin Shortcodes Panel
	 *
	 * @since 1.0.0
	 */
	public function powerkit_basic_shortcodes_ajax_panel() {

		// Allow themes and plugins to enable/disable specific shortcodes UI panel.
		$sections = apply_filters( 'powerkit_basic_shortcodes_ui_args', array() );

		// Sort elements.
		usort( $sections, function ( $a, $b ) {
			return $a['priority'] - $b['priority'];
		} );
		?>
			<div class="wrap powerkit_basic_shortcodes_wrap">

				<div class="powerkit_basic_shortcodes_tabs">

					<ul>
					<?php foreach ( $sections as $section ) : ?>
						<li><a data-nav="<?php echo esc_attr( $section['name'] ); ?>" href="#"><?php echo esc_html( $section['title'] ); ?></a></li>
					<?php endforeach; ?>
					</ul>

				</div>

				<div class="powerkit_basic_shortcodes_tabs_sections">

					<?php foreach ( $sections as $section ) : ?>
						<div class="hidable wrap tabs-<?php echo esc_attr( $section['name'] ); ?>" style="display: none;">

							<form class="powerkit_basic_shortcodes_tab" enctype="multipart/form-data">
								<table class="form-table">
									<tbody>
										<?php $this->generate_section_fields( $section ); ?>

										<tr>
											<th><input type="submit" class="button-primary" value="<?php esc_html_e( 'Insert', 'powerkit' ); ?>"></th>
											<td>&nbsp;</td>
										</tr>
									</tbody>
								</table>
							</form>
						</div>

						<script type="text/javascript">
						/* <![CDATA[ */
						(function($) {

							// Insert Shortcode.
							$('.tabs-<?php echo esc_attr( $section['name'] ); ?> form').submit( function( e ) {
								e.preventDefault();

								// Hide Popup.
								tb_remove();

								// Get input values from form.
								var fieldsObj = $( this ).serializeObject();

								// Vars.
								var shortcodeContent = '',
									shortcodeAttrs   = [];

								<?php foreach ( (array) $section['fields'] as $field ) : ?>

									var fieldName = '<?php echo esc_attr( isset( $field['name'] ) ? $field['name'] : '' ); ?>';
									<?php
									switch ( $field['type'] ) {
										case 'section':
											break;
										case 'repeater':
											?>
											var subContentVars  = [],
												subCheckboxVars = [],
												shortcodeBase   = '<?php echo esc_attr( $field['base'] ); ?>';

											<?php foreach ( (array) $field['fields'] as $sub_field ) : ?>

												<?php if ( 'content' === $sub_field['type'] ) : ?>
													subContentVars.push( '<?php echo esc_attr( $sub_field['name'] ); ?>' );
												<?php endif; ?>

												<?php if ( 'checkbox' === $sub_field['type'] ) : ?>
													subCheckboxVars.push( '<?php echo esc_attr( $sub_field['name'] ); ?>' );
												<?php endif; ?>

											<?php endforeach; ?>

											if( typeof fieldsObj[ shortcodeBase ] !== 'undefined' ) {

												$.each( fieldsObj[ shortcodeBase ], function( key, obj ) {

													var subShortcodeContent = '',
														subShortcodeAttrs   = [];

													$.each( obj, function( s_key, s_obj ) {
														if( typeof s_obj !== 'undefined' ) {

															// Field "Content" fix.
															if( ! $.inArray( s_key, subContentVars ) ) {
																subShortcodeContent += s_obj;
															} else {

																// Other fields.
																subShortcodeAttrs.push( s_key + '="' + s_obj + '"' );
															}
														}

													} );

													// Add Inner Shortcode.
													if( subShortcodeContent ) {
														shortcodeContent += '[' + shortcodeBase + ' ' + subShortcodeAttrs.join( ' ' ) + ']<br>' + subShortcodeContent + '<br>[/' + shortcodeBase + ']<br>';
													} else {
														shortcodeContent += '[' + shortcodeBase + ' ' + subShortcodeAttrs.join( ' ' ) + ']<br>';
													}

												} );
											}
											<?php
											break;
										case 'content':
											?>
											if( typeof fieldsObj[ fieldName ] !== 'undefined' ) {
												shortcodeContent += fieldsObj[ fieldName ];
											}
											<?php
											break;
										case 'checkbox':
											?>
											if( typeof fieldsObj[ fieldName ] !== 'undefined' ) {
												var fieldAttr = fieldName + '="' + fieldsObj[ fieldName ] + '"';
											} else {
												var fieldAttr = fieldName + '="false"';
											}

											shortcodeAttrs.push( fieldAttr );
											<?php
											break;
										default:
											?>
											if( typeof fieldsObj[ fieldName ] !== 'undefined' ) {
												var fieldAttr = fieldName + '="' + fieldsObj[ fieldName ] + '"';
											} else {
												var fieldAttr = fieldName + '=""';
											}

											shortcodeAttrs.push( fieldAttr );
											<?php
											break;
									}
									?>
								<?php endforeach; ?>

								// Add Shortcode.
								var shortcodeName = '<?php echo esc_attr( $section['base'] ); ?>';

								if( shortcodeContent ) {

									// Trim Line Breaks.
									shortcodeContent = shortcodeContent.replace( /^<br>|<br>$/gm, '' );

									var content = '[' + shortcodeName + ' ' + shortcodeAttrs.join( ' ' ) + ']<br>' + shortcodeContent + '<br>[/' + shortcodeName + ']';
								} else {
									var content = '[' + shortcodeName + ' ' + shortcodeAttrs.join( ' ' ) + ']';
								}

								// Remove odd space.
								content = content.replace(/\s\]/g, ']');

								// Convert br.
								content = content.replace(/([^>])\n/g, '$1<br/>');

								powerkit_basic_shortcodes.setContent( content );
							});

						})(jQuery);
						/* ]]> */
						</script>
					<?php endforeach; ?>

				</div>

				<script type="text/javascript">
				/* <![CDATA[ */
				( function( $ ) {

					// Tabs Navigation.
					$( '.powerkit_basic_shortcodes_tabs a' ).click( function( e ) {
						e.preventDefault();
						powerkit_basic_shortcodes_tabs_switch( $( this ) );
					} );

					powerkit_basic_shortcodes_tabs_switch( $( '.powerkit_basic_shortcodes_tabs a' ).first() );

					function powerkit_basic_shortcodes_tabs_switch( obj ) {
						$( '.powerkit_basic_shortcodes_tabs_sections .hidable' ).hide();
						$( '.powerkit_basic_shortcodes_tabs_sections .tabs-' + obj.attr( 'data-nav' ) ).show();
						$( '.powerkit_basic_shortcodes_tabs li' ).removeClass( 'current' );
						obj.parent().addClass( 'current' );
					}

					// Init Repeater.
					$( document ).ready( function() {
						$( '.basic-shortcodes-repeater-field' ).each( function() {
							$( this ).repeater( {
								show: function() {
									$( this ).slideDown();
								},
								hide: function( deleteElement ) {
									$( this ).fadeOut( 400 );
								},
								isFirstItemUndeletable: true,
							} );
						} );
					} );

				} )( jQuery );
				/* ]]> */
				</script>
			</div>
		<?php
		die();
	}

	/**
	 * Register the stylesheets and JavaScript for the admin area.
	 *
	 * @param string $page Current page.
	 */
	public function admin_enqueue_scripts( $page ) {

		add_thickbox();

		wp_enqueue_style( 'wp-color-picker' );

		// Styles.
		wp_enqueue_style( 'powerkit-basic-elements', powerkit_style( plugin_dir_url( __FILE__ ) . 'css/admin-powerkit-basic-elements.css' ), array(), powerkit_get_setting( 'version' ), 'all' );

		wp_enqueue_script( 'wp-color-picker' );
		// Scripts.
		wp_enqueue_script( 'powerkit-jquery-serialize', plugin_dir_url( __FILE__ ) . 'js/jquery.serialize-to-json.min.js', array( 'jquery' ), powerkit_get_setting( 'version' ), false );
		wp_enqueue_script( 'powerkit-jquery-repeater', plugin_dir_url( __FILE__ ) . 'js/jquery.repeater.min.js', array( 'jquery' ), powerkit_get_setting( 'version' ), false );
	}
}

```
