KOKINIO - MANAGER
Edit File: class-hustle-layout-helper.php
<?php /** * Hustle_Layout_Helper class. * * @package Hustle * @since 4.2.0 */ /** * Helper class for rendering markup on admin side. * This is used along admin pages to standardize certain elements markup. * * @since 4.2.0 */ class Hustle_Layout_Helper { /** * Instance of the class that controls the template. * * @since 4.2.0 * @var Object */ private $admin; /** * White labeling based on Dash Plugin Settings. * * @since 4.2.0 * @var boolean */ private $is_branding_hidden = false; /** * White labeling branding image. * * @since 4.4.7 * @var string */ private $branding_image; /** Array list of quicktags for tinymce editor. * * @since 4.4.7 * @var array */ private $tinymce_quicktags; /** * To be removed. * * @var string something. */ public static $plugin_url; /** * Flag for letting SUI doesn't run auto init selects to suiSelect. * * @var bool */ private static $dont_init_selects; /** * Hustle_Layout_Helper class constructor. * * @since 4.2.0 * @param object $referer The class that has the properties to access from within templates. */ public function __construct( $referer = null ) { self::$plugin_url = Opt_In::$plugin_url; $this->is_branding_hidden = apply_filters( 'wpmudev_branding_hide_branding', $this->is_branding_hidden ); // White label custom branding image. $this->branding_image = apply_filters( 'wpmudev_branding_hero_image', null ); // Filter allowed HTML tags for the content. $this->tinymce_quicktags = apply_filters( 'hustle_tinymce_quicktags', array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close', ) ); /** * Sets the referer class as a property. * This allows us to access the referer class' properties if needed * from the template files. */ // TODO maybe check if the referer has the two allowed classes. if ( $referer ) { $this->admin = $referer; } } /** * Gets the previously set referer. * * @since 4.2.0 * @return object */ public function get_referer() { if ( ! $this->admin ) { return false; } return $this->admin; } /** * Returns or echoes markup from the given $options array. * Uses the file 'admin/commons/options' as the markup template. * * @since 4.2.0 * * @param array $options Array with the options that define the markup to be returned. * @param boolean $return_value Whether to echo or return the markup. * @return string */ public static function get_html_for_options( $options, $return_value = false ) { $instance = new self(); $html = ''; foreach ( $options as $key => $option ) { $html .= $instance->render( 'admin/commons/options', $option, $return_value ); } return $html; } /** * Renders a view file with static call. * * @since 1.0 * @since 4.2.0 Moved from Opt_In to this class. * * @param string $file Path to the view file. * @param array $params Array whose keys will be variable names when within the view file. * @param bool|false $return_value Whether to echo or return the contents. * @return string */ public function render( $file, $params = array(), $return_value = false ) { extract( $params, EXTR_OVERWRITE ); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract if ( $return_value ) { ob_start(); } $template_file = $this->locate_file( $file ); if ( file_exists( $template_file ) ) { include $template_file; } if ( $return_value ) { return ob_get_clean(); } if ( ! empty( $params ) ) { foreach ( $params as $param ) { unset( $param ); } } } /** * Locates a file and returns its path. * * @since 4.2.0 * * @param string $layout Layout name, which is used to create the file name. * @return string */ public function locate_file( $layout ) { // Assign $file to a variable which is unlikely to be used by users of the method. $opt_in_to_be_file_name = $layout; $template_file = trailingslashit( Opt_In::$plugin_path ) . Opt_In::VIEWS_FOLDER . '/' . $opt_in_to_be_file_name . '.php'; if ( file_exists( $template_file ) ) { return apply_filters( 'hustle_locate_file', $template_file, $layout ); } $template_path = Opt_In::$template_path . $opt_in_to_be_file_name . '.php'; if ( file_exists( $template_path ) ) { return apply_filters( 'hustle_locate_file', $template_path, $layout ); } $external_path = $opt_in_to_be_file_name . '.php'; if ( file_exists( $external_path ) ) { return apply_filters( 'hustle_locate_file', $external_path, $layout ); } return apply_filters( 'hustle_locate_file', $opt_in_to_be_file_name, $layout ); } /** * Renders html. * * @param string $content Content - HTML. */ public function render_html( $content ) { $common_arrts = array( 'id' => true, 'data-*' => true, 'title' => true, 'sandbox' => true, 'class' => true, 'aria-hidden' => true, 'aria-labelledby' => true, 'aria-describedby' => true, 'role' => true, 'xmlns' => true, 'xmlns:xlink' => true, 'width' => true, 'height' => true, 'viewbox' => true, 'type' => true, 'name' => true, 'value' => true, 'checked' => true, 'selected' => true, 'placeholder' => true, 'disabled' => true, 'method' => true, 'tabindex' => true, ); $allowed_html = wp_kses_allowed_html( 'post' ); $allowed_tags = array_merge( $allowed_html, array( 'iframe' => $common_arrts, 'form' => $common_arrts, 'svg' => $common_arrts, 'defs' => true, 'g' => array( 'fill' => true, 'fill-rule' => true, 'clip-rule' => true, 'd' => true, ), 'path' => array( 'd' => true, 'id' => true, 'fill' => true, 'fill-rule' => true, ), 'input' => $common_arrts, 'select' => $common_arrts, 'option' => $common_arrts, ) ); $allowed_tags = apply_filters( 'hustle_content_allowed_tags', $allowed_tags ); echo wp_kses( $content, $allowed_tags ); } /** * Renders custom attributes within views templates. * * @since 1.0.0 * @since 4.2.0 Moved from Opt_In to this class. * @since 4.3.0 Removed the $echo parameter. * * @param array $html_options Attributes as an array to be renderd. * @return string */ public function render_attributes( $html_options ) { if ( array() === $html_options ) { return ''; } $special_attributes = array( 'async', 'autofocus', 'autoplay', 'checked', 'controls', 'declare', 'default', 'defer', 'disabled', 'formnovalidate', 'hidden', 'ismap', 'loop', 'multiple', 'muted', 'nohref', 'noresize', 'novalidate', 'open', 'readonly', 'required', 'reversed', 'scoped', 'seamless', 'selected', 'typemustmatch', ); foreach ( $html_options as $name => $value ) { if ( in_array( $name, $special_attributes, true ) ) { if ( $value ) { echo ' ' . esc_attr( $name ) . '="' . esc_attr( $name ) . '"'; } } elseif ( null !== $value ) { echo ' ' . esc_attr( $name ) . '="' . esc_attr( $value ) . '"'; } } } /** * Renders a basic modal with the passed attributes. * * @since 4.2.0 * @param array $arguments Arguments for the modal. Documented in the template file. */ private function render_modal( $arguments ) { $this->render( '/admin/commons/modal-template', $arguments ); } /** * Image function * Return image element with 2x and 1x support. * * @since 4.3.1 * * @param string $image_path URL for the given image. * @param string $image_suffix Image format, like png, jpg, etc. * @param string $image_class Class for the image HTML element. * @param string|bool $support Whether the image has retina support. */ private function hustle_image( $image_path, $image_suffix, $image_class, $support ) { /* translators: Plugin name */ $image_name = esc_html( sprintf( __( '%s image', 'hustle' ), Opt_In_Utils::get_plugin_name() ) ); echo '<img src="' . esc_url( $image_path . '.' . $image_suffix ) . '" alt="' . esc_attr( $image_name ) . '"'; if ( true === $support || '2x' === $support ) { echo ' srcset="' . esc_attr( $image_path . '.' . $image_suffix ) . ' 1x, ' . esc_attr( $image_path . '@2x.' . $image_suffix ) . ' 2x"'; } if ( '' !== $image_class ) { echo ' class="' . esc_attr( $image_class ) . '"'; } echo ' aria-hidden="true">'; } /** * Color Picker * * Return the correct color picker markup that's compatible with Shared UI 2.0 * * @since 4.3.1 * * @param string $id "id" attribute of the input. * @param string $name "name" attribute of the input. * @param string $alpha "false"/"true". Enables or disables the alpha selector in the colorpicker. * @param bool $is_js_template whether this colorpicker will be filled via js templating. * @param string $value Value to be used when js templating isn't used. */ private function sui_colorpicker( $id, $name, $alpha = 'false', $is_js_template = true, $value = false ) { $value = ( ! $is_js_template && $value ) ? $value : '{{ ' . $name . ' }}'; echo '<div class="sui-colorpicker-wrap"> <div class="sui-colorpicker" aria-hidden="true"> <div class="sui-colorpicker-value"> <span role="button"> <span style="background-color: ' . esc_attr( $value ) . '"></span> </span> <input class="hustle-colorpicker-input" type="text" value="' . esc_attr( $value ) . '"/> <button><span class="sui-icon-close" aria-hidden="true"></span></button> </div> <button class="sui-button">' . esc_html__( 'Select', 'hustle' ) . '</button> </div> <input type="text" name="' . esc_attr( $name ) . '" value="' . esc_attr( $value ) . '" id="' . esc_attr( $id ) . '" class="sui-colorpicker-input" data-alpha-enabled="' . esc_attr( $alpha ) . '" data-attribute="' . esc_attr( $name ) . '" /> </div>'; } }