1 | <?php |
||
2 | /** |
||
3 | * Override field methods |
||
4 | * |
||
5 | * @package Kirki |
||
6 | * @subpackage Controls |
||
7 | * @copyright Copyright (c) 2017, Aristeides Stathopoulos |
||
8 | * @license https://opensource.org/licenses/MIT |
||
9 | * @since 2.2.7 |
||
10 | */ |
||
11 | |||
12 | /** |
||
13 | * Field overrides. |
||
14 | */ |
||
15 | class Kirki_Field_Repeater extends Kirki_Field { |
||
16 | |||
17 | /** |
||
18 | * Used only on repeaters. |
||
19 | * Contains an array of the fields. |
||
20 | * |
||
21 | * @access protected |
||
22 | * @var array |
||
23 | */ |
||
24 | protected $fields = array(); |
||
25 | |||
26 | /** |
||
27 | * Sets the control type. |
||
28 | * |
||
29 | * @access protected |
||
30 | */ |
||
31 | protected function set_type() { |
||
32 | $this->type = 'repeater'; |
||
33 | } |
||
34 | |||
35 | /** |
||
36 | * Sets the $transport |
||
37 | * |
||
38 | * @access protected |
||
39 | */ |
||
40 | protected function set_transport() { |
||
41 | |||
42 | // Force using refresh mode. |
||
43 | // Currently the repeater control does not support postMessage. |
||
44 | $this->transport = 'refresh'; |
||
45 | } |
||
46 | |||
47 | |||
48 | /** |
||
49 | * Sets the $sanitize_callback |
||
50 | * |
||
51 | * @access protected |
||
52 | */ |
||
53 | protected function set_sanitize_callback() { |
||
54 | |||
55 | // If a custom sanitize_callback has been defined, |
||
56 | // then we don't need to proceed any further. |
||
57 | if ( ! empty( $this->sanitize_callback ) ) { |
||
58 | return; |
||
59 | } |
||
60 | $this->sanitize_callback = array( $this, 'sanitize' ); |
||
61 | |||
62 | } |
||
63 | |||
64 | /** |
||
65 | * The sanitize method that will be used as a falback |
||
66 | * |
||
67 | * @param string|array $value The control's value. |
||
68 | */ |
||
69 | public function sanitize( $value ) { |
||
70 | |||
71 | // is the value formatted as a string? |
||
72 | if ( is_string( $value ) ) { |
||
73 | $value = rawurldecode( $value ); |
||
74 | $value = json_decode( $value, true ); |
||
75 | } |
||
76 | |||
77 | // Nothing to sanitize if we don't have fields. |
||
78 | if ( empty( $this->fields ) ) { |
||
79 | return $value; |
||
80 | } |
||
81 | |||
82 | foreach ( $value as $row_id => $row_value ) { |
||
83 | |||
84 | // Make sure the row is formatted as an array. |
||
85 | if ( ! is_array( $row_value ) ) { |
||
86 | $value[ $row_id ] = array(); |
||
87 | continue; |
||
88 | } |
||
89 | |||
90 | // Start parsing sub-fields in rows. |
||
91 | foreach ( $row_value as $subfield_id => $subfield_value ) { |
||
92 | |||
93 | // Make sure this is a valid subfield. |
||
94 | // If it's not, then unset it. |
||
95 | if ( ! isset( $this->fields[ $subfield_id ] ) ) { |
||
96 | unset( $value[ $row_id ][ $subfield_id ] ); |
||
97 | } |
||
98 | |||
99 | // Get the subfield-type. |
||
100 | if ( ! isset( $this->fields[ $subfield_id ]['type'] ) ) { |
||
101 | continue; |
||
102 | } |
||
103 | $subfield_type = $this->fields[ $subfield_id ]['type']; |
||
104 | |||
105 | // Allow using a sanitize-callback on a per-field basis. |
||
106 | if ( isset( $this->fields[ $subfield_id ]['sanitize_callback'] ) ) { |
||
107 | $subfield_value = call_user_func( $this->fields[ $subfield_id ]['sanitize_callback'], $subfield_value ); |
||
108 | } else { |
||
109 | |||
110 | switch ( $subfield_type ) { |
||
111 | case 'image': |
||
112 | case 'cropped_image': |
||
113 | case 'upload': |
||
114 | if ( ! is_numeric( $subfield_value ) && is_string( $subfield_value ) ) { |
||
115 | $subfield_value = esc_url_raw( $subfield_value ); |
||
116 | } |
||
117 | break; |
||
118 | case 'dropdown-pages': |
||
119 | $subfield_value = (int) $subfield_value; |
||
120 | break; |
||
121 | case 'color': |
||
122 | if ( $subfield_value ) { |
||
123 | $color_obj = ariColor::newColor( $subfield_value ); |
||
124 | $subfield_value = $color_obj->toCSS( $color_obj->mode ); |
||
125 | } |
||
126 | break; |
||
127 | case 'text': |
||
128 | $subfield_value = sanitize_text_field( $subfield_value ); |
||
129 | break; |
||
130 | case 'url': |
||
131 | case 'link': |
||
132 | $subfield_value = esc_url_raw( $subfield_value ); |
||
133 | break; |
||
134 | case 'email': |
||
135 | $subfield_value = filter_var( $subfield_value, FILTER_SANITIZE_EMAIL ); |
||
136 | break; |
||
137 | case 'tel': |
||
138 | $subfield_value = sanitize_text_field( $subfield_value ); |
||
139 | break; |
||
140 | case 'checkbox': |
||
141 | $subfield_value = (bool) $subfield_value; |
||
142 | break; |
||
143 | case 'select': |
||
144 | if ( isset( $this->fields[ $subfield_id ]['multiple'] ) ) { |
||
145 | if ( true === $this->fields[ $subfield_id ]['multiple'] ) { |
||
146 | $multiple = 2; |
||
0 ignored issues
–
show
Unused Code
introduced
by
Loading history...
|
|||
147 | } |
||
148 | $multiple = (int) $this->fields[ $subfield_id ]['multiple']; |
||
149 | if ( 1 < $multiple ) { |
||
150 | $subfield_value = (array) $subfield_value; |
||
151 | foreach ( $subfield_value as $sub_subfield_key => $sub_subfield_value ) { |
||
152 | $subfield_value[ $sub_subfield_key ] = sanitize_text_field( $sub_subfield_value ); |
||
153 | } |
||
154 | } else { |
||
155 | $subfield_value = sanitize_text_field( $subfield_value ); |
||
156 | } |
||
157 | } |
||
158 | break; |
||
159 | case 'radio': |
||
160 | case 'radio-image': |
||
161 | $subfield_value = sanitize_text_field( $subfield_value ); |
||
162 | break; |
||
163 | case 'textarea': |
||
164 | $subfield_value = html_entity_decode( wp_kses_post( $subfield_value ) ); |
||
165 | |||
166 | } |
||
167 | } |
||
168 | $value[ $row_id ][ $subfield_id ] = $subfield_value; |
||
169 | } |
||
170 | } |
||
171 | return $value; |
||
172 | } |
||
173 | } |
||
174 |