File "class-select.php"
Full path: /home/dora/public_html/wp-content/plugins/wp-grid-builder/includes/settings/fields/class-select.php
File size: 4.4 KB
MIME-type: --
Charset: utf-8
<?php
/**
* Select field
*
* @package WP Grid Builder
* @author Loïc Blascos
* @copyright 2019-2022 Loïc Blascos
*/
namespace WP_Grid_Builder\Includes\Settings\Fields;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Settings API Field
*
* @class WP_Grid_Builder\Includes\Settings\Fields\Select
* @since 1.0.0
* @see WP_Grid_Builder\Includes\Settings\Field
*/
class Select extends Field {
/**
* Render HTML field
*
* @since 1.0.0
* @access public
*
* @param array $args Holds field parameters.
*/
public function render( $args ) {
if ( ! empty( $args['placeholder'] ) ) {
echo '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="">';
}
printf(
'<select class="wpgb-select %s" id="%s" name="%s" data-search="%s" data-async="%s"%s%s>',
! $args['multiple'] && ! empty( $args['placeholder'] ) ? 'wpgb-select-has-clear' : '',
esc_attr( $args['uid'] ),
esc_attr( $args['name'] ),
esc_attr( $args['search'] ? true : '' ),
esc_attr( $args['async'] ? $args['async'] : '' ),
( $args['width'] ? ' style="width:' . (int) $args['width'] . 'px"' : '' ),
esc_attr( $args['multiple'] ? ' multiple' : '' )
);
if ( ! empty( $args['placeholder'] ) ) {
echo '<option value="">' . esc_html( $args['placeholder'] ) . '</option>';
}
if ( ! $args['validate'] && $args['value'] && ! $args['multiple'] ) {
echo '<option value="' . esc_attr( $args['value'] ) . '" selected>' . esc_html( $args['value'] ) . '</option>';
}
$this->render_options( $args['options'], $args );
echo '</select>';
}
/**
* Render optgroups and options in select field
*
* @since 1.0.0
* @access public
*
* @param array $options Holds options.
* @param array $args Holds field parameters.
*/
public function render_options( $options, $args ) {
foreach ( $options as $key => $option ) {
if ( is_array( $option ) ) {
echo '<optgroup label="' . esc_attr( $key ) . '">';
$this->render_options( $option, $args );
echo '</optgroup>';
continue;
}
printf(
'<option value="%s" %s %s>%s</option>',
esc_attr( $key ),
selected( in_array( (string) $key, array_map( 'strval', (array) $args['value'] ), true ), true, false ),
isset( $args['disabled'][ $key ] ) && $args['disabled'][ $key ] ? 'disabled' : '',
esc_html( $option )
);
}
}
/**
* Normalize field parameters
*
* @since 1.0.0
* @access public
*
* @param array $field Holds field parameters.
* @return array
*/
public function normalize( $field ) {
return wp_parse_args(
$field,
[
'default' => '',
'placeholder' => '',
'multiple' => false,
'search' => '',
'async' => '',
'validate' => true,
'width' => '',
'options' => [],
]
);
}
/**
* Sanitize field value
*
* @since 1.0.0
* @access public
*
* @param mixed $val Field value.
* @param array $args Holds field parameters.
* @return string
*/
public function sanitize( $val, $args = [] ) {
if ( is_array( $val ) ) {
$new_val = array_map(
function( $val ) use ( $args ) {
return $this->validate( $val, $args );
},
$val
);
$new_val = array_filter( $new_val );
$new_val = array_unique( $new_val );
return $new_val;
}
return $this->validate( $val, $args );
}
/**
* Validate selected value(s)
*
* @since 1.0.0
* @access public
*
* @param mixed $val Field value.
* @param array $args Holds field parameters.
* @return string|array
*/
public function validate( $val, $args ) {
// If no allowed options validation or async method.
if ( ! $args['validate'] || $args['async'] ) {
return sanitize_text_field( $val );
}
// If empty value allowed.
if ( empty( $val ) && ! empty( $args['placeholder'] ) ) {
return '';
}
$exist = $this->option_exists( $val, $args['options'] );
if ( ! $exist ) {
return '';
}
return $val;
}
/**
* Recursively check if key exists in available options
*
* @since 1.0.0
* @access public
*
* @param mixed $key Value to search in array.
* @param array $array Array to search in.
* @return boolean
*/
public function option_exists( $key, $array ) {
if ( array_key_exists( $key, $array ) ) {
return true;
} else {
foreach ( $array as $value ) {
if ( is_array( $value ) && $this->option_exists( $key, $value ) ) {
return true;
}
}
}
return false;
}
}