-
Notifications
You must be signed in to change notification settings - Fork 64
/
date-range.class.php
163 lines (144 loc) · 4.34 KB
/
date-range.class.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?php
/**
* Class SiteOrigin_Widget_Field_Date_Range
*/
class SiteOrigin_Widget_Field_Date_Range extends SiteOrigin_Widget_Field_Base {
/**
* Either 'relative' or 'specific'. Whether to allow relative or specific date selection.
*
* @var array
*/
protected $date_type;
protected function render_field( $value, $instance ) {
if ( $this->date_type == 'specific' ) {
$this->render_specific_date_selector();
} else {
$this->render_relative_date_selector( $value );
}
?>
<input
type="hidden"
class="siteorigin-widget-input"
value="<?php echo esc_attr( $value ); ?>"
name="<?php echo esc_attr( $this->element_name ); ?>"
/>
<?php
}
private function render_specific_date_selector() {
?>
<div class="sowb-specific-date-after">
<span>
<?php
_ex( 'From', 'From this date', 'so-widgets-bundle' );
?>
</span>
<input type="text" class="datepicker after-picker"/>
</div>
<div class="sowb-specific-date-before">
<span>
<?php
_e( 'to', 'so-widgets-bundle' );
?>
</span>
<input type="text" class="datepicker before-picker"/>
</div>
<?php
}
private function render_relative_date_selector( $value ) {
if ( ! empty( $value ) ) {
$value = json_decode(
$value,
true
);
}
$from = ! empty( $value['from'] ) ? $value['from'] : array();
$this->render_relative_date_selector_part( 'from', __( 'From', 'so-widgets-bundle' ), $from );
$to = ! empty( $value['to'] ) ? $value['to'] : array();
$this->render_relative_date_selector_part( 'to', __( 'to', 'so-widgets-bundle' ), $to );
}
private function render_relative_date_selector_part( $name, $label, $value ) {
$units = $this->get_units();
$min = $name == 'from' ? 0 : 1;
$val = ! empty( $value['value'] ) ? $value['value'] : $min;
$unit = ! empty( $value['unit'] ) ? $value['unit'] : 'days';
?>
<div class="sowb-relative-date" data-name="<?php echo esc_attr( $name ); ?>">
<span><?php echo esc_html( $label ); ?></span>
<input type="number" min="<?php echo $min; ?>" step="1" class="sowb-relative-date-value" value="<?php echo esc_attr( $val ); ?>"/>
<select class="sowb-relative-date-unit">
<?php foreach ( $units as $value => $label ) { ?>
<option
value="<?php echo esc_attr( $value ); ?>"
<?php selected( $value, $unit ); ?>
>
<?php echo esc_html( $label ); ?>
</option>
<?php } ?>
</select>
<span><?php _e( 'ago', 'so-widgets-bundle' ); ?></span>
</div>
<?php
}
private function get_units() {
return array(
'days' => __( 'days', 'so-widgets-bundle' ),
'weeks' => __( 'weeks', 'so-widgets-bundle' ),
'months' => __( 'months', 'so-widgets-bundle' ),
'years' => __( 'years', 'so-widgets-bundle' ),
);
}
public function enqueue_scripts() {
wp_enqueue_style(
'so-date-range-field',
plugin_dir_url( __FILE__ ) . 'css/date-range-field.css',
array( 'sowb-pikaday' ),
SOW_BUNDLE_VERSION
);
wp_enqueue_script(
'so-date-range-field',
plugin_dir_url( __FILE__ ) . 'js/date-range-field' . SOW_BUNDLE_JS_SUFFIX . '.js',
array( 'jquery', 'sowb-pikaday' ),
SOW_BUNDLE_VERSION
);
}
protected function sanitize_field_input( $value, $instance ) {
if ( $this->date_type == 'specific' ) {
if ( ! empty( $value ) ) {
$value = json_decode(
$value,
true
);
if ( ! empty( $value['after'] ) ) {
$value_after = new DateTime( $value['after'] );
$value['after'] = $value_after->format( 'Y-m-d' );
}
if ( ! empty( $value['before'] ) ) {
$value_before = new DateTime( $value['before'] );
$value['before'] = $value_before->format( 'Y-m-d' );
}
} else {
$value = array( 'after' => '', 'before' => '' );
}
} elseif ( $this->date_type == 'relative' ) {
if ( ! empty( $value ) ) {
$value = json_decode(
$value,
true
);
$unit_keys = array_keys( $this->get_units() );
foreach ( array( 'from', 'to' ) as $key ) {
if ( empty( $value[ $key ] ) ) {
$value[ $key ] = array();
}
$item = $value[ $key ];
$val = empty( $item['value'] ) ? 0 : (int) $item['value'];
$unit = ( ! empty( $item['unit'] ) && in_array( $item['unit'], $unit_keys ) ) ? $item['unit'] : $unit_keys[0];
$value[ $key ] = array( 'value' => $val, 'unit' => $unit );
}
} else {
$value = array( 'from' => array(), 'to' => array() );
}
}
return json_encode( $value );
}
}