packages/kirki-framework/field-dimensions/src/Dimensions.php
<?php
/**
* Override field methods
*
* @package kirki-framework/field-dimensions
* @copyright Copyright (c) 2019, Ari Stathopoulos (@aristath)
* @license https://opensource.org/licenses/MIT
* @since 1.0
*/
namespace Kirki\Field;
use Kirki;
use Kirki\Field;
use Kirki\URL;
/**
* Field overrides.
*
* @since 1.0
*/
class Dimensions extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-dimensions';
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = array() ) {
add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
add_action( 'customize_preview_init', array( $this, 'enqueue_customize_preview_scripts' ) );
add_filter( 'kirki_output_control_classnames', array( $this, 'output_control_classnames' ) );
$args['required'] = isset( $args['required'] ) ? (array) $args['required'] : array();
$labels = array(
'left-top' => esc_html__( 'Left Top', 'kirki' ),
'left-center' => esc_html__( 'Left Center', 'kirki' ),
'left-bottom' => esc_html__( 'Left Bottom', 'kirki' ),
'right-top' => esc_html__( 'Right Top', 'kirki' ),
'right-center' => esc_html__( 'Right Center', 'kirki' ),
'right-bottom' => esc_html__( 'Right Bottom', 'kirki' ),
'center-top' => esc_html__( 'Center Top', 'kirki' ),
'center-center' => esc_html__( 'Center Center', 'kirki' ),
'center-bottom' => esc_html__( 'Center Bottom', 'kirki' ),
'font-size' => esc_html__( 'Font Size', 'kirki' ),
'font-weight' => esc_html__( 'Font Weight', 'kirki' ),
'line-height' => esc_html__( 'Line Height', 'kirki' ),
'font-style' => esc_html__( 'Font Style', 'kirki' ),
'letter-spacing' => esc_html__( 'Letter Spacing', 'kirki' ),
'word-spacing' => esc_html__( 'Word Spacing', 'kirki' ),
'top' => esc_html__( 'Top', 'kirki' ),
'bottom' => esc_html__( 'Bottom', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'size' => esc_html__( 'Size', 'kirki' ),
'spacing' => esc_html__( 'Spacing', 'kirki' ),
'width' => esc_html__( 'Width', 'kirki' ),
'height' => esc_html__( 'Height', 'kirki' ),
'invalid-value' => esc_html__( 'Invalid Value', 'kirki' ),
);
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
array(
'type' => 'kirki-generic',
'default' => '',
'wrapper_opts' => array(
'gap' => 'small',
),
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : array( __CLASS__, 'sanitize' ),
'choices' => array(
'type' => 'hidden',
'parent_type' => 'kirki-dimensions',
),
),
$args
)
);
$args['choices'] = isset( $args['choices'] ) ? $args['choices'] : array();
$args['choices']['labels'] = isset( $args['choices']['labels'] ) ? $args['choices']['labels'] : array();
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
$total_items = count( $args['default'] );
$item_count = 0;
$width = 100;
$break_indexes = array();
// The 'kirki-group-break' only supports 12 group items inside a group.
if ( 2 === $total_items ) {
$width = 50;
} elseif ( 3 === $total_items ) {
$width = 33;
} elseif ( 4 === $total_items ) {
$width = 25;
} elseif ( 5 === $total_items ) {
array_push( $break_indexes, 3 );
$width = 33;
} elseif ( 6 === $total_items ) {
array_push( $break_indexes, 3 );
$width = 33;
} elseif ( 7 === $total_items || 8 === $total_items ) {
array_push( $break_indexes, 4 );
$width = 25;
} elseif ( 9 === $total_items ) {
array_push( $break_indexes, 3, 6 );
$width = 33;
} elseif ( $total_items > 9 ) {
array_push( $break_indexes, 4, 8 );
$width = 25;
}
foreach ( $args['default'] as $choice => $default ) {
$item_count++;
$label = $choice;
$label = isset( $labels[ $choice ] ) ? $labels[ $choice ] : $label;
$label = isset( $args['choices']['labels'][ $choice ] ) ? $args['choices']['labels'][ $choice ] : $label;
$wrapper_attrs = array(
'data-kirki-parent-control-type' => 'kirki-dimensions',
'class' => '{default_class} kirki-group-item kirki-w' . $width,
);
if ( $item_count === 1 ) {
$wrapper_attrs['class'] .= ' kirki-group-start';
}
if ( in_array( $item_count, $break_indexes, true ) ) {
$wrapper_attrs['class'] .= ' kirki-group-break';
}
if ( $item_count === $total_items ) {
$wrapper_attrs['class'] .= ' kirki-group-end';
}
new \Kirki\Field\Dimension(
wp_parse_args(
array(
'type' => 'kirki-dimension',
'settings' => $args['settings'] . '[' . $choice . ']',
'parent_setting' => $args['settings'],
'label' => $label,
'default' => $default,
'wrapper_attrs' => $wrapper_attrs,
'choices' => array(
'label_position' => 'bottom',
),
'js_vars' => array(),
'css_vars' => array(),
'output' => array(),
),
$args
)
);
}
}
/**
* Sanitizes dimension controls.
*
* @static
* @access public
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return array();
}
foreach ( $value as $key => $val ) {
$value[ $key ] = sanitize_text_field( $val );
}
return $value;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_scripts() {
wp_enqueue_style( 'kirki-field-dimensions', URL::get_from_path( dirname( __DIR__ ) . '/dist/control.css' ), array(), '1.0' );
}
/**
* Enqueue scripts & styles on customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_customize_preview_scripts() {
wp_enqueue_script( 'kirki-field-dimensions', URL::get_from_path( dirname( __DIR__ ) ) . '/dist/preview.js', array( 'wp-hooks' ), '1.0', true );
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-dimensions'] = '\Kirki\Field\CSS\Dimensions';
return $classnames;
}
}