* @license GPL-2.0+ * @link http://www.contentviewspro.com/ * @copyright 2014 PT Guy */ if ( !class_exists( 'PT_Options_Framework' ) ) { class PT_Options_Framework { private static $dependence_info; // Store dependency information of options public function __construct() { } /** * Check dependence information & generate random id for dependency elements * * @param array $param Array of parameters of a setting option * @param array $dependence_ Global dependence array * * @return string|null */ public static function _dependence_check( $param, &$dependence_ ) { if ( isset( $param[ 'dependence' ] ) ) { // Depend array: 3 params in order : name (of param this param depends), value (of param this param depends), operator $dependence = (array) $param[ 'dependence' ]; $random_id = PT_CV_PREFIX . 'dependence_' . PT_CV_Functions::string_random(); // Single dependency relationship if ( !is_array( $dependence[ 0 ] ) ) { self::_dependence_assign( $dependence, $random_id, $dependence_ ); } else { // Multiple dependency relationships foreach ( $dependence as $dp ) { self::_dependence_assign( $dp, $random_id, $dependence_ ); } } return $random_id; } return NULL; } /** * Assign dependency relationship * * @param array $dependence Array of dependence attributes * @param string $random_id Random string * @param array $dependence_ Global dependence array */ public static function _dependence_assign( $dependence, $random_id, &$dependence_ ) { if ( !isset( $dependence[ 1 ] ) ) { return; } $dependence_[ $dependence[ 0 ] ][] = array( $random_id, $dependence[ 1 ], isset( $dependence[ 2 ] ) ? $dependence[ 2 ] : '=' ); } /** * Settings for group of options * * @param array $options List of setting options * @param array $data Stored data of settings * * @return string */ public static function do_settings( $options, $data = array() ) { $result = $dependence_ = array(); if ( !$options ) { return ''; } foreach ( $options as $group ) { $result[] = self::group( $group, $data, $dependence_ ); } if ( $dependence_ ) { self::$dependence_info[] = $dependence_; } return implode( '', $result ); } /** * Group of options * * @param array $group * @param array $data Stored data of settings * @param array $dependence_ Global dependence array * * @return string */ public static function group( $group, $data, &$dependence_ ) { if ( empty( $group[ 'label' ] ) && empty( $group[ 'params' ] ) ) { return ''; } $extra_setting = isset( $group[ 'extra_setting' ] ) ? $group[ 'extra_setting' ] : array(); $label = self::label( $group[ 'label' ], $extra_setting ); $params = self::params( $group[ 'params' ], $data, $extra_setting ); $random_id = self::_dependence_check( $group, $dependence_ ); $id = ''; $class = isset( $extra_setting[ 'params' ][ 'group-class' ] ) ? $extra_setting[ 'params' ][ 'group-class' ] : ''; if ( $random_id ) { $id = "id='$random_id'"; $class .= ' hidden'; } return "
$label $params
"; } /** * Label * * @param string $label Text for label */ public static function label( $label = array(), $extra_setting = array() ) { $for = isset( $label[ 'for' ] ) ? "for='{$label[ 'for' ]}'" : ''; $width = 12 - ( isset( $extra_setting[ 'params' ][ 'width' ] ) ? intval( $extra_setting[ 'params' ][ 'width' ] ) : 10 ); if ( $width ) { $html = "'; } else { $html = ''; } return $html; } /** * Print params next to label * * @param string $params Array of setting options in a group */ public static function params( $params, $data, $extra_setting ) { $params_html = array(); foreach ( (array) $params as $param ) { $params_html[] = self::field_type( (array) $param, $data ) . "\n"; } $html = implode( '', $params_html ); $param_wrap_class = isset( $extra_setting[ 'params' ][ 'wrap-class' ] ) ? esc_attr( $extra_setting[ 'params' ][ 'wrap-class' ] ) : ''; $param_wrap_id = isset( $extra_setting[ 'params' ][ 'wrap-id' ] ) ? "id='" . esc_attr( $extra_setting[ 'params' ][ 'wrap-id' ] ) . "'" : ''; $width = isset( $extra_setting[ 'params' ][ 'width' ] ) ? intval( $extra_setting[ 'params' ][ 'width' ] ) : 10; return "
$html
"; } /** * Get value of field * * @param array $data Stored data of settings * @param array $param Array of parameters of a setting option * * @return string */ public static function field_value( $data, $param, $name ) { // Get name without [] $single_name = rtrim( $name, '[]' ); // Get value of field if ( $data ) { $value = isset( $data[ $single_name ] ) ? $data[ $single_name ] : ''; } else { $value = isset( $param[ 'std' ] ) ? $param[ 'std' ] : ''; } if ( $value === '' && (isset( $param[ 'std' ] ) && $param[ 'std' ] !== '') ) { if ( in_array( $param[ 'type' ], array( 'number', 'text' ) ) ) { if ( $name !== PT_CV_PREFIX . 'limit' ) { $value = $param[ 'std' ]; } } else if ( in_array( $param[ 'type' ], array( 'radio', 'select' ) ) ) { if ( !array_key_exists( '', $param[ 'options' ] ) ) { $value = $param[ 'std' ]; } } } return $value; } /** * Print HTML code of field type: input, select, textarea... * * @param array $param Array of parameters of a setting option * @param array $data Array of stored data * * @return string */ public static function field_type( $param, $data, $value_ = NULL ) { if ( !$param || !isset( $param[ 'type' ] ) ) { return ''; } $html = $extend = ''; $class = 'form-control ' . ( isset( $param[ 'class' ] ) ? ' ' . PT_CV_PREFIX . $param[ 'class' ] : '' ); $type = esc_attr( $param[ 'type' ] ); $name = !empty( $param[ 'name' ] ) ? PT_CV_PREFIX . esc_attr( $param[ 'name' ] ) : ''; $id = !empty( $param[ 'id' ] ) ? "id='" . PT_CV_PREFIX . esc_attr( $param[ 'id' ] ) . "'" : ''; $value = isset( $value_ ) ? $value_ : self::field_value( $data, $param, $name ); $description = isset( $param[ 'desc' ] ) ? $param[ 'desc' ] : ''; $placeholder = isset( $param[ 'placeholder' ] ) ? esc_attr( $param[ 'placeholder' ] ) : ''; // Add extra information of option type switch ( $type ) { case 'number': $min = !empty( $param[ 'min' ] ) ? intval( $param[ 'min' ] ) : 0; $extend = 'min="' . $min . '"'; break; case 'color': $class .= ' ' . PT_CV_PREFIX . 'color'; break; case 'checkbox': case 'radio': // Remove form-control class in checkbox, radio $class = str_replace( 'form-control', '', $class ); break; } $class = esc_attr( $class ); // Show HTML of option type switch ( $type ) { case 'group': $html .= self::do_settings( $param[ 'params' ], $data ); break; case 'text': case 'email': case 'password': case 'number': case 'url': $value = !empty( $value ) ? (($type === 'number') ? intval( $value ) : esc_attr( $value )) : $value; $prepend_text = !empty( $param[ 'prepend_text' ] ) ? $param[ 'prepend_text' ] : ''; $append_text = !empty( $param[ 'append_text' ] ) ? $param[ 'append_text' ] : ''; $input = ""; if ( !empty( $prepend_text ) || !empty( $append_text ) ) { $input = "
{$prepend_text}{$input}{$append_text}
"; } $html .= $input; break; case 'color': $value = esc_attr( $value ); $html .= ""; $html .= "
"; break; case 'textarea': $value = esc_textarea( $value ); $html .= ""; break; case 'checkbox': case 'radio': if ( !isset( $param[ 'options' ] ) ) { break; } $settings = isset( $param[ 'settings' ] ) ? $param[ 'settings' ] : array(); foreach ( $param[ 'options' ] as $key => $text ) { // Append Html to $text, such as image... if ( $settings ) { $append = isset( $settings[ 'text-append' ] ) ? $settings[ 'text-append' ] : ''; if ( $append == 'image' ) { $path = isset( $settings[ 'path' ] ) ? $settings[ 'path' ] : ''; if ( $path ) { $text .= "
"; } } } $checked = ( in_array( $key, (array) $value ) || ( $value == 'all' ) ) ? 'checked' : ''; $html .= "
"; } break; case 'select': if ( !isset( $param[ 'options' ] ) ) { break; } if ( is_string( $value ) && strpos( $value, ',' ) !== false ) { $value = explode( ',', $value ); } $options = ''; foreach ( $param[ 'options' ] as $key => $text ) { $selected = ( in_array( str_replace( '&', '&', $key ), (array) $value ) || ( $value == 'all' ) ) ? 'selected' : ''; $option_class = isset( $param[ 'option_class_prefix' ] ) ? sprintf( "class='%s'", $param[ 'option_class_prefix' ] . esc_attr( sanitize_title( $key ) ) ) : ''; $options .= ""; } if ( empty( $options ) ) { $html .= PT_CV_Settings::setting_no_option( true ); } else { $multiple = ''; if ( ( isset( $param[ 'multiple' ] ) && $param[ 'multiple' ] == '1' ) || $value == 'all' ) { $multiple = 'multiple'; // Auto add [] to name of select $name .= substr( $name, - 2 ) == '[]' ? '' : '[]'; } $html .= ""; } break; case 'color_picker': $html .= self::field_type( $param[ 'options' ], $data ); break; case 'html': if ( isset( $param[ 'content' ] ) ) { $html .= $param[ 'content' ]; } break; case 'panel_group': // In format: key => array of params $parent_id = PT_CV_Functions::string_random( true ); $settings = isset( $param[ 'settings' ] ) ? $param[ 'settings' ] : array(); foreach ( $param[ 'params' ] as $key => $param_group ) { $html .= self::sub_panel_group( $key, $param_group, $data, $parent_id, $settings ); } break; } $description = apply_filters( PT_CV_PREFIX_ . 'options_description', $description, $param ); if ( !empty( $description ) ) { // Append dot to end of description if ( trim( strip_tags( $description ) ) != '' && substr( $description, -1 ) != '?' ) { $description .= '.'; } // esc_html will break popover $html .= "

$description

"; } return $html; } /** * HTML for group of params inside Panel group * * @param string $key * @param array $param_group Array of setting options in a group * @param array $data Stored data of settings * @param string $parent_id * @param bool $settings : array of custom settings * * @return string */ static function sub_panel_group( $key, $param_group, $data, $parent_id, $settings = array() ) { // Content for body $content = self::do_settings( $param_group, $data ); // Class for wrapper $class = PT_CV_Html::html_group_class(); $class .= ( isset( $settings[ 'show_all' ] ) ? '' : ' hidden' ); $class .= ( isset( $settings[ 'show_only_one' ] ) ? ' ' . PT_CV_PREFIX . 'only-one' : '' ); $class .= ( isset( $settings[ 'no_panel' ] ) ? ' ' . PT_CV_PREFIX . 'no-panel' : '' ); // Id for wrapper $id = PT_CV_Html::html_group_id( $key ); if ( !isset( $settings[ 'no_panel' ] ) ) { if ( !empty( $param_group[ 'parent_label' ] ) ) { $heading = $param_group[ 'parent_label' ]; } else { $heading = isset( $settings[ 'nice_name' ][ $key ] ) ? $settings[ 'nice_name' ][ $key ] : PT_CV_Functions::string_slug_to_text( $key ); } $html = PT_CV_Html::html_collapse_one( $parent_id, $id . '-child', $heading, $content, true ); } else { $html = $content; } return "
$html
"; } /** * Start Admin JS with dependency data */ public static function print_js() { ?>