File "class-fields.php"

Full path: /home/dora/public_html/wp-content/plugins/wp-grid-builder/includes/settings/class-fields.php
File size: 5.9 KB
MIME-type: --
Charset: utf-8

<?php
/**
 * Fields
 *
 * @package   WP Grid Builder
 * @author    Loïc Blascos
 * @copyright 2019-2022 Loïc Blascos
 */

namespace WP_Grid_Builder\Includes\Settings;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Handle fields
 *
 * @class WP_Grid_Builder\Includes\Settings\Fields
 * @since 1.0.0
 */
class Fields {

	/**
	 * Holds registered field types.
	 *
	 * @since 1.0.0
	 * @var array
	 */
	public $fields = [
		'builder'     => __NAMESPACE__ . '\Fields\Builder',
		'card'        => __NAMESPACE__ . '\Fields\Card',
		'checkbox'    => __NAMESPACE__ . '\Fields\Checkbox',
		'code'        => __NAMESPACE__ . '\Fields\Code',
		'color'       => __NAMESPACE__ . '\Fields\Color',
		'custom'      => __NAMESPACE__ . '\Fields\Custom',
		'file'        => __NAMESPACE__ . '\Fields\File',
		'fonts'       => __NAMESPACE__ . '\Fields\Fonts',
		'gallery'     => __NAMESPACE__ . '\Fields\Gallery',
		'group'       => __NAMESPACE__ . '\Fields\Group',
		'icons'       => __NAMESPACE__ . '\Fields\Icons',
		'image'       => __NAMESPACE__ . '\Fields\Image',
		'info'        => __NAMESPACE__ . '\Fields\Info',
		'meta_query'  => __NAMESPACE__ . '\Fields\Meta_Query',
		'number'      => __NAMESPACE__ . '\Fields\Number',
		'password'    => __NAMESPACE__ . '\Fields\Password',
		'radio'       => __NAMESPACE__ . '\Fields\Radio',
		'repeater'    => __NAMESPACE__ . '\Fields\Repeater',
		'section'     => __NAMESPACE__ . '\Fields\Section',
		'select'      => __NAMESPACE__ . '\Fields\Select',
		'slider'      => __NAMESPACE__ . '\Fields\Slider',
		'table'       => __NAMESPACE__ . '\Fields\Table',
		'text_number' => __NAMESPACE__ . '\Fields\Text_Number',
		'text'        => __NAMESPACE__ . '\Fields\Text',
		'textarea'    => __NAMESPACE__ . '\Fields\Textarea',
		'toggle'      => __NAMESPACE__ . '\Fields\Toggle',
		'url'         => __NAMESPACE__ . '\Fields\Url',
	];

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function __construct() {

		$this->fields = apply_filters( 'wp_grid_builder/field_types', $this->fields );

	}

	/**
	 * Get setting fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @return array
	 */
	public function get_fields() {

		$fields = [];

		foreach ( $this->get() as $args ) {
			$fields = array_merge( $fields, $this->get_subfields( $args['fields'] ) );
		}

		return $fields;

	}

	/**
	 * Get sub fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $fields Holds fields.
	 * @return array
	 */
	public function get_subfields( $fields = [] ) {

		$subfields = [];

		foreach ( $fields as $field ) {

			// Make sure it's a valid field.
			if ( empty( $field['type'] ) || empty( $field['id'] ) ) {
				continue;
			}

			// We get subfields from sections, accordions and groups.
			if (
				empty( $field['group_names'] ) &&
				(
					'group' === $field['type'] ||
					'section' === $field['type'] ||
					'accordion' === $field['type']
				)
			) {

				// We add accordion/section/group subfields.
				$subfields += $this->get_subfields( $field['fields'] );
				continue;

			}

			$subfields[ $field['id'] ] = $field;

			// We recursively get subfields.
			if ( ! empty( $field['fields'] ) ) {
				$subfields[ $field['id'] ]['fields'] = $this->get_subfields( $field['fields'] );
			}
		}

		return $subfields;

	}

	/**
	 * Get tab fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param string $tab Tab slug.
	 * @return array
	 */
	public function get_tab_fields( $tab = '' ) {

		return array_filter(
			$this->settings['fields'],
			function( $field ) use ( $tab ) {
				return isset( $field['tab'] ) && $field['tab'] === $tab;
			}
		);

	}

	/**
	 * Get field class
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field arguments.
	 * @return string Class name.
	 */
	public function get_field_class( $field ) {

		$type = $this->get_field_type( $field );

		if ( empty( $this->fields[ $type ] ) ) {
			return false;
		}

		$class = $this->fields[ $type ];

		if ( ! class_exists( $class ) ) {
			return false;
		}

		return $class;

	}

	/**
	 * Get field type
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field arguments.
	 * @return string Field type.
	 */
	public function get_field_type( $field ) {

		if ( empty( $field['type'] ) ) {
			return false;
		}

		return $field['type'];

	}

	/**
	 * Get field value
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field arguments.
	 */
	public function get_field_value( $field ) {

		if ( empty( $field['id'] ) ) {
			return $field;
		}

		// Check and set value from global values.
		if ( isset( $this->settings['values'][ $field['id'] ] ) ) {
			$field['_value'] = $this->settings['values'][ $field['id'] ];
		}

		// Check and set default from global defaults.
		if ( isset( $this->settings['defaults'][ $field['id'] ] ) ) {
			$field['_default'] = $this->settings['defaults'][ $field['id'] ];
		}

		return $field;

	}

	/**
	 * Sanitize field value
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field arguments.
	 * @param mixed $value Holds value to sanitize arguments.
	 * @return mixed Field value.
	 */
	public function sanitize_field_value( $field, $value = '' ) {

		$class = $this->get_field_class( $field );

		if ( ! $class ) {
			return '';
		}

		return ( new $class() )->sanitize_field( $field, $value );

	}

	/**
	 * Output fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $fields Holds fields.
	 */
	public function do_fields( $fields ) {

		array_map( [ $this, 'do_field' ], $fields );

	}

	/**
	 * Output field
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $field Holds field attributes.
	 */
	public function do_field( $field ) {

		$field = $this->get_field_value( $field );
		$field = apply_filters( 'wp_grid_builder/settings/' . $this->settings['id'] . '_field', $field );
		$class = $this->get_field_class( $field );

		if ( ! $class ) {
			return;
		}

		( new $class() )->do_field( $field );

	}
}