Version Description
Download this release
Release Info
| Developer | champsupertramp |
| Plugin | |
| Version | 1.3.48 |
| Comparing to | |
| See all releases | |
Code changes from version 1.3.47 to 1.3.48
- core/um-actions-login.php +4 -2
- core/um-actions-profile.php +16 -3
- core/um-fields.php +5 -5
- core/um-files.php +11 -7
- core/um-filters-members.php +31 -6
- core/um-short-functions.php +42 -2
- core/um-user.php +6 -0
- index.php +1 -1
- readme.txt +15 -1
- um-config.php +10 -0
core/um-actions-login.php
CHANGED
|
@@ -78,7 +78,9 @@
|
|
| 78 |
add_action( 'um_before_login_fields', 'um_display_login_errors' );
|
| 79 |
function um_display_login_errors( $args ) {
|
| 80 |
global $ultimatemember;
|
| 81 |
-
|
|
|
|
|
|
|
| 82 |
if( $ultimatemember->form->count_errors() > 0 ) {
|
| 83 |
$error = array_values( $ultimatemember->form->errors );
|
| 84 |
$error = array_shift( $error );
|
|
@@ -155,7 +157,7 @@
|
|
| 155 |
|
| 156 |
$rememberme = ( isset($args['rememberme']) ) ? 1 : 0;
|
| 157 |
|
| 158 |
-
if ( um_get_option('deny_admin_frontend_login') && strstr( um_user('wp_roles' ), 'administrator' ) )
|
| 159 |
wp_die( __('This action has been prevented for security measures.','ultimatemember') );
|
| 160 |
|
| 161 |
$ultimatemember->user->auto_login( um_user('ID'), $rememberme );
|
| 78 |
add_action( 'um_before_login_fields', 'um_display_login_errors' );
|
| 79 |
function um_display_login_errors( $args ) {
|
| 80 |
global $ultimatemember;
|
| 81 |
+
|
| 82 |
+
$error = '';
|
| 83 |
+
|
| 84 |
if( $ultimatemember->form->count_errors() > 0 ) {
|
| 85 |
$error = array_values( $ultimatemember->form->errors );
|
| 86 |
$error = array_shift( $error );
|
| 157 |
|
| 158 |
$rememberme = ( isset($args['rememberme']) ) ? 1 : 0;
|
| 159 |
|
| 160 |
+
if ( um_get_option('deny_admin_frontend_login') && ! isset( $_GET['provider'] ) && strstr( um_user('wp_roles' ), 'administrator' ) )
|
| 161 |
wp_die( __('This action has been prevented for security measures.','ultimatemember') );
|
| 162 |
|
| 163 |
$ultimatemember->user->auto_login( um_user('ID'), $rememberme );
|
core/um-actions-profile.php
CHANGED
|
@@ -380,10 +380,23 @@
|
|
| 380 |
<?php if ( $ultimatemember->fields->viewing == true && um_user('description') && $args['show_bio'] ) { ?>
|
| 381 |
|
| 382 |
<div class="um-meta-text">
|
| 383 |
-
<?php
|
| 384 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 385 |
<?php else : ?>
|
| 386 |
-
<?php echo
|
| 387 |
<?php endif; ?>
|
| 388 |
</div>
|
| 389 |
|
| 380 |
<?php if ( $ultimatemember->fields->viewing == true && um_user('description') && $args['show_bio'] ) { ?>
|
| 381 |
|
| 382 |
<div class="um-meta-text">
|
| 383 |
+
<?php
|
| 384 |
+
$allowed_tags = array(
|
| 385 |
+
'a' => array(
|
| 386 |
+
'href' => array(),
|
| 387 |
+
'title' => array()
|
| 388 |
+
),
|
| 389 |
+
'br' => array(),
|
| 390 |
+
'em' => array(),
|
| 391 |
+
'strong' => array(),
|
| 392 |
+
);
|
| 393 |
+
|
| 394 |
+
$description = get_user_meta( um_user('ID') , 'description', true);
|
| 395 |
+
|
| 396 |
+
if( um_get_option( 'profile_show_html_bio' ) ) : ?>
|
| 397 |
+
<?php echo make_clickable( wp_kses( $description, $allowed_tags) ); ?>
|
| 398 |
<?php else : ?>
|
| 399 |
+
<?php echo esc_html( $description ); ?>
|
| 400 |
<?php endif; ?>
|
| 401 |
</div>
|
| 402 |
|
core/um-fields.php
CHANGED
|
@@ -1587,7 +1587,7 @@ class UM_Fields {
|
|
| 1587 |
if ( $this->is_selected($form_key, $option_value, $data) ) {
|
| 1588 |
$output.= 'selected';
|
| 1589 |
}
|
| 1590 |
-
$output .= '>'
|
| 1591 |
|
| 1592 |
}
|
| 1593 |
|
|
@@ -1657,7 +1657,7 @@ class UM_Fields {
|
|
| 1657 |
if ( $this->is_selected($key, $opt_value, $data) ) {
|
| 1658 |
$output.= 'selected';
|
| 1659 |
}
|
| 1660 |
-
$output .= '>'
|
| 1661 |
|
| 1662 |
}
|
| 1663 |
|
|
@@ -1743,7 +1743,7 @@ class UM_Fields {
|
|
| 1743 |
|
| 1744 |
$output .= ' />';
|
| 1745 |
$output .= '<span class="um-field-radio-state"><i class="'.$class.'"></i></span>';
|
| 1746 |
-
$output .= '<span class="um-field-radio-option">'
|
| 1747 |
$output .= '</label>';
|
| 1748 |
|
| 1749 |
if ($i % 2 == 0) {
|
|
@@ -1811,7 +1811,7 @@ class UM_Fields {
|
|
| 1811 |
$output .= ' />';
|
| 1812 |
|
| 1813 |
$output .= '<span class="um-field-checkbox-state"><i class="'.$class.'"></i></span>';
|
| 1814 |
-
$output .= '<span class="um-field-checkbox-option">'. $v .'</span>';
|
| 1815 |
$output .= '</label>';
|
| 1816 |
|
| 1817 |
if ($i % 2 == 0) {
|
|
@@ -1855,7 +1855,7 @@ class UM_Fields {
|
|
| 1855 |
if ( !empty( $fields ) ) {
|
| 1856 |
|
| 1857 |
$output .= '<div class="um-field-group" data-max_entries="'.$max_entries.'">
|
| 1858 |
-
<div class="um-field-group-head"><i class="um-icon-plus"></i>'
|
| 1859 |
$output .= '<div class="um-field-group-body"><a href="#" class="um-field-group-cancel"><i class="um-icon-close"></i></a>';
|
| 1860 |
|
| 1861 |
foreach($fields as $subkey => $subdata) {
|
| 1587 |
if ( $this->is_selected($form_key, $option_value, $data) ) {
|
| 1588 |
$output.= 'selected';
|
| 1589 |
}
|
| 1590 |
+
$output .= '>'.__($v, UM_TEXTDOMAIN).'</option>';
|
| 1591 |
|
| 1592 |
}
|
| 1593 |
|
| 1657 |
if ( $this->is_selected($key, $opt_value, $data) ) {
|
| 1658 |
$output.= 'selected';
|
| 1659 |
}
|
| 1660 |
+
$output .= '>'.__($v,UM_TEXTDOMAIN).'</option>';
|
| 1661 |
|
| 1662 |
}
|
| 1663 |
|
| 1743 |
|
| 1744 |
$output .= ' />';
|
| 1745 |
$output .= '<span class="um-field-radio-state"><i class="'.$class.'"></i></span>';
|
| 1746 |
+
$output .= '<span class="um-field-radio-option">'.__($v,UM_TEXTDOMAIN).'</span>';
|
| 1747 |
$output .= '</label>';
|
| 1748 |
|
| 1749 |
if ($i % 2 == 0) {
|
| 1811 |
$output .= ' />';
|
| 1812 |
|
| 1813 |
$output .= '<span class="um-field-checkbox-state"><i class="'.$class.'"></i></span>';
|
| 1814 |
+
$output .= '<span class="um-field-checkbox-option">'. __($v,UM_TEXTDOMAIN) .'</span>';
|
| 1815 |
$output .= '</label>';
|
| 1816 |
|
| 1817 |
if ($i % 2 == 0) {
|
| 1855 |
if ( !empty( $fields ) ) {
|
| 1856 |
|
| 1857 |
$output .= '<div class="um-field-group" data-max_entries="'.$max_entries.'">
|
| 1858 |
+
<div class="um-field-group-head"><i class="um-icon-plus"></i>'.__($label,UM_TEXTDOMAIN).'</div>';
|
| 1859 |
$output .= '<div class="um-field-group-body"><a href="#" class="um-field-group-cancel"><i class="um-icon-close"></i></a>';
|
| 1860 |
|
| 1861 |
foreach($fields as $subkey => $subdata) {
|
core/um-files.php
CHANGED
|
@@ -540,15 +540,21 @@ class UM_Files {
|
|
| 540 |
}
|
| 541 |
|
| 542 |
$ext = '.' . pathinfo($source, PATHINFO_EXTENSION);
|
| 543 |
-
|
| 544 |
-
$filename = $name . $ext;
|
| 545 |
-
|
| 546 |
// copy & overwrite file
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 547 |
if ( file_exists( $this->upload_basedir . $user_id . '/' . $filename ) ) {
|
| 548 |
unlink( $this->upload_basedir . $user_id . '/' . $filename );
|
| 549 |
}
|
| 550 |
copy( $source, $this->upload_basedir . $user_id . '/' . $filename );
|
| 551 |
-
|
| 552 |
$info = @getimagesize( $source );
|
| 553 |
|
| 554 |
// thumbs
|
|
@@ -596,9 +602,7 @@ class UM_Files {
|
|
| 596 |
// removes a synced profile photo
|
| 597 |
delete_user_meta( $user_id, 'synced_profile_photo' );
|
| 598 |
|
| 599 |
-
}
|
| 600 |
-
|
| 601 |
-
if ( $key == 'cover_photo' ) {
|
| 602 |
|
| 603 |
list($w, $h) = @getimagesize( $source );
|
| 604 |
|
| 540 |
}
|
| 541 |
|
| 542 |
$ext = '.' . pathinfo($source, PATHINFO_EXTENSION);
|
| 543 |
+
|
|
|
|
|
|
|
| 544 |
// copy & overwrite file
|
| 545 |
+
|
| 546 |
+
if( in_array( $key , array('profile_photo','cover_photo') ) ){
|
| 547 |
+
$filename = $key . $ext;
|
| 548 |
+
$name = $key;
|
| 549 |
+
}else{
|
| 550 |
+
$filename = basename( $source );
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
if ( file_exists( $this->upload_basedir . $user_id . '/' . $filename ) ) {
|
| 554 |
unlink( $this->upload_basedir . $user_id . '/' . $filename );
|
| 555 |
}
|
| 556 |
copy( $source, $this->upload_basedir . $user_id . '/' . $filename );
|
| 557 |
+
|
| 558 |
$info = @getimagesize( $source );
|
| 559 |
|
| 560 |
// thumbs
|
| 602 |
// removes a synced profile photo
|
| 603 |
delete_user_meta( $user_id, 'synced_profile_photo' );
|
| 604 |
|
| 605 |
+
}else if ( $key == 'cover_photo' ) {
|
|
|
|
|
|
|
| 606 |
|
| 607 |
list($w, $h) = @getimagesize( $source );
|
| 608 |
|
core/um-filters-members.php
CHANGED
|
@@ -238,13 +238,38 @@
|
|
| 238 |
/***
|
| 239 |
*** @sorting random
|
| 240 |
***/
|
| 241 |
-
add_filter('pre_user_query',
|
| 242 |
-
|
| 243 |
-
$query->query_orderby = 'ORDER by RAND()';
|
| 244 |
-
}
|
| 245 |
|
| 246 |
-
|
| 247 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 248 |
|
| 249 |
/***
|
| 250 |
*** @hook in the member results array
|
| 238 |
/***
|
| 239 |
*** @sorting random
|
| 240 |
***/
|
| 241 |
+
add_filter('pre_user_query','um_modify_sortby_randomly');
|
| 242 |
+
function um_modify_sortby_randomly( $query ){
|
|
|
|
|
|
|
| 243 |
|
| 244 |
+
if( um_is_session_started() === FALSE ){
|
| 245 |
+
session_start();
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
// Reset seed on load of initial
|
| 249 |
+
if( ! isset( $_REQUEST['members_page'] ) || $_REQUEST['members_page'] == 0 || $_REQUEST['members_page'] == 1 ) {
|
| 250 |
+
if( isset( $_SESSION['seed'] ) ) {
|
| 251 |
+
unset( $_SESSION['seed'] );
|
| 252 |
+
}
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
// Get seed from session variable if it exists
|
| 256 |
+
$seed = false;
|
| 257 |
+
if( isset( $_SESSION['seed'] ) ) {
|
| 258 |
+
$seed = $_SESSION['seed'];
|
| 259 |
+
}
|
| 260 |
+
|
| 261 |
+
// Set new seed if none exists
|
| 262 |
+
if ( ! $seed ) {
|
| 263 |
+
$seed = rand();
|
| 264 |
+
$_SESSION['seed'] = $seed;
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
if($query->query_vars["orderby"] == 'random') {
|
| 268 |
+
$query->query_orderby = 'ORDER by RAND('. $seed.')';
|
| 269 |
+
}
|
| 270 |
+
|
| 271 |
+
return $query;
|
| 272 |
+
}
|
| 273 |
|
| 274 |
/***
|
| 275 |
*** @hook in the member results array
|
core/um-short-functions.php
CHANGED
|
@@ -1319,7 +1319,24 @@ function um_fetch_user( $user_id ) {
|
|
| 1319 |
|
| 1320 |
return $full_name;
|
| 1321 |
|
| 1322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1323 |
|
| 1324 |
case 'display_name':
|
| 1325 |
|
|
@@ -1385,14 +1402,23 @@ function um_fetch_user( $user_id ) {
|
|
| 1385 |
}
|
| 1386 |
}
|
| 1387 |
|
|
|
|
| 1388 |
if ( $op == 'field' && um_get_option('display_name_field') != '' ) {
|
| 1389 |
$fields = array_filter(preg_split('/[,\s]+/', um_get_option('display_name_field') ));
|
| 1390 |
$name = '';
|
|
|
|
| 1391 |
foreach( $fields as $field ) {
|
| 1392 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1393 |
}
|
| 1394 |
}
|
| 1395 |
|
|
|
|
|
|
|
| 1396 |
return apply_filters('um_user_display_name_filter', $name, um_user('ID'), ( $attrs == 'html' ) ? 1 : 0 );
|
| 1397 |
|
| 1398 |
break;
|
|
@@ -1488,6 +1514,20 @@ function um_fetch_user( $user_id ) {
|
|
| 1488 |
return $protocol;
|
| 1489 |
}
|
| 1490 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1491 |
/**
|
| 1492 |
* Check if meta_value exists
|
| 1493 |
* @param string $key
|
| 1319 |
|
| 1320 |
return $full_name;
|
| 1321 |
|
| 1322 |
+
break;
|
| 1323 |
+
|
| 1324 |
+
case 'first_and_last_name_initial':
|
| 1325 |
+
|
| 1326 |
+
$f_and_l_initial = '';
|
| 1327 |
+
|
| 1328 |
+
if ( um_user('first_name') && um_user('last_name') ) {
|
| 1329 |
+
$initial = um_user('last_name');
|
| 1330 |
+
$f_and_l_initial = um_user('first_name').' '.$initial[0];
|
| 1331 |
+
}else{
|
| 1332 |
+
$f_and_l_initial = um_profile( $data );
|
| 1333 |
+
}
|
| 1334 |
+
|
| 1335 |
+
$f_and_l_initial = $ultimatemember->validation->safe_name_in_url( $f_and_l_initial );
|
| 1336 |
+
|
| 1337 |
+
return $f_and_l_initial;
|
| 1338 |
+
|
| 1339 |
+
break;
|
| 1340 |
|
| 1341 |
case 'display_name':
|
| 1342 |
|
| 1402 |
}
|
| 1403 |
}
|
| 1404 |
|
| 1405 |
+
|
| 1406 |
if ( $op == 'field' && um_get_option('display_name_field') != '' ) {
|
| 1407 |
$fields = array_filter(preg_split('/[,\s]+/', um_get_option('display_name_field') ));
|
| 1408 |
$name = '';
|
| 1409 |
+
|
| 1410 |
foreach( $fields as $field ) {
|
| 1411 |
+
if( um_profile( $field ) ){
|
| 1412 |
+
$name .= um_profile( $field ) . ' ';
|
| 1413 |
+
}else if( um_user( $field ) ){
|
| 1414 |
+
$name .= um_user( $field ) . ' ';
|
| 1415 |
+
}
|
| 1416 |
+
|
| 1417 |
}
|
| 1418 |
}
|
| 1419 |
|
| 1420 |
+
|
| 1421 |
+
|
| 1422 |
return apply_filters('um_user_display_name_filter', $name, um_user('ID'), ( $attrs == 'html' ) ? 1 : 0 );
|
| 1423 |
|
| 1424 |
break;
|
| 1514 |
return $protocol;
|
| 1515 |
}
|
| 1516 |
|
| 1517 |
+
/**
|
| 1518 |
+
* Set SSL to media URI
|
| 1519 |
+
* @param string $url
|
| 1520 |
+
* @return string
|
| 1521 |
+
*/
|
| 1522 |
+
function um_secure_media_uri( $url ){
|
| 1523 |
+
|
| 1524 |
+
if( is_ssl() ){
|
| 1525 |
+
$url = str_replace('http:', 'https:', $url );
|
| 1526 |
+
}
|
| 1527 |
+
|
| 1528 |
+
return $url;
|
| 1529 |
+
}
|
| 1530 |
+
|
| 1531 |
/**
|
| 1532 |
* Check if meta_value exists
|
| 1533 |
* @param string $key
|
core/um-user.php
CHANGED
|
@@ -116,6 +116,12 @@ class UM_User {
|
|
| 116 |
}
|
| 117 |
|
| 118 |
function get_cached_data( $user_id ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
if ( is_numeric( $user_id ) && $user_id > 0 ) {
|
| 120 |
$find_user = get_option("um_cache_userdata_{$user_id}");
|
| 121 |
if ( $find_user ) {
|
| 116 |
}
|
| 117 |
|
| 118 |
function get_cached_data( $user_id ) {
|
| 119 |
+
|
| 120 |
+
$disallow_cache = get_option('um_profile_object_cache_stop');
|
| 121 |
+
if( $disallow_cache ){
|
| 122 |
+
return '';
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
if ( is_numeric( $user_id ) && $user_id > 0 ) {
|
| 126 |
$find_user = get_option("um_cache_userdata_{$user_id}");
|
| 127 |
if ( $find_user ) {
|
index.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
Plugin Name: Ultimate Member
|
| 4 |
Plugin URI: http://ultimatemember.com/
|
| 5 |
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
|
| 6 |
-
Version: 1.3.
|
| 7 |
Author: Ultimate Member
|
| 8 |
Author URI: http://ultimatemember.com/
|
| 9 |
*/
|
| 3 |
Plugin Name: Ultimate Member
|
| 4 |
Plugin URI: http://ultimatemember.com/
|
| 5 |
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
|
| 6 |
+
Version: 1.3.48
|
| 7 |
Author: Ultimate Member
|
| 8 |
Author URI: http://ultimatemember.com/
|
| 9 |
*/
|
readme.txt
CHANGED
|
@@ -7,7 +7,7 @@ Tags: access control, author, authors, author profile, comments, community, comm
|
|
| 7 |
Requires at least: 4.1
|
| 8 |
Tested up to: 4.4
|
| 9 |
|
| 10 |
-
Stable Tag: 1.3.
|
| 11 |
|
| 12 |
License: GNU Version 2 or Any Later Version
|
| 13 |
|
|
@@ -148,6 +148,20 @@ The plugin works with popular caching plugins by automatically excluding Ultimat
|
|
| 148 |
16. Screenshot 16
|
| 149 |
|
| 150 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
|
| 152 |
= 1.3.47: April 6, 2016 =
|
| 153 |
* Fixed: Fatal errors with language filter file
|
| 7 |
Requires at least: 4.1
|
| 8 |
Tested up to: 4.4
|
| 9 |
|
| 10 |
+
Stable Tag: 1.3.48
|
| 11 |
|
| 12 |
License: GNU Version 2 or Any Later Version
|
| 13 |
|
| 148 |
16. Screenshot 16
|
| 149 |
|
| 150 |
== Changelog ==
|
| 151 |
+
= 1.3.48: April 11, 2016 =
|
| 152 |
+
* New: advanced option to disable profile object caching
|
| 153 |
+
* Added: ssl media uri function
|
| 154 |
+
* Added: first and last name initial as meta key
|
| 155 |
+
* Fixed: order by random and pagination
|
| 156 |
+
* Fixed: user sort by random
|
| 157 |
+
* Fixed: status message encoding
|
| 158 |
+
* Fixed: image upload and file name
|
| 159 |
+
* Fixed: user login with other provider
|
| 160 |
+
* Fixed: translation strings
|
| 161 |
+
* Fixed: dependencies fatal errors
|
| 162 |
+
* Fixed: remove notices
|
| 163 |
+
|
| 164 |
+
|
| 165 |
|
| 166 |
= 1.3.47: April 6, 2016 =
|
| 167 |
* Fixed: Fatal errors with language filter file
|
um-config.php
CHANGED
|
@@ -1934,6 +1934,16 @@ $this->sections[] = array(
|
|
| 1934 |
'full_width' => true,
|
| 1935 |
),
|
| 1936 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1937 |
array(
|
| 1938 |
'id' => 'um_flush_stop',
|
| 1939 |
'type' => 'switch',
|
| 1934 |
'full_width' => true,
|
| 1935 |
),
|
| 1936 |
|
| 1937 |
+
array(
|
| 1938 |
+
'id' => 'um_profile_object_cache_stop',
|
| 1939 |
+
'type' => 'switch',
|
| 1940 |
+
'title' => __( 'Stop caching user\'s profile data','ultimatemember' ),
|
| 1941 |
+
'default' => 0,
|
| 1942 |
+
'desc' => __('Turn off If you have performance issue.','ultimatemember'),
|
| 1943 |
+
'on' => __('On','ultimatemember'),
|
| 1944 |
+
'off' => __('Off','ultimatemember'),
|
| 1945 |
+
),
|
| 1946 |
+
|
| 1947 |
array(
|
| 1948 |
'id' => 'um_flush_stop',
|
| 1949 |
'type' => 'switch',
|
