first
This commit is contained in:
@ -0,0 +1,110 @@
|
||||
import controlGetValue from '../control-get-value';
|
||||
|
||||
/**
|
||||
* Compare 2 values
|
||||
*
|
||||
* @param {mixed} left Left value.
|
||||
* @param {string} operator Operator.
|
||||
* @param {mixed} right Right value.
|
||||
*
|
||||
* @return {boolean}
|
||||
*/
|
||||
function compare(left, operator, right) {
|
||||
let checkResult = true;
|
||||
|
||||
switch (operator) {
|
||||
case '==':
|
||||
// eslint-disable-next-line eqeqeq
|
||||
checkResult = left == right;
|
||||
break;
|
||||
case '===':
|
||||
checkResult = left === right;
|
||||
break;
|
||||
case '!=':
|
||||
// eslint-disable-next-line eqeqeq
|
||||
checkResult = left != right;
|
||||
break;
|
||||
case '!==':
|
||||
checkResult = left !== right;
|
||||
break;
|
||||
case '*=':
|
||||
checkResult = left.indexOf(right) !== -1;
|
||||
break;
|
||||
case '>=':
|
||||
checkResult = left >= right;
|
||||
break;
|
||||
case '<=':
|
||||
checkResult = left <= right;
|
||||
break;
|
||||
case '>':
|
||||
checkResult = left > right;
|
||||
break;
|
||||
case '<':
|
||||
checkResult = left < right;
|
||||
break;
|
||||
case '&&':
|
||||
case 'AND':
|
||||
checkResult = left && right;
|
||||
break;
|
||||
case '||':
|
||||
case 'OR':
|
||||
checkResult = left || right;
|
||||
break;
|
||||
default:
|
||||
checkResult = left;
|
||||
break;
|
||||
}
|
||||
|
||||
return checkResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditions check for controls.
|
||||
*
|
||||
* @param {Object} condition - condition params.
|
||||
* @param {Object} attributes - block attributes.
|
||||
* @param {string} relation - Can be one of 'AND' or 'OR'.
|
||||
*
|
||||
* @return {boolean} is check pass.
|
||||
*/
|
||||
export default function conditionCheck(
|
||||
condition,
|
||||
attributes,
|
||||
relation = 'AND'
|
||||
) {
|
||||
// by default result will be TRUE for relation AND
|
||||
// and FALSE for relation OR.
|
||||
let result = relation === 'AND';
|
||||
|
||||
const childRelation = result ? 'OR' : 'AND';
|
||||
|
||||
condition.forEach((data) => {
|
||||
if (Array.isArray(data) && !data.control) {
|
||||
result = compare(
|
||||
result,
|
||||
relation,
|
||||
conditionCheck(data, attributes, childRelation)
|
||||
);
|
||||
} else if (data.control) {
|
||||
let left = controlGetValue(data.control, attributes);
|
||||
const operator = data.operator || '==';
|
||||
let right = typeof data.value !== 'undefined' ? data.value : 'true';
|
||||
|
||||
if (left === 'true') {
|
||||
left = true;
|
||||
} else if (left === 'false') {
|
||||
left = false;
|
||||
}
|
||||
|
||||
if (right === 'true') {
|
||||
right = true;
|
||||
} else if (right === 'false') {
|
||||
right = false;
|
||||
}
|
||||
|
||||
result = compare(result, relation, compare(left, operator, right));
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
@ -0,0 +1,111 @@
|
||||
<?php
|
||||
/**
|
||||
* Control condition check.
|
||||
*
|
||||
* @package visual-portfolio
|
||||
*/
|
||||
|
||||
/**
|
||||
* Visual_Portfolio_Control_Condition_Check
|
||||
*/
|
||||
class Visual_Portfolio_Control_Condition_Check {
|
||||
/**
|
||||
* Compare 2 values
|
||||
*
|
||||
* @param mixed $left Left value.
|
||||
* @param string $operator Operator.
|
||||
* @param mixed $right Right value.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function compare( $left, $operator, $right ) {
|
||||
$check_result = true;
|
||||
|
||||
switch ( $operator ) {
|
||||
case '==':
|
||||
// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
|
||||
$check_result = $left == $right;
|
||||
break;
|
||||
case '===':
|
||||
$check_result = $left === $right;
|
||||
break;
|
||||
case '!=':
|
||||
// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
|
||||
$check_result = $left != $right;
|
||||
break;
|
||||
case '!==':
|
||||
$check_result = $left !== $right;
|
||||
break;
|
||||
case '*=':
|
||||
$check_result = strpos( $left, $right ) !== false;
|
||||
break;
|
||||
case '>=':
|
||||
$check_result = $left >= $right;
|
||||
break;
|
||||
case '<=':
|
||||
$check_result = $left <= $right;
|
||||
break;
|
||||
case '>':
|
||||
$check_result = $left > $right;
|
||||
break;
|
||||
case '<':
|
||||
$check_result = $left < $right;
|
||||
break;
|
||||
case '&&':
|
||||
case 'AND':
|
||||
$check_result = $left && $right;
|
||||
break;
|
||||
case '||':
|
||||
case 'OR':
|
||||
$check_result = $left || $right;
|
||||
break;
|
||||
default:
|
||||
$check_result = $left;
|
||||
break;
|
||||
}
|
||||
|
||||
return $check_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditions check for controls.
|
||||
*
|
||||
* @param array $condition - condition params.
|
||||
* @param array $attributes - block attributes.
|
||||
* @param string $relation - Can be one of 'AND' or 'OR'.
|
||||
*
|
||||
* @return boolean is check pass.
|
||||
*/
|
||||
public static function check( $condition, $attributes, $relation = 'AND' ) {
|
||||
// by default result will be TRUE for relation AND
|
||||
// and FALSE for relation OR.
|
||||
$result = 'AND' === $relation;
|
||||
$child_relation = $result ? 'OR' : 'AND';
|
||||
|
||||
foreach ( $condition as $data ) {
|
||||
if ( is_array( $data ) && ! isset( $data['control'] ) ) {
|
||||
$result = self::compare( $result, $relation, self::check( $data, $attributes, $child_relation ) );
|
||||
} elseif ( isset( $data['control'] ) ) {
|
||||
$left = Visual_Portfolio_Control_Get_Value::get( $data['control'], $attributes );
|
||||
$operator = isset( $data['operator'] ) ? $data['operator'] : '==';
|
||||
$right = isset( $data['value'] ) ? $data['value'] : 'true';
|
||||
|
||||
if ( 'true' === $left ) {
|
||||
$left = true;
|
||||
} elseif ( 'false' === $left ) {
|
||||
$left = false;
|
||||
}
|
||||
|
||||
if ( 'true' === $right ) {
|
||||
$right = true;
|
||||
} elseif ( 'false' === $right ) {
|
||||
$right = false;
|
||||
}
|
||||
|
||||
$result = self::compare( $result, $relation, self::compare( $left, $operator, $right ) );
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user