ru-se.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

class-kirki-active-callback.php (5238B)


      1 <?php
      2 /**
      3  * Active callback used with the "required" argument in fields
      4  *
      5  * @package     Kirki
      6  * @category    Core
      7  * @author      Aristeides Stathopoulos
      8  * @copyright   Copyright (c) 2016, Aristeides Stathopoulos
      9  * @license     http://opensource.org/licenses/https://opensource.org/licenses/MIT
     10  */
     11 
     12 if ( ! class_exists( 'Kirki_Active_Callback' ) ) {
     13 
     14 	/**
     15 	 * Callback class for use with the "required" argument
     16 	 */
     17 	class Kirki_Active_Callback {
     18 
     19 		/**
     20 		 * Figure out whether the current object should be displayed or not.
     21 		 *
     22 		 * @param  WP_Customize_Setting $object The current field.
     23 		 * @return boolean
     24 		 */
     25 		public static function evaluate( $object ) {
     26 
     27 			// Get all fields.
     28 			$fields = Kirki::$fields;
     29 
     30 			// Make sure the current object matches a registered field.
     31 			if ( ! isset( $object->setting->id ) || ! isset( $fields[ $object->setting->id ] ) ) {
     32 				return true;
     33 			}
     34 
     35 			$show = true;
     36 
     37 			$field = $fields[ $object->setting->id ];
     38 
     39 			if ( isset( $field['required'] ) ) {
     40 
     41 				foreach ( $field['required'] as $requirement ) {
     42 					// Handles "AND" functionality.
     43 					$show = self::evaluate_requirement( $object, $field, $requirement );
     44 					// No need to process further if one requirement returns false.
     45 					if ( ! $show ) {
     46 						return false;
     47 					}
     48 				}
     49 			}
     50 
     51 			return $show;
     52 
     53 		}
     54 
     55 		/**
     56 		 * Figure out whether the current object should be displayed or not.
     57 		 * We're only parsing a single requirement here from the array of requirements.
     58 		 * This is a proxy function that facilitates evaluating and/or conditions.
     59 		 *
     60 		 * @param  WP_Customize_Setting $object      The current field.
     61 		 * @param  object               $field       The current object.
     62 		 * @param  array                $requirement A single requirement.
     63 		 * @return boolean
     64 		 */
     65 		private static function evaluate_requirement( $object, $field, $requirement ) {
     66 
     67 			$show = true;
     68 			// Test for callables first.
     69 			if ( is_callable( $requirement ) ) {
     70 
     71 				$show = call_user_func_array( $requirement, array( $field, $object ) );
     72 
     73 			// Look for comparison array.
     74 			} elseif ( is_array( $requirement ) && isset( $requirement['operator'], $requirement['value'], $requirement['setting'] ) ) {
     75 
     76 				if ( isset( $field['option_name'] ) && '' !== $field['option_name'] ) {
     77 					if ( false === strpos( $requirement['setting'], '[' ) ) {
     78 						$requirement['setting'] = $field['option_name'] . '[' . $requirement['setting'] . ']';
     79 					}
     80 				}
     81 
     82 				$current_setting = $object->manager->get_setting( $requirement['setting'] );
     83 
     84 				/**
     85 				 * Depending on the 'operator' argument we use,
     86 				 * we'll need to perform the appropriate comparison
     87 				 * and figure out if the control will be shown or not.
     88 				 */
     89 				$show = self::compare( $requirement['value'], $current_setting->value(), $requirement['operator'] );
     90 
     91 			} else {
     92 
     93 				if ( is_array( $requirement ) ) {
     94 					// Handles "OR" functionality.
     95 					$show = false;
     96 					foreach ( $requirement as $sub_requirement ) {
     97 						$show = self::evaluate_requirement( $object, $field, $sub_requirement );
     98 						// No need to go on if one sub_requirement returns true.
     99 						if ( $show ) {
    100 							return true;
    101 						}
    102 					}
    103 				} else {
    104 					return true;
    105 				}
    106 			}
    107 
    108 			return $show;
    109 		}
    110 
    111 		/**
    112 		 * Compares the 2 values given the condition
    113 		 *
    114 		 * @param mixed  $value1   The 1st value in the comparison.
    115 		 * @param mixed  $value2   The 2nd value in the comparison.
    116 		 * @param string $operator The operator we'll use for the comparison.
    117 		 * @return boolean whether The comparison has succeded (true) or failed (false).
    118 		 */
    119 		public static function compare( $value1, $value2, $operator ) {
    120 			switch ( $operator ) {
    121 				case '===':
    122 					$show = ( $value1 === $value2 ) ? true : false;
    123 					break;
    124 				case '==':
    125 				case '=':
    126 				case 'equals':
    127 				case 'equal':
    128 					$show = ( $value1 == $value2 ) ? true : false;
    129 					break;
    130 				case '!==':
    131 					$show = ( $value1 !== $value2 ) ? true : false;
    132 					break;
    133 				case '!=':
    134 				case 'not equal':
    135 					$show = ( $value1 != $value2 ) ? true : false;
    136 					break;
    137 				case '>=':
    138 				case 'greater or equal':
    139 				case 'equal or greater':
    140 					$show = ( $value1 >= $value2 ) ? true : false;
    141 					break;
    142 				case '<=':
    143 				case 'smaller or equal':
    144 				case 'equal or smaller':
    145 					$show = ( $value1 <= $value2 ) ? true : false;
    146 					break;
    147 				case '>':
    148 				case 'greater':
    149 					$show = ( $value1 > $value2 ) ? true : false;
    150 					break;
    151 				case '<':
    152 				case 'smaller':
    153 					$show = ( $value1 < $value2 ) ? true : false;
    154 					break;
    155 				case 'contains':
    156 				case 'in':
    157 					if ( is_array( $value1 ) && ! is_array( $value2 ) ) {
    158 						$array  = $value1;
    159 						$string = $value2;
    160 					} elseif ( is_array( $value2 ) && ! is_array( $value1 ) ) {
    161 						$array  = $value2;
    162 						$string = $value1;
    163 					}
    164 					if ( isset( $array ) && isset( $string ) ) {
    165 						if ( ! in_array( $string, $array ) ) {
    166 							$show = false;
    167 						}
    168 					} else {
    169 						if ( false === strrpos( $value1, $value2 ) && false === strpos( $value2, $value1 ) ) {
    170 							$show = false;
    171 						}
    172 					}
    173 					break;
    174 				default:
    175 					$show = ( $value1 == $value2 ) ? true : false;
    176 
    177 			}
    178 
    179 			if ( isset( $show ) ) {
    180 				return $show;
    181 			}
    182 
    183 			return true;
    184 		}
    185 	}
    186 }