PluginProbe ʕ •ᴥ•ʔ
Kirki – Freeform Page Builder, Website Builder & Customizer / 6.0.13
Kirki – Freeform Page Builder, Website Builder & Customizer v6.0.13
6.2.1 6.2.0 6.1.1 6.1.0 6.0.14 6.0.13 6.0.12 6.0.11 6.0.10 6.0.9 6.0.8 6.0.7 6.0.6 6.0.5 6.0.4 6.0.3 6.0.2 6.0.1 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 4.0.19 4.0.20 4.0.21 4.0.22 4.0.23 4.0.24 4.1 4.2.0 5.0.0 5.1.0 5.1.1 5.2.0 5.2.1 5.2.2 5.2.3 6.0.0 trunk 3.0.40 3.0.41 3.0.42 3.0.43 3.0.44 3.0.45 3.1.0 3.1.1 3.1.2
kirki / customizer / packages / controls / repeater / src / Field / Repeater.php
kirki / customizer / packages / controls / repeater / src / Field Last commit date
Repeater.php 3 months ago
Repeater.php
212 lines
1 <?php
2 /**
3 * Override field methods
4 *
5 * @package kirki-framework/control-repeater
6 * @copyright Copyright (c) 2023, Themeum
7 * @license https://opensource.org/licenses/MIT
8 * @since 1.0
9 */
10
11 namespace Kirki\Field;
12
13 use Kirki\Compatibility\Field;
14 use Kirki\Field\Upload;
15
16 /**
17 * Field overrides.
18 *
19 * @since 1.0
20 */
21 class Repeater extends Field {
22
23 /**
24 * The field type.
25 *
26 * @access public
27 * @since 1.0
28 * @var string
29 */
30 public $type = 'kirki-repeater';
31
32 /**
33 * Used only on repeaters.
34 * Contains an array of the fields.
35 *
36 * @access protected
37 * @since 1.0
38 * @var array
39 */
40 protected $fields = [];
41
42 /**
43 * Dynamic property flag.
44 *
45 * @access public
46 * @since 1.0
47 * @var bool
48 */
49 public $dynamic = false;
50
51 /**
52 * Sets the control type.
53 *
54 * @access protected
55 * @since 1.0
56 * @return void
57 */
58 protected function set_type() {
59
60 $this->type = 'repeater';
61
62 }
63
64 /**
65 * Sets the $transport
66 *
67 * @access protected
68 * @since 1.0
69 * @return void
70 */
71 protected function set_transport() {
72
73 // Force using refresh mode.
74 // Currently the repeater control does not support postMessage.
75 $this->transport = 'refresh';
76
77 }
78
79
80 /**
81 * Sets the $sanitize_callback
82 *
83 * @access protected
84 * @since 1.0
85 * @return void
86 */
87 protected function set_sanitize_callback() {
88
89 if ( empty( $this->sanitize_callback ) ) {
90 $this->sanitize_callback = [ $this, 'sanitize' ];
91 }
92
93 }
94
95 /**
96 * The sanitize method that will be used as a falback
97 *
98 * @access public
99 * @since 1.0
100 * @param string|array $value The control's value.
101 */
102 public function sanitize( $value ) {
103
104 // is the value formatted as a string?
105 if ( is_string( $value ) ) {
106 $value = rawurldecode( $value );
107 $value = json_decode( $value, true );
108 }
109
110 // Nothing to sanitize if we don't have fields.
111 if ( empty( $this->fields ) ) {
112 return $value;
113 }
114
115 foreach ( $value as $row_id => $row_value ) {
116
117 // Make sure the row is formatted as an array.
118 if ( ! is_array( $row_value ) ) {
119 $value[ $row_id ] = [];
120 continue;
121 }
122
123 // Start parsing sub-fields in rows.
124 foreach ( $row_value as $subfield_id => $subfield_value ) {
125
126 // Make sure this is a valid subfield.
127 // If it's not, then unset it.
128 if ( ! isset( $this->fields[ $subfield_id ] ) ) {
129 unset( $value[ $row_id ][ $subfield_id ] );
130 }
131
132 // Get the subfield-type.
133 if ( ! isset( $this->fields[ $subfield_id ]['type'] ) ) {
134 continue;
135 }
136
137 $subfield = $this->fields[ $subfield_id ];
138 $subfield_type = $subfield['type'];
139
140 // Allow using a sanitize-callback on a per-field basis.
141 if ( isset( $this->fields[ $subfield_id ]['sanitize_callback'] ) ) {
142 $subfield_value = call_user_func( $this->fields[ $subfield_id ]['sanitize_callback'], $subfield_value );
143 } else {
144
145 switch ( $subfield_type ) {
146 case 'image':
147 case 'cropped_image':
148 case 'upload':
149 $save_as = isset( $subfield['choices'] ) && isset( $subfield['choices']['save_as'] ) ? $subfield['choices']['save_as'] : 'url';
150 $subfield_value = Upload::sanitize( $subfield_value, $save_as );
151
152 break;
153 case 'dropdown-pages':
154 $subfield_value = (int) $subfield_value;
155 break;
156 case 'color':
157 if ( $subfield_value ) {
158 $subfield_value = \Kirki\Field\ReactColorful::sanitize( $subfield_value );
159 }
160 break;
161 case 'text':
162 $subfield_value = sanitize_text_field( $subfield_value );
163 break;
164 case 'url':
165 case 'link':
166 $subfield_value = esc_url_raw( $subfield_value );
167 break;
168 case 'email':
169 $subfield_value = filter_var( $subfield_value, FILTER_SANITIZE_EMAIL );
170 break;
171 case 'tel':
172 $subfield_value = sanitize_text_field( $subfield_value );
173 break;
174 case 'checkbox':
175 $subfield_value = (bool) $subfield_value;
176 break;
177 case 'select':
178 if ( isset( $this->fields[ $subfield_id ]['multiple'] ) ) {
179 if ( true === $this->fields[ $subfield_id ]['multiple'] ) {
180 $multiple = 2;
181 }
182 $multiple = (int) $this->fields[ $subfield_id ]['multiple'];
183 if ( 1 < $multiple ) {
184 $subfield_value = (array) $subfield_value;
185 foreach ( $subfield_value as $sub_subfield_key => $sub_subfield_value ) {
186 $subfield_value[ $sub_subfield_key ] = sanitize_text_field( $sub_subfield_value );
187 }
188 } else {
189 $subfield_value = sanitize_text_field( $subfield_value );
190 }
191 }
192 break;
193 case 'radio':
194 case 'radio-image':
195 $subfield_value = sanitize_text_field( $subfield_value );
196 break;
197 case 'textarea':
198 $subfield_value = html_entity_decode( wp_kses_post( $subfield_value ) );
199
200 }
201 }
202
203 $value[ $row_id ][ $subfield_id ] = $subfield_value;
204 }
205 }
206
207 return $value;
208
209 }
210
211 }
212