forked from rubengc/cmb2-field-order
-
Notifications
You must be signed in to change notification settings - Fork 1
/
cmb2-field-order.php
121 lines (95 loc) · 3.84 KB
/
cmb2-field-order.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
/**
* @package CMB2\Field_Order
* @author Tsunoa
* @copyright Copyright (c) Tsunoa
*
* Plugin Name: CMB2 Field Type: Order
* Plugin URI: https://github.com/rubengc/cmb2-field-order
* GitHub Plugin URI: https://github.com/rubengc/cmb2-field-order
* Description: CMB2 field type to allow pick an order of predefined options.
* Version: 1.0.1
* Author: Tsunoa
* Author URI: https://tsunoa.com/
* License: GPLv2+
*/
// Exit if accessed directly
if( !defined( 'ABSPATH' ) ) exit;
if( !class_exists( 'CMB2_Field_Order' ) ) {
/**
* Class CMB2_Field_Order
*/
class CMB2_Field_Order {
/**
* Current version number
*/
const VERSION = '1.0.0';
/**
* Initialize the plugin by hooking into CMB2
*/
public function __construct() {
add_action( 'admin_enqueue_scripts', array( $this, 'setup_admin_scripts' ) );
add_action( 'cmb2_render_order', array( $this, 'render' ), 10, 5 );
add_action( 'cmb2_sanitize_order', array( $this, 'sanitize' ), 10, 4 );
}
/**
* Render field
*/
public function render( $field, $value, $object_id, $object_type, $field_type ) {
$field_name = $field->_name();
$options = (array) $field->args( 'options' );
if ( is_callable( $field->args( 'options_cb' ) ) ) {
$options_cb = call_user_func( $field->args( 'options_cb' ), $field );
if ( $options_cb && is_array( $options_cb ) ) {
$options = $options_cb + $options;
}
}
if( $options && is_array( $options ) ) {
if( ! isset( $value ) || empty( $value ) || ! is_array( $value ) ) {
$value = array();
// Initialize value if not exists or is empty
foreach( $options as $key => $option) {
$value[] = $key;
}
} else {
// Check if all options exists in $value
foreach( $options as $key => $option) {
if( ! in_array( $key, $value ) ) {
$value[] = $key;
}
}
} ?>
<ul class="cmb-order-items <?php echo ( $field->args( 'inline' ) ? 'cmb-order-inline' : '' ); ?>" id="<?php echo $field_name; ?>_items">
<?php foreach( $value as $key ) :
if( isset( $options[$key] ) ) : ?>
<li>
<input type="hidden" name="<?php echo $field_name ; ?>[]" value="<?php echo $key; ?>"><span><?php echo $options[$key]; ?></span>
</li>
<?php endif;
endforeach; ?>
</ul>
<?php
}
$field_type->_desc( true, true );
}
public function sanitize( $override_value, $value, $object_id, $field_args ) {
$fid = $field_args['id'];
if( $field_args['render_row_cb'][0]->data_to_save[$fid] ) {
$value = $field_args['render_row_cb'][0]->data_to_save[$fid];
} else {
$value = false;
}
return $value;
}
/**
* Enqueue scripts and styles
*/
public function setup_admin_scripts() {
wp_register_script( 'cmb-field-order', plugins_url( 'js/order.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), self::VERSION, true );
wp_enqueue_script( 'cmb-field-order' );
wp_enqueue_style( 'cmb-field-order', plugins_url( 'css/order.css', __FILE__ ), array(), self::VERSION );
wp_enqueue_style( 'cmb-field-order' );
}
}
$cmb2_field_order = new CMB2_Field_Order();
}