1: <?php
2:
3: 4: 5:
6: class Papi_Core_Conditional_Rule {
7:
8: 9: 10: 11: 12:
13: public $operator = '=';
14:
15: 16: 17: 18: 19:
20: public $slug;
21:
22: 23: 24: 25: 26:
27: public $source;
28:
29: 30: 31: 32: 33:
34: public $value;
35:
36: 37: 38: 39: 40:
41: public function __construct( array $rule ) {
42: $this->setup( $rule );
43: }
44:
45: 46: 47: 48: 49:
50: public function get_field_slug() {
51: if ( preg_match( '/\[|\]/', $this->slug ) ) {
52: $slug = preg_replace( '/\[|\]/', '.', $this->slug );
53: $slug = str_replace( '..', '.', $slug );
54: return substr( $slug, 0, -1 );
55: }
56:
57: return $this->slug;
58: }
59:
60: 61: 62: 63: 64:
65: public function get_source() {
66: if ( is_callable( $this->source ) ) {
67: return call_user_func_array( $this->source, [$this->slug] );
68: }
69:
70: if ( is_string( $this->source ) && strpos( $this->source, '#' ) !== false ) {
71: $source = explode( '#', $this->source );
72:
73: if ( empty( $source[0] ) || empty( $source[1] ) ) {
74: return $this->source;
75: }
76:
77: $source[0] = new $source[0]();
78:
79: if ( method_exists( $source[0], $source[1] ) ) {
80: return call_user_func_array( $source, [$this->slug] );
81: }
82:
83: return;
84: }
85:
86: return $this->source;
87: }
88:
89: 90: 91: 92: 93: 94: 95:
96: public function setup_source( $value ) {
97: if ( is_array( $value ) && count( $value ) === 2 && is_object( $value[0] ) && is_string( $value[1] ) ) {
98: return sprintf( '%s#%s', get_class( $value[0] ), $value[1] );
99: }
100:
101: if ( is_string( $value ) && is_callable( $value ) ) {
102: return $value;
103: }
104:
105:
106: if ( is_object( $value ) && $value instanceof Closure ) {
107: return '';
108: }
109:
110: return $value;
111: }
112:
113: 114: 115: 116: 117:
118: private function setup( array $rule ) {
119: foreach ( $rule as $key => $value ) {
120: if ( $key === 'operator' ) {
121: $value = strtoupper( $value );
122: $value = html_entity_decode( $value );
123: } else if ( $key === 'slug' ) {
124: $value = papify( $value );
125: } else if ( $key === 'source' ) {
126: $value = $this->setup_source( $value );
127: }
128:
129: $this->$key = $value;
130: }
131: }
132: }
133: