PluginProbe
WPGet API – Connect to any external REST API / 2.0.6
WPGet API – Connect to any external REST API v2.0.6
1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.3 2.1.4 2.1.5 2.2.0 2.2.1 2.2.10 2.2.2 2.2.3 All 97 releases
wpgetapi / lib / cmb2 / includes / CMB2_Field_Display.php

CMB2_Field_Display.php in WPGet API – Connect to any external REST API 2.0.6, at lib/cmb2/includes/CMB2_Field_Display.php

506 lines 12.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * CMB2 field display base.
4 *
5 * @since 2.2.2
6 *
7 * @category WordPress_Plugin
8 * @package CMB2
9 * @author CMB2 team
10 * @license GPL-2.0+
11 * @link https://cmb2.io
12 */
13 class CMB2_Field_Display {
14
15 /**
16 * A CMB field object
17 *
18 * @var CMB2_Field object
19 * @since 2.2.2
20 */
21 public $field;
22
23 /**
24 * The CMB field object's value.
25 *
26 * @var mixed
27 * @since 2.2.2
28 */
29 public $value;
30
31 /**
32 * Get the corresponding display class for the field type.
33 *
34 * @since 2.2.2
35 * @param CMB2_Field $field Requested field type.
36 * @return CMB2_Field_Display
37 */
38 public static function get( CMB2_Field $field ) {
39 $fieldtype = $field->type();
40 $display_class_name = $field->args( 'display_class' );
41
42 if ( empty( $display_class_name ) ) {
43 switch ( $fieldtype ) {
44 case 'text_url':
45 $display_class_name = 'CMB2_Display_Text_Url';
46 break;
47 case 'text_money':
48 $display_class_name = 'CMB2_Display_Text_Money';
49 break;
50 case 'colorpicker':
51 $display_class_name = 'CMB2_Display_Colorpicker';
52 break;
53 case 'checkbox':
54 $display_class_name = 'CMB2_Display_Checkbox';
55 break;
56 case 'wysiwyg':
57 case 'textarea_small':
58 $display_class_name = 'CMB2_Display_Textarea';
59 break;
60 case 'textarea_code':
61 $display_class_name = 'CMB2_Display_Textarea_Code';
62 break;
63 case 'text_time':
64 $display_class_name = 'CMB2_Display_Text_Time';
65 break;
66 case 'text_date':
67 case 'text_date_timestamp':
68 case 'text_datetime_timestamp':
69 $display_class_name = 'CMB2_Display_Text_Date';
70 break;
71 case 'text_datetime_timestamp_timezone':
72 $display_class_name = 'CMB2_Display_Text_Date_Timezone';
73 break;
74 case 'select':
75 case 'radio':
76 case 'radio_inline':
77 $display_class_name = 'CMB2_Display_Select';
78 break;
79 case 'multicheck':
80 case 'multicheck_inline':
81 $display_class_name = 'CMB2_Display_Multicheck';
82 break;
83 case 'taxonomy_radio':
84 case 'taxonomy_radio_inline':
85 case 'taxonomy_select':
86 case 'taxonomy_select_hierarchical':
87 case 'taxonomy_radio_hierarchical':
88 $display_class_name = 'CMB2_Display_Taxonomy_Radio';
89 break;
90 case 'taxonomy_multicheck':
91 case 'taxonomy_multicheck_inline':
92 case 'taxonomy_multicheck_hierarchical':
93 $display_class_name = 'CMB2_Display_Taxonomy_Multicheck';
94 break;
95 case 'file':
96 $display_class_name = 'CMB2_Display_File';
97 break;
98 case 'file_list':
99 $display_class_name = 'CMB2_Display_File_List';
100 break;
101 case 'oembed':
102 $display_class_name = 'CMB2_Display_oEmbed';
103 break;
104 default:
105 $display_class_name = __CLASS__;
106 break;
107 }// End switch.
108 }
109
110 if ( has_action( "cmb2_display_class_{$fieldtype}" ) ) {
111
112 /**
113 * Filters the custom field display class used for displaying the field. Class is required to extend CMB2_Type_Base.
114 *
115 * The dynamic portion of the hook name, $fieldtype, refers to the (custom) field type.
116 *
117 * @since 2.2.4
118 *
119 * @param string $display_class_name The custom field display class to use.
120 * @param object $field The `CMB2_Field` object.
121 */
122 $display_class_name = apply_filters( "cmb2_display_class_{$fieldtype}", $display_class_name, $field );
123 }
124
125 return new $display_class_name( $field );
126 }
127
128 /**
129 * Setup our class vars
130 *
131 * @since 2.2.2
132 * @param CMB2_Field $field A CMB2 field object.
133 */
134 public function __construct( CMB2_Field $field ) {
135 $this->field = $field;
136 $this->value = $this->field->value;
137 }
138
139 /**
140 * Catchall method if field's 'display_cb' is NOT defined, or field type does
141 * not have a corresponding display method
142 *
143 * @since 2.2.2
144 */
145 public function display() {
146 // If repeatable.
147 if ( $this->field->args( 'repeatable' ) ) {
148
149 // And has a repeatable value.
150 if ( is_array( $this->field->value ) ) {
151
152 // Then loop and output.
153 echo '<ul class="cmb2-' . esc_attr( sanitize_html_class( str_replace( '_', '-', $this->field->type() ) ) ) . '">';
154 foreach ( $this->field->value as $val ) {
155 $this->value = $val;
156 echo '<li>', $this->_display(), '</li>';
157 ;
158 }
159 echo '</ul>';
160 }
161 } else {
162 $this->_display();
163 }
164 }
165
166 /**
167 * Default fallback display method.
168 *
169 * @since 2.2.2
170 */
171 protected function _display() {
172 print_r( $this->value );
173 }
174 }
175
176 class CMB2_Display_Text_Url extends CMB2_Field_Display {
177 /**
178 * Display url value.
179 *
180 * @since 2.2.2
181 */
182 protected function _display() {
183 echo make_clickable( esc_url( $this->value ) );
184 }
185 }
186
187 class CMB2_Display_Text_Money extends CMB2_Field_Display {
188 /**
189 * Display text_money value.
190 *
191 * @since 2.2.2
192 */
193 protected function _display() {
194 $this->value = $this->value ? $this->value : '0';
195 echo ( ! $this->field->get_param_callback_result( 'before_field' ) ? '$' : ' ' ), $this->value;
196 }
197 }
198
199 class CMB2_Display_Colorpicker extends CMB2_Field_Display {
200 /**
201 * Display color picker value.
202 *
203 * @since 2.2.2
204 */
205 protected function _display() {
206 echo '<span class="cmb2-colorpicker-swatch"><span style="background-color:', esc_attr( $this->value ), '"></span> ', esc_html( $this->value ), '</span>';
207 }
208 }
209
210 class CMB2_Display_Checkbox extends CMB2_Field_Display {
211 /**
212 * Display multicheck value.
213 *
214 * @since 2.2.2
215 */
216 protected function _display() {
217 echo $this->value === 'on' ? 'on' : 'off';
218 }
219 }
220
221 class CMB2_Display_Select extends CMB2_Field_Display {
222 /**
223 * Display select value.
224 *
225 * @since 2.2.2
226 */
227 protected function _display() {
228 $options = $this->field->options();
229
230 $fallback = $this->field->args( 'show_option_none' );
231 if ( ! $fallback && isset( $options[''] ) ) {
232 $fallback = $options[''];
233 }
234 if ( ! $this->value && $fallback ) {
235 echo $fallback;
236 } elseif ( isset( $options[ $this->value ] ) ) {
237 echo $options[ $this->value ];
238 } else {
239 echo esc_attr( $this->value );
240 }
241 }
242 }
243
244 class CMB2_Display_Multicheck extends CMB2_Field_Display {
245 /**
246 * Display multicheck value.
247 *
248 * @since 2.2.2
249 */
250 protected function _display() {
251 if ( empty( $this->value ) || ! is_array( $this->value ) ) {
252 return;
253 }
254
255 $options = $this->field->options();
256
257 $output = array();
258 foreach ( $this->value as $val ) {
259 if ( isset( $options[ $val ] ) ) {
260 $output[] = $options[ $val ];
261 } else {
262 $output[] = esc_attr( $val );
263 }
264 }
265
266 echo implode( ', ', $output );
267 }
268 }
269
270 class CMB2_Display_Textarea extends CMB2_Field_Display {
271 /**
272 * Display textarea value.
273 *
274 * @since 2.2.2
275 */
276 protected function _display() {
277 echo wpautop( wp_kses_post( $this->value ) );
278 }
279 }
280
281 class CMB2_Display_Textarea_Code extends CMB2_Field_Display {
282 /**
283 * Display textarea_code value.
284 *
285 * @since 2.2.2
286 */
287 protected function _display() {
288 echo '<xmp class="cmb2-code">' . print_r( $this->value, true ) . '</xmp>';
289 }
290 }
291
292 class CMB2_Display_Text_Time extends CMB2_Field_Display {
293 /**
294 * Display text_time value.
295 *
296 * @since 2.2.2
297 */
298 protected function _display() {
299 echo $this->field->get_timestamp_format( 'time_format', $this->value );
300 }
301 }
302
303 class CMB2_Display_Text_Date extends CMB2_Field_Display {
304 /**
305 * Display text_date value.
306 *
307 * @since 2.2.2
308 */
309 protected function _display() {
310 echo $this->field->get_timestamp_format( 'date_format', $this->value );
311 }
312 }
313
314 class CMB2_Display_Text_Date_Timezone extends CMB2_Field_Display {
315 /**
316 * Display text_datetime_timestamp_timezone value.
317 *
318 * @since 2.2.2
319 */
320 protected function _display() {
321 $field = $this->field;
322
323 if ( empty( $this->value ) ) {
324 return;
325 }
326
327 $datetime = maybe_unserialize( $this->value );
328 $this->value = $tzstring = '';
329
330 if ( $datetime && $datetime instanceof DateTime ) {
331 $tz = $datetime->getTimezone();
332 $tzstring = $tz->getName();
333 $this->value = $datetime->getTimestamp();
334 }
335
336 $date = $this->field->get_timestamp_format( 'date_format', $this->value );
337 $time = $this->field->get_timestamp_format( 'time_format', $this->value );
338
339 echo $date, ( $time ? ' ' . $time : '' ), ( $tzstring ? ', ' . $tzstring : '' );
340 }
341 }
342
343 class CMB2_Display_Taxonomy_Radio extends CMB2_Field_Display {
344 /**
345 * Display single taxonomy value.
346 *
347 * @since 2.2.2
348 */
349 protected function _display() {
350 $taxonomy = $this->field->args( 'taxonomy' );
351 $types = new CMB2_Types( $this->field );
352 $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_Taxonomy_Radio' );
353 $terms = $type->get_object_terms();
354 $term = false;
355
356 if ( is_wp_error( $terms ) || empty( $terms ) && ( $default = $this->field->get_default() ) ) {
357 $term = get_term_by( 'slug', $default, $taxonomy );
358 } elseif ( ! empty( $terms ) ) {
359 $term = $terms[ key( $terms ) ];
360 }
361
362 if ( $term ) {
363 $link = get_edit_term_link( $term->term_id, $taxonomy );
364 echo '<a href="', esc_url( $link ), '">', esc_html( $term->name ), '</a>';
365 }
366 }
367 }
368
369 class CMB2_Display_Taxonomy_Multicheck extends CMB2_Field_Display {
370 /**
371 * Display taxonomy values.
372 *
373 * @since 2.2.2
374 */
375 protected function _display() {
376 $taxonomy = $this->field->args( 'taxonomy' );
377 $types = new CMB2_Types( $this->field );
378 $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_Taxonomy_Multicheck' );
379 $terms = $type->get_object_terms();
380
381 if ( is_wp_error( $terms ) || empty( $terms ) && ( $default = $this->field->get_default() ) ) {
382 $terms = array();
383 if ( is_array( $default ) ) {
384 foreach ( $default as $slug ) {
385 $terms[] = get_term_by( 'slug', $slug, $taxonomy );
386 }
387 } else {
388 $terms[] = get_term_by( 'slug', $default, $taxonomy );
389 }
390 }
391
392 if ( is_array( $terms ) ) {
393
394 $links = array();
395 foreach ( $terms as $term ) {
396 $link = get_edit_term_link( $term->term_id, $taxonomy );
397 $links[] = '<a href="' . esc_url( $link ) . '">' . esc_html( $term->name ) . '</a>';
398 }
399 // Then loop and output.
400 echo '<div class="cmb2-taxonomy-terms-', esc_attr( sanitize_html_class( $taxonomy ) ), '">';
401 echo implode( ', ', $links );
402 echo '</div>';
403 }
404 }
405 }
406
407 class CMB2_Display_File extends CMB2_Field_Display {
408 /**
409 * Display file value.
410 *
411 * @since 2.2.2
412 */
413 protected function _display() {
414 if ( empty( $this->value ) ) {
415 return;
416 }
417
418 $this->value = esc_url_raw( $this->value );
419
420 $types = new CMB2_Types( $this->field );
421 $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_File_Base' );
422
423 $id = $this->field->get_field_clone( array(
424 'id' => $this->field->_id( '', false ) . '_id',
425 ) )->escaped_value( 'absint' );
426
427 $this->file_output( $this->value, $id, $type );
428 }
429
430 protected function file_output( $url_value, $id, CMB2_Type_File_Base $field_type ) {
431 // If there is no ID saved yet, try to get it from the url.
432 if ( $url_value && ! $id ) {
433 $id = CMB2_Utils::image_id_from_url( esc_url_raw( $url_value ) );
434 }
435
436 if ( $field_type->is_valid_img_ext( $url_value ) ) {
437 $img_size = $this->field->args( 'preview_size' );
438
439 if ( $id ) {
440 $image = wp_get_attachment_image( $id, $img_size, null, array(
441 'class' => 'cmb-image-display',
442 ) );
443 } else {
444 $size = is_array( $img_size ) ? $img_size[0] : 200;
445 $image = '<img class="cmb-image-display" style="max-width: ' . absint( $size ) . 'px; width: 100%; height: auto;" src="' . esc_url( $url_value ) . '" alt="" />';
446 }
447
448 echo $image;
449
450 } else {
451
452 printf( '<div class="file-status"><span>%1$s <strong><a href="%2$s">%3$s</a></strong></span></div>',
453 esc_html( $field_type->_text( 'file_text', __( 'File:', 'cmb2' ) ) ),
454 esc_url( $url_value ),
455 esc_html( CMB2_Utils::get_file_name_from_path( $url_value ) )
456 );
457
458 }
459 }
460 }
461
462 class CMB2_Display_File_List extends CMB2_Display_File {
463 /**
464 * Display file_list value.
465 *
466 * @since 2.2.2
467 */
468 protected function _display() {
469 if ( empty( $this->value ) || ! is_array( $this->value ) ) {
470 return;
471 }
472
473 $types = new CMB2_Types( $this->field );
474 $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_File_Base' );
475
476 echo '<ul class="cmb2-display-file-list">';
477 foreach ( $this->value as $id => $fullurl ) {
478 echo '<li>', $this->file_output( esc_url_raw( $fullurl ), $id, $type ), '</li>';
479 }
480 echo '</ul>';
481 }
482 }
483
484 class CMB2_Display_oEmbed extends CMB2_Field_Display {
485 /**
486 * Display oembed value.
487 *
488 * @since 2.2.2
489 */
490 protected function _display() {
491 if ( ! $this->value ) {
492 return;
493 }
494
495 cmb2_do_oembed( array(
496 'url' => $this->value,
497 'object_id' => $this->field->object_id,
498 'object_type' => $this->field->object_type,
499 'oembed_args' => array(
500 'width' => '300',
501 ),
502 'field_id' => $this->field->id(),
503 ) );
504 }
505 }
506