1: <?php
2:
3: 4: 5: 6:
7: class Papi_Core_Conditional {
8:
9: 10: 11: 12: 13:
14: private $relations = [
15: 'AND',
16: 'OR'
17: ];
18:
19: 20: 21: 22: 23: 24: 25: 26:
27: public function display( array $rules, $property = null ) {
28: if ( empty( $rules ) ) {
29: return true;
30: }
31:
32: $rules = $this->prepare_rules( $rules, $property );
33:
34: if ( in_array( $rules['relation'], $this->relations ) ) {
35: return $this->display_by_relation( $rules );
36: }
37:
38: return true;
39: }
40:
41: 42: 43: 44: 45: 46: 47:
48: private function display_by_relation( array $rules ) {
49: if ( $rules['relation'] === 'AND' ) {
50: $display = true;
51:
52: foreach ( $rules as $rule ) {
53: if ( ! $display ) {
54: break;
55: }
56:
57: if ( papi_is_rule( $rule ) ) {
58: $display = papi_filter_conditional_rule_allowed( $rule );
59: }
60: }
61:
62: return $display;
63: }
64:
65: $empty = array_filter( $rules, function ( $rule ) {
66: return papi_is_rule( $rule ) ? true : null;
67: } );
68:
69: if ( empty( $empty ) ) {
70: return true;
71: }
72:
73: $result = [];
74:
75: foreach ( $rules as $rule ) {
76: if ( papi_is_rule( $rule ) ) {
77: $result[] = papi_filter_conditional_rule_allowed( $rule );
78: }
79: }
80:
81: $result = array_filter( $result, function ( $res ) {
82: return $res === true ? true : null;
83: } );
84:
85: return ! empty( $result );
86: }
87:
88: 89: 90: 91: 92: 93: 94: 95:
96: private function get_rule_slug( $rule, $property ) {
97: $arrReg = '/\[\d+\](\[\w+\])$/';
98: $slug = $property->get_slug();
99:
100: $page_type = papi_get_page_type_by_post_id();
101:
102: if ( $page_type instanceof Papi_Page_Type === false ) {
103: return $rule->slug;
104: }
105:
106: if ( preg_match( $arrReg, $slug, $out ) ) {
107: $slug = str_replace( $out[1], '[' . papi_remove_papi( $rule->slug ) . ']', $slug );
108: $property = $page_type->get_property( $slug );
109:
110: if ( papi_is_property( $property ) ) {
111: return $slug;
112: }
113: }
114:
115: return $rule->slug;
116: }
117:
118: 119: 120: 121: 122: 123: 124: 125:
126: public function prepare_rules( array $rules, $property = null ) {
127: if ( ! isset( $rules['relation'] ) ) {
128: $rules['relation'] = 'OR';
129: } else {
130: $rules['relation'] = strtoupper( $rules['relation'] );
131: }
132:
133: foreach ( $rules as $index => $value ) {
134: if ( is_string( $index ) ) {
135: continue;
136: }
137:
138: if ( is_array( $value ) ) {
139: $rules[$index] = new Papi_Core_Conditional_Rule( $value );
140:
141: if ( strpos( $rules[$index]->slug, '.' ) === false && papi_is_property( $property ) ) {
142: $rules[$index]->slug = $this->get_rule_slug(
143: $rules[$index],
144: $property
145: );
146: }
147: }
148: }
149:
150: return $rules;
151: }
152: }
153: