Concerns
1 year ago
Contracts
1 year ago
ComplexConditionSet.php
1 year ago
Config.php
1 year ago
FieldCondition.php
1 year ago
NestedCondition.php
1 year ago
SimpleConditionSet.php
1 year ago
FieldCondition.php
148 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Give\Vendors\StellarWP\FieldConditions; |
| 4 | |
| 5 | use InvalidArgumentException; |
| 6 | use Give\Vendors\StellarWP\FieldConditions\Concerns\HasLogicalOperator; |
| 7 | use Give\Vendors\StellarWP\FieldConditions\Contracts\Condition; |
| 8 | |
| 9 | /** |
| 10 | * @since 1.0.0 |
| 11 | */ |
| 12 | class FieldCondition implements Condition |
| 13 | { |
| 14 | use HasLogicalOperator; |
| 15 | |
| 16 | const COMPARISON_OPERATORS = ['=', '!=', '>', '>=', '<', '<=', 'contains', 'not_contains']; |
| 17 | |
| 18 | /** @var string */ |
| 19 | const TYPE = 'basic'; |
| 20 | |
| 21 | /** @var string */ |
| 22 | protected $field; |
| 23 | |
| 24 | /** @var mixed */ |
| 25 | protected $value; |
| 26 | |
| 27 | /** @var string */ |
| 28 | protected $comparisonOperator; |
| 29 | |
| 30 | protected $strict = false; |
| 31 | |
| 32 | /** |
| 33 | * Create a new FieldCondition. |
| 34 | * |
| 35 | * @since 1.0.0 |
| 36 | * |
| 37 | * @param mixed $value |
| 38 | */ |
| 39 | public function __construct(string $field, string $comparisonOperator, $value, string $logicalOperator = 'and') |
| 40 | { |
| 41 | if ($this->isInvalidComparisonOperator($comparisonOperator)) { |
| 42 | throw Config::throwInvalidArgumentException( |
| 43 | "Invalid comparison operator: $comparisonOperator. Must be one of: " . implode( |
| 44 | ', ', |
| 45 | self::COMPARISON_OPERATORS |
| 46 | ) |
| 47 | ); |
| 48 | } |
| 49 | |
| 50 | $this->field = $field; |
| 51 | $this->comparisonOperator = $comparisonOperator; |
| 52 | $this->value = $value; |
| 53 | $this->setLogicalOperator($logicalOperator); |
| 54 | } |
| 55 | |
| 56 | /** |
| 57 | * @since 1.0.0 |
| 58 | * |
| 59 | * @inheritDoc |
| 60 | */ |
| 61 | public function jsonSerialize(): array |
| 62 | { |
| 63 | return [ |
| 64 | 'type' => static::TYPE, |
| 65 | 'field' => $this->field, |
| 66 | 'value' => $this->value, |
| 67 | 'strictComparison' => $this->strict, |
| 68 | 'comparisonOperator' => $this->comparisonOperator, |
| 69 | 'logicalOperator' => $this->logicalOperator, |
| 70 | ]; |
| 71 | } |
| 72 | |
| 73 | /** |
| 74 | * @since 1.0.0 |
| 75 | */ |
| 76 | public function passes(array $values): bool |
| 77 | { |
| 78 | if (!isset($values[$this->field])) { |
| 79 | throw new InvalidArgumentException("Field {$this->field} not found in test values."); |
| 80 | } |
| 81 | |
| 82 | $testValue = $values[$this->field]; |
| 83 | |
| 84 | if ($this->strict && $this->comparisonOperator !== '!=' && gettype($testValue) !== gettype($this->value)) { |
| 85 | return false; |
| 86 | } |
| 87 | |
| 88 | switch ($this->comparisonOperator) { |
| 89 | case '=': |
| 90 | return $testValue == $this->value; |
| 91 | case '!=': |
| 92 | return $this->strict ? $testValue !== $this->value : $testValue != $this->value; |
| 93 | case '>': |
| 94 | return $testValue > $this->value; |
| 95 | case '>=': |
| 96 | return $testValue >= $this->value; |
| 97 | case '<': |
| 98 | return $testValue < $this->value; |
| 99 | case '<=': |
| 100 | return $testValue <= $this->value; |
| 101 | case 'contains': |
| 102 | return ('' == $this->value || false !== strpos($testValue, $this->value)); |
| 103 | case 'not_contains': |
| 104 | return ('' == $this->value || false === strpos($testValue, $this->value)); |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | /** |
| 109 | * @inheritDoc |
| 110 | */ |
| 111 | public function fails(array $values): bool |
| 112 | { |
| 113 | return !$this->passes($values); |
| 114 | } |
| 115 | |
| 116 | /** |
| 117 | * Sets the condition to strict mode. |
| 118 | * |
| 119 | * @since 1.1.0 |
| 120 | */ |
| 121 | public function strict(bool $strict = true): self |
| 122 | { |
| 123 | $this->strict = $strict; |
| 124 | |
| 125 | return $this; |
| 126 | } |
| 127 | |
| 128 | /** |
| 129 | * Check if the provided operator is invalid. |
| 130 | * |
| 131 | * @since 1.0.0 |
| 132 | */ |
| 133 | protected function isInvalidComparisonOperator(string $operator): bool |
| 134 | { |
| 135 | return !in_array($operator, static::COMPARISON_OPERATORS, true); |
| 136 | } |
| 137 | |
| 138 | /** |
| 139 | * Check if the provided boolean is invalid. |
| 140 | * |
| 141 | * @since 1.0.0 |
| 142 | */ |
| 143 | protected function isInvalidLogicalOperator(string $operator): bool |
| 144 | { |
| 145 | return !in_array($operator, Condition::LOGICAL_OPERATORS, true); |
| 146 | } |
| 147 | } |
| 148 |