geno/wp-content/plugins/ti-woocommerce-wishlist/admin/basestyle.helper.php
2024-02-01 11:54:18 +00:00

280 lines
8.1 KiB
PHP

<?php
/**
* Basic admin style helper class
*
* @package TInvWishlist\Admin\Helper
* @since 1.0.0
*/
// If this file is called directly, abort.
defined( 'ABSPATH' ) or exit;
/**
* Basic admin style helper class
*/
abstract class TInvWL_Admin_BaseStyle extends TInvWL_Admin_BaseSection {
/**
* Prepare sections for template attributes
*
* @return array
*/
public function prepare_sections(): array {
$fields_data = [];
$fields = $this->default_style_settings();
$theme_file = TINVWL_PATH . implode( DIRECTORY_SEPARATOR, [ 'assets', 'css', 'theme.css' ] );
if ( file_exists( $theme_file ) ) {
$fields_data = $this->break_css( file_get_contents( $theme_file ) ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.file_get_contents
}
$_fields = $this->prepare_fields( $fields, $fields_data );
foreach ( $_fields as &$_field ) {
if ( ! array_key_exists( 'skin', $_field ) ) {
switch ( $_field['type'] ) {
case 'group':
case 'groupHTML':
$_field['skin'] = 'section-group-style';
break;
default:
$_field['skin'] = 'section-field-style';
break;
}
}
}
return $_fields;
}
/**
* Create section for this settings.
*
* @return array
*/
public function constructor_data(): array {
return [
[
'id' => 'style',
'title' => __( 'Templates', 'ti-woocommerce-wishlist' ),
'desc' => '',
'show_names' => false,
'fields' => [
[
'type' => 'checkboxonoff',
'name' => 'customstyle',
'text' => __( 'Use Theme style', 'ti-woocommerce-wishlist' ),
'std' => true,
'extra' => [ 'tiwl-hide' => '.tinvwl-style-options' ],
'class' => 'tinvwl-header-row',
],
],
],
[
'id' => 'style_options',
'title' => __( 'Template Options', 'ti-woocommerce-wishlist' ),
'show_names' => true,
'class' => 'tinvwl-style-options',
'fields' => $this->prepare_sections(),
'skin' => 'section-general',
],
[
'id' => 'style_plain',
'title' => __( 'Template Custom CSS', 'ti-woocommerce-wishlist' ),
'desc' => '',
'show_names' => false,
'fields' => [
[
'type' => 'checkboxonoff',
'name' => 'allow',
'text' => __( 'Template Custom CSS', 'ti-woocommerce-wishlist' ),
'std' => false,
'extra' => [ 'tiwl-show' => '.tiwl-style-custom-allow' ],
'class' => 'tinvwl-header-row',
],
[
'type' => 'group',
'id' => 'custom',
'class' => 'tiwl-style-custom-allow',
],
[
'type' => 'textarea',
'name' => 'css',
'text' => '',
'std' => '',
],
],
],
[
'id' => 'save_buttons',
'class' => 'only-button',
'noform' => true,
'fields' => [
[
'type' => 'button_submit',
'name' => 'setting_save',
'std' => '<span><i class="ftinvwl ftinvwl-check"></i></span>' . __( 'Save Settings', 'ti-woocommerce-wishlist' ),
'extra' => [ 'class' => 'tinvwl-btn split status-btn-ok' ],
],
[
'type' => 'button_submit',
'name' => 'setting_reset',
'std' => '<span><i class="ftinvwl ftinvwl-times"></i></span>' . __( 'Reset', 'ti-woocommerce-wishlist' ),
'extra' => [ 'class' => 'tinvwl-btn split status-btn-ok tinvwl-confirm-reset' ],
],
[
'type' => 'button_submit_quick',
'name' => 'setting_save_quick',
'std' => '<span><i class="ftinvwl ftinvwl-floppy-o"></i></span>' . __( 'Save', 'ti-woocommerce-wishlist' ),
],
],
],
];
}
/**
* Prepare style fields for sections fields
*
* @param array $fields Array of fields list.
* @param array $data Array of default values for fields.
*
* @return array
*/
public function prepare_fields( array $fields = [], array $data = [] ): array {
foreach ( $fields as &$field ) {
if ( ! array_key_exists( 'selector', $field ) || ! array_key_exists( 'element', $field ) ) {
continue;
}
$field['name'] = $this->create_selectorkey( $field['selector'], $field['element'] );
if ( ! array_key_exists( 'std', $field ) ) {
$field['std'] = '';
}
if ( isset( $data[ $field['selector'] ][ $field['element'] ] ) ) {
$value = $data[ $field['selector'] ][ $field['element'] ];
if ( array_key_exists( 'format', (array) $field ) ) {
$pregx = preg_replace( '/(\[|\]|\\|\/|\^|\$|\%|\.|\||\?|\*|\+|\(|\)|\{|\})/', '\\\${1}', $field['format'] );
$pregx = str_replace( '\{0\}', '(.*?)', $pregx );
$pregx = '/^' . $pregx . '$/i';
if ( preg_match( $pregx, $value, $matches ) ) {
if ( isset( $matches[1] ) ) {
$field['std'] = trim( $matches[1] );
$field['std'] = preg_replace( '/^\.\.\//', TINVWL_URL . 'assets/', $field['std'] );
}
}
} else {
$field['std'] = $value;
}
}
unset( $field['selector'], $field['element'], $field['format'] );
}
return $fields;
}
/**
* Save value to database
*
* @param array $data Post section data.
*
* @return void
*/
public function constructor_save( array $data ): void {
if ( empty( $data ) || ! is_array( $data ) ) {
return;
}
if ( array_key_exists( 'style', (array) $data ) && array_key_exists( 'style_options', (array) $data ) ) {
if ( false === $data['style']['customstyle'] ) {
$data['style_options']['css'] = $this->convert_styles( $data['style_options'] );
}
delete_transient( $this->_name . '_dynamic_' );
}
if ( array_key_exists( 'style_plain', (array) $data ) ) {
if ( ! $data['style_plain']['allow'] ) {
$data['style_plain']['css'] = '';
}
if ( empty( $data['style_plain']['css'] ) ) {
$data['style_plain']['allow'] = false;
}
}
if ( filter_input( INPUT_POST, 'save_buttons-setting_reset' ) ) {
foreach ( array_keys( $data ) as $key ) {
if ( $key != 'style' ) {
$data[ $key ] = array();
}
}
}
parent::constructor_save( $data );
if ( filter_input( INPUT_POST, 'save_buttons-setting_reset' ) ) {
tinv_update_option( 'style_options', '', array() );
}
}
/**
* Generate fields name for form
*
* @param string $selector Selector for fields.
* @param string $element Attribute name.
*
* @return string
*/
public function create_selectorkey( string $selector, string $element ): string {
return md5( $selector . '||' . $element );
}
/**
* Create array of css attributes
*
* @param string $css CSS content.
*
* @return array
*/
public function break_css( string $css ): array {
$results = array();
$css = preg_replace( '!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css );
$css = preg_replace( '/(\r|\n|\t| {2,})/', '', $css );
$css = str_replace( array( '{', '}' ), array( ' { ', ' } ' ), $css );
preg_match_all( '/(.+?)\s*?\{\s*?(.+?)\s*?\}/', $css, $matches );
foreach ( array_keys( $matches[0] ) as $i ) {
foreach ( explode( ';', $matches[2][ $i ] ) as $attr ) {
if ( strlen( trim( $attr ) ) > 0 ) {
list( $name, $value ) = explode( ':', $attr );
$results[ trim( $matches[1][ $i ] ) ][ trim( $name ) ] = trim( $value );
}
}
}
return $results;
}
/**
* Convert settings to css
*
* @param array $style Array of style attributes.
*
* @return string
*/
public function convert_styles( array $style = [] ): string {
$fields = $this->default_style_settings();
$styles = array();
foreach ( $fields as $field ) {
if ( ! array_key_exists( 'selector', $field ) || ! array_key_exists( 'element', $field ) ) {
continue;
}
$key = $this->create_selectorkey( $field['selector'], $field['element'] );
if ( array_key_exists( $key, (array) $style ) ) {
$value = $style[ $key ];
if ( array_key_exists( 'format', $field ) ) {
$value = str_replace( '{0}', $value, $field['format'] );
}
$styles[ $field['selector'] ][ $field['element'] ] = $value;
}
}
foreach ( $styles as $selector => &$elements ) {
foreach ( $elements as $key => &$element ) {
$element = sprintf( '%s:%s;', $key, $element );
}
$elements = implode( '', $elements );
$elements = sprintf( '%s {%s}', $selector, $elements );
}
$styles = implode( ' ', $styles );
return $styles;
}
}