setup_admin_scripts();
if (version_compare(CMB2_VERSION, '2.2.2', '>=')) {
$field_type_object->type = new CMB2_Type_Select($field_type_object);
}
echo $field_type_object->select(array(
'class' => 'pw_select2 pw_select',
'desc' => $field_type_object->_desc(true),
'options' => '' . $field_type_object->concat_items(),
'data-placeholder' => $field->args('attributes', 'placeholder') ? $field->args('attributes', 'placeholder') : $field->args('description'),
));
}
/**
* Render multi-value select input field
*/
public function render_pw_multiselect($field, $field_escaped_value, $field_object_id, $field_object_type, $field_type_object)
{
$this->setup_admin_scripts();
if (version_compare(CMB2_VERSION, '2.2.2', '>=')) {
$field_type_object->type = new CMB2_Type_Select($field_type_object);
}
$a = $field_type_object->parse_args('pw_multiselect', array(
'multiple' => 'multiple',
'style' => 'width: 99%',
'class' => 'pw_select2 pw_multiselect',
'name' => $field_type_object->_name() . '[]',
'id' => $field_type_object->_id(),
'desc' => $field_type_object->_desc(true),
'options' => $this->get_pw_multiselect_options($field_escaped_value, $field_type_object),
'data-placeholder' => $field->args('attributes', 'placeholder') ? $field->args('attributes', 'placeholder') : $field->args('description'),
));
$attrs = $field_type_object->concat_attrs($a, array('desc', 'options'));
echo sprintf('%s', $attrs, $a['options'], $a['desc']);
}
/**
* Return list of options for pw_multiselect
*
* Return the list of options, with selected options at the top preserving their order. This also handles the
* removal of selected options which no longer exist in the options array.
*/
public function get_pw_multiselect_options($field_escaped_value = array(), $field_type_object = null)
{
$options = (array) $field_type_object->field->options();
// If we have selected items, we need to preserve their order
if (!empty($field_escaped_value)) {
$options = $this->sort_array_by_array($options, $field_escaped_value);
}
$selected_items = '';
$other_items = '';
foreach ($options as $option_value => $option_label) {
// Clone args & modify for just this item
$option = array(
'value' => $option_value,
'label' => $option_label,
);
// Split options into those which are selected and the rest
if (in_array($option_value, (array) $field_escaped_value)) {
$option['checked'] = true;
$selected_items .= $field_type_object->select_option($option);
} else {
$other_items .= $field_type_object->select_option($option);
}
}
return $selected_items . $other_items;
}
/**
* Sort an array by the keys of another array
*
* @author Eran Galperin
* @link http://link.from.pw/1Waji4l
*/
public function sort_array_by_array(array $array, array $orderArray)
{
$ordered = array();
foreach ($orderArray as $key) {
if (array_key_exists($key, $array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
/**
* Handle sanitization for repeatable fields
*/
public function pw_multiselect_sanitize($check, $meta_value, $object_id, $field_args)
{
if (!is_array($meta_value) || !$field_args['repeatable']) {
return $check;
}
foreach ($meta_value as $key => $val) {
$meta_value[$key] = array_map('sanitize_text_field', $val);
}
return $meta_value;
}
/**
* Handle escaping for repeatable fields
*/
public function pw_multiselect_escaped_value($check, $meta_value, $field_args)
{
if (!is_array($meta_value) || !$field_args['repeatable']) {
return $check;
}
foreach ($meta_value as $key => $val) {
$meta_value[$key] = array_map('esc_attr', $val);
}
return $meta_value;
}
/**
* Add 'table-layout' class to multi-value select field
*/
public function pw_multiselect_table_row_class($check)
{
$check[] = 'pw_multiselect';
return $check;
}
/**
* Enqueue scripts and styles
*/
public function setup_admin_scripts()
{
$asset_path = apply_filters('pw_cmb2_field_select2_asset_path', plugins_url('', __FILE__));
wp_register_script('pw-select2', $asset_path . '/js/select2.min.js', array('jquery-ui-sortable'), '4.0.3');
wp_enqueue_script('pw-select2-init', $asset_path . '/js/script.js', array('cmb2-scripts', 'pw-select2'), self::VERSION);
wp_register_style('pw-select2', $asset_path . '/css/select2.min.css', array(), '4.0.3');
wp_enqueue_style('pw-select2-tweaks', $asset_path . '/css/style.css', array('pw-select2'), self::VERSION);
}
}
$pw_cmb2_field_select2 = new PW_CMB2_Field_Select2();
}