aristath/kirki

View on GitHub
packages/kirki-framework/module-field-dependencies/src/Field_Dependencies.php

Summary

Maintainability
B
5 hrs
Test Coverage
<?php
/**
 * Automatic field-dependencies scripts calculation for Kirki controls.
 *
 * @package kirki-framework/module-field-dependencies
 * @author Ari Stathopoulos (@aristath)
 * @copyright Copyright (c) 2019, Ari Stathopoulos (@aristath)
 * @license https://opensource.org/licenses/MIT
 * @since 1.0.0
 */

namespace Kirki\Module;

use Kirki\URL;

/**
 * Field dependencies.
 */
class Field_Dependencies {

    /**
     * An array of field dependencies.
     *
     * @access private
     * @since 1.0.0
     * @var array
     */
    private $dependencies = [];

    /**
     * Constructor.
     *
     * @access public
     * @since 1.0.0
     */
    public function __construct() {
        add_action( 'customize_controls_enqueue_scripts', [ $this, 'field_dependencies' ] );
        add_filter( 'kirki_field_add_control_args', [ $this, 'field_add_control_args' ] );
    }

    /**
     * Filter control arguments.
     *
     * @access public
     * @since 1.0.0
     * @param array $args The field arguments.
     * @return array
     */
    public function field_add_control_args( $args ) {
        if ( isset( $args['active_callback'] ) ) {
            if ( is_array( $args['active_callback'] ) ) {
                if ( ! is_callable( $args['active_callback'] ) ) {

                    // Bugfix for https://github.com/aristath/kirki/issues/1961.
                    foreach ( $args['active_callback'] as $key => $val ) {
                        if ( is_callable( $val ) ) {
                            unset( $args['active_callback'][ $key ] );
                        }
                    }
                    if ( isset( $args['active_callback'][0] ) ) {
                        $args['required'] = $args['active_callback'];
                    }
                }
            }

            if ( ! empty( $args['required'] ) ) {
                $this->dependencies[ $args['settings'] ] = $args['required'];
                $args['active_callback']                 = '__return_true';
                return $args;
            }

            // No need to proceed any further if we're using the default value.
            if ( '__return_true' === $args['active_callback'] ) {
                return $args;
            }

            // Make sure the function is callable, otherwise fallback to __return_true.
            if ( ! is_callable( $args['active_callback'] ) ) {
                $args['active_callback'] = '__return_true';
            }
        } else {
            // The ReactSelect field triggered from Background field doesn't have $args['active_callback'] argument.
            if ( ! empty( $args['required'] ) ) {
                $this->dependencies[ $args['settings'] ] = $args['required'];
            }
        }

        return $args;
    }

    /**
     * Enqueues the field-dependencies script
     * and adds variables to it using the wp_localize_script function.
     * The rest is handled via JS.
     *
     * @access public
     * @return void
     */
    public function field_dependencies() {
        wp_enqueue_script( 'kirki_field_dependencies', URL::get_from_path( __DIR__ . '/script.js' ), [ 'jquery', 'customize-base', 'customize-controls' ], '4.0', true );
        wp_localize_script( 'kirki_field_dependencies', 'kirkiControlDependencies', $this->dependencies );
    }
}