1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
|
4
|
|
|
/** |
5
|
|
|
* Search widget class |
6
|
|
|
* @since 1.6 |
7
|
|
|
*/ |
8
|
|
|
class GravityView_Search_WP_Widget extends WP_Widget { |
9
|
|
|
|
10
|
|
|
public function __construct() { |
11
|
|
|
|
12
|
|
|
$widget_ops = array( |
13
|
|
|
'classname' => 'widget_gravityview_search', |
14
|
|
|
'description' => __( 'A search form for a specific GravityView.', 'gravityview') |
|
|
|
|
15
|
|
|
); |
16
|
|
|
|
17
|
|
|
$widget_display = array( |
18
|
|
|
'width' => 650 |
|
|
|
|
19
|
|
|
); |
20
|
|
|
|
21
|
|
|
parent::__construct( 'gravityview_search', __( 'GravityView Search', 'gravityview' ), $widget_ops, $widget_display ); |
22
|
|
|
|
23
|
|
|
$this->load_required_files(); |
24
|
|
|
|
25
|
|
|
$gravityview_widget = GravityView_Widget_Search::getInstance(); |
26
|
|
|
|
27
|
|
|
// frontend - filter entries |
28
|
|
|
add_filter( 'gravityview_fe_search_criteria', array( $gravityview_widget, 'filter_entries' ), 10, 1 ); |
29
|
|
|
|
30
|
|
|
// frontend - add template path |
31
|
|
|
add_filter( 'gravityview_template_paths', array( $gravityview_widget, 'add_template_path' ) ); |
32
|
|
|
|
33
|
|
|
unset( $gravityview_widget ); |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
private function load_required_files() { |
37
|
|
|
if( !class_exists( 'GravityView_Widget_Search' ) ) { |
|
|
|
|
38
|
|
|
gravityview_register_gravityview_widgets(); |
39
|
|
|
} |
40
|
|
|
} |
41
|
|
|
|
42
|
|
|
private static function get_defaults() { |
43
|
|
|
return array( |
44
|
|
|
'title' => '', |
45
|
|
|
'view_id' => 0, |
46
|
|
|
'post_id' => '', |
47
|
|
|
'search_fields' => '', |
48
|
|
|
'search_clear' => 0, |
49
|
|
|
'search_mode' => 'any' |
|
|
|
|
50
|
|
|
); |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
public function widget( $args, $instance ) { |
54
|
|
|
|
55
|
|
|
// Don't show unless a View ID has been set. |
56
|
|
|
if( empty( $instance['view_id'] ) ) { |
57
|
|
|
|
58
|
|
|
do_action('gravityview_log_debug', sprintf( '%s[widget]: No View ID has been defined. Not showing the widget.', get_class($this)), $instance ); |
|
|
|
|
59
|
|
|
|
60
|
|
|
return; |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
/** This filter is documented in wp-includes/default-widgets.php */ |
64
|
|
|
$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); |
65
|
|
|
|
66
|
|
|
echo $args['before_widget']; |
|
|
|
|
67
|
|
|
|
68
|
|
|
if ( $title ) { |
69
|
|
|
echo $args['before_title'] . $title . $args['after_title']; |
|
|
|
|
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
// @todo Add to the widget configuration form |
73
|
|
|
$instance['search_layout'] = apply_filters( 'gravityview/widget/search/layout', 'vertical', $instance ); |
74
|
|
|
|
75
|
|
|
$instance['context'] = 'wp_widget'; |
76
|
|
|
|
77
|
|
|
// form |
78
|
|
|
$instance['form_id'] = GVCommon::get_meta_form_id( $instance['view_id'] ); |
79
|
|
|
$instance['form'] = GVCommon::get_form( $instance['form_id'] ); |
80
|
|
|
|
81
|
|
|
// We don't want to overwrite existing context, etc. |
82
|
|
|
$previous_view = GravityView_View::getInstance(); |
83
|
|
|
|
84
|
|
|
/** @hack */ |
85
|
|
|
new GravityView_View( $instance ); |
86
|
|
|
|
87
|
|
|
GravityView_Widget_Search::getInstance()->render_frontend( $instance ); |
88
|
|
|
|
89
|
|
|
/** |
90
|
|
|
* Restore previous View context |
91
|
|
|
* @hack |
92
|
|
|
*/ |
93
|
|
|
new GravityView_View( $previous_view ); |
94
|
|
|
|
95
|
|
|
echo $args['after_widget']; |
|
|
|
|
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
/** |
99
|
|
|
* @inheritDoc |
100
|
|
|
*/ |
101
|
|
|
public function update( $new_instance, $old_instance ) { |
102
|
|
|
|
103
|
|
|
$instance = $old_instance; |
104
|
|
|
|
105
|
|
|
if( $this->is_preview() ) { |
106
|
|
|
//Oh! Sorry but still not fully compatible with customizer |
107
|
|
|
return $instance; |
108
|
|
|
} |
109
|
|
|
|
110
|
|
|
$new_instance = wp_parse_args( (array) $new_instance, self::get_defaults() ); |
111
|
|
|
|
112
|
|
|
$instance['title'] = strip_tags( $new_instance['title'] ); |
113
|
|
|
$instance['view_id'] = absint( $new_instance['view_id'] ); |
114
|
|
|
$instance['search_fields'] = $new_instance['search_fields']; |
115
|
|
|
$instance['post_id'] = $new_instance['post_id']; |
116
|
|
|
$instance['search_clear'] = $new_instance['search_clear']; |
117
|
|
|
$instance['search_mode'] = $new_instance['search_mode']; |
118
|
|
|
|
119
|
|
|
$is_valid_embed_id = GravityView_View_Data::is_valid_embed_id( $new_instance['post_id'], $instance['view_id'] ); |
120
|
|
|
|
121
|
|
|
//check if post_id is a valid post with embedded View |
122
|
|
|
$instance['error_post_id'] = is_wp_error( $is_valid_embed_id ) ? $is_valid_embed_id->get_error_message() : NULL; |
|
|
|
|
123
|
|
|
|
124
|
|
|
// Share that the widget isn't brand new |
125
|
|
|
$instance['updated'] = 1; |
126
|
|
|
|
127
|
|
|
return $instance; |
128
|
|
|
} |
129
|
|
|
|
130
|
|
|
/** |
131
|
|
|
* @inheritDoc |
132
|
|
|
*/ |
133
|
|
|
public function form( $instance ) { |
134
|
|
|
|
135
|
|
|
// @todo Make compatible with Customizer |
136
|
|
|
if( $this->is_preview() ) { |
137
|
|
|
|
138
|
|
|
$warning = sprintf( esc_html__( 'This widget is not configurable from this screen. Please configure it on the %sWidgets page%s.', 'gravityview' ), '<a href="'.admin_url('widgets.php').'">', '</a>' ); |
|
|
|
|
139
|
|
|
|
140
|
|
|
echo wpautop( GravityView_Admin::get_floaty() . $warning ); |
|
|
|
|
141
|
|
|
|
142
|
|
|
return; |
143
|
|
|
} |
144
|
|
|
|
145
|
|
|
$instance = wp_parse_args( (array) $instance, self::get_defaults() ); |
146
|
|
|
|
147
|
|
|
$title = $instance['title']; |
148
|
|
|
$view_id = $instance['view_id']; |
149
|
|
|
$post_id = $instance['post_id']; |
150
|
|
|
$search_fields = $instance['search_fields']; |
151
|
|
|
$search_clear = $instance['search_clear']; |
152
|
|
|
$search_mode = $instance['search_mode']; |
153
|
|
|
|
154
|
|
|
$views = GVCommon::get_all_views(); |
155
|
|
|
|
156
|
|
|
// If there are no views set up yet, we get outta here. |
157
|
|
|
if( empty( $views ) ) { ?> |
158
|
|
|
<div id="select_gravityview_view"> |
159
|
|
|
<div class="wrap"><?php echo GravityView_Post_Types::no_views_text(); ?></div> |
|
|
|
|
160
|
|
|
</div> |
161
|
|
|
<?php return; |
162
|
|
|
} |
163
|
|
|
?> |
164
|
|
|
|
165
|
|
|
<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'gravityview'); ?> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></label></p> |
|
|
|
|
166
|
|
|
|
167
|
|
|
<?php |
168
|
|
|
/** |
169
|
|
|
* Display errors generated for invalid embed IDs |
170
|
|
|
* @see GravityView_View_Data::is_valid_embed_id |
171
|
|
|
*/ |
172
|
|
|
if( isset( $instance['updated'] ) && empty( $instance['view_id'] ) ) { |
173
|
|
|
?> |
174
|
|
|
<div class="error inline hide-on-view-change"> |
175
|
|
|
<p><?php esc_html_e('Please select a View to search.', 'gravityview'); ?></p> |
|
|
|
|
176
|
|
|
</div> |
177
|
|
|
<?php |
178
|
|
|
unset ( $error ); |
|
|
|
|
179
|
|
|
} |
180
|
|
|
?> |
181
|
|
|
|
182
|
|
|
<p> |
183
|
|
|
<label for="gravityview_view_id"><?php _e( 'View:', 'gravityview' ); ?></label> |
184
|
|
|
<select id="gravityview_view_id" name="<?php echo $this->get_field_name('view_id'); ?>" class="widefat"> |
|
|
|
|
185
|
|
|
<option value=""><?php esc_html_e( '— Select a View —', 'gravityview' ); ?></option> |
186
|
|
|
<?php |
187
|
|
|
foreach( $views as $view_option ) { |
188
|
|
|
$title = empty( $view_option->post_title ) ? __('(no title)', 'gravityview') : $view_option->post_title; |
|
|
|
|
189
|
|
|
echo '<option value="'. $view_option->ID .'" ' . selected( esc_attr( $view_id ), $view_option->ID, false ) . '>'. esc_html( sprintf('%s #%d', $title, $view_option->ID ) ) .'</option>'; |
|
|
|
|
190
|
|
|
} |
191
|
|
|
?> |
192
|
|
|
</select> |
193
|
|
|
|
194
|
|
|
</p> |
195
|
|
|
|
196
|
|
|
<?php |
197
|
|
|
/** |
198
|
|
|
* Display errors generated for invalid embed IDs |
199
|
|
|
* @see GravityView_View_Data::is_valid_embed_id |
200
|
|
|
*/ |
201
|
|
|
if( !empty( $instance['error_post_id'] ) ) { |
|
|
|
|
202
|
|
|
?> |
203
|
|
|
<div class="error inline"> |
204
|
|
|
<p><?php echo $instance['error_post_id']; ?></p> |
|
|
|
|
205
|
|
|
</div> |
206
|
|
|
<?php |
207
|
|
|
unset ( $error ); |
|
|
|
|
208
|
|
|
} |
209
|
|
|
?> |
210
|
|
|
|
211
|
|
|
<p> |
212
|
|
|
<label for="<?php echo $this->get_field_id('post_id'); ?>"><?php esc_html_e( 'If Embedded, Page ID:', 'gravityview' ); ?></label> |
|
|
|
|
213
|
|
|
<input class="code" size="3" id="<?php echo $this->get_field_id('post_id'); ?>" name="<?php echo $this->get_field_name('post_id'); ?>" type="text" value="<?php echo esc_attr( $post_id ); ?>" /> |
|
|
|
|
214
|
|
|
<span class="howto"><?php |
215
|
|
|
esc_html_e('To have a search performed on an embedded View, enter the ID of the post or page where the View is embedded.', 'gravityview' ); |
|
|
|
|
216
|
|
|
echo ' '.gravityview_get_link('http://docs.gravityview.co/article/222-the-search-widget', __('Learn more…', 'gravityview' ), 'target=_blank' ); |
|
|
|
|
217
|
|
|
?></span> |
218
|
|
|
</p> |
219
|
|
|
|
220
|
|
|
<p> |
221
|
|
|
<label for="<?php echo $this->get_field_id('search_clear'); ?>"><?php esc_html_e( 'Show Clear button', 'gravityview' ); ?>:</label> |
|
|
|
|
222
|
|
|
<input name="<?php echo $this->get_field_name('search_clear'); ?>" type="hidden" value="0"> |
|
|
|
|
223
|
|
|
<input id="<?php echo $this->get_field_id('search_clear'); ?>" name="<?php echo $this->get_field_name('search_clear'); ?>" type="checkbox" class="checkbox" value="1" <?php checked( $search_clear, 1, true ); ?>> |
|
|
|
|
224
|
|
|
</p> |
225
|
|
|
|
226
|
|
|
<p> |
227
|
|
|
<label><?php esc_html_e( 'Search Mode', 'gravityview' ); ?>:</label> |
228
|
|
|
<label for="<?php echo $this->get_field_id('search_mode'); ?>_any"> |
|
|
|
|
229
|
|
|
<input id="<?php echo $this->get_field_id('search_mode'); ?>_any" name="<?php echo $this->get_field_name('search_mode'); ?>" type="radio" class="radio" value="any" <?php checked( $search_mode, 'any', true ); ?>> |
|
|
|
|
230
|
|
|
<?php esc_html_e( 'Match Any Fields', 'gravityview' ); ?> |
231
|
|
|
</label> |
232
|
|
|
<label for="<?php echo $this->get_field_id('search_mode'); ?>_all"> |
|
|
|
|
233
|
|
|
<input id="<?php echo $this->get_field_id('search_mode'); ?>_all" name="<?php echo $this->get_field_name('search_mode'); ?>" type="radio" class="radio" value="all" <?php checked( $search_mode, 'all', true ); ?>> |
|
|
|
|
234
|
|
|
<?php esc_html_e( 'Match All Fields', 'gravityview' ); ?> |
235
|
|
|
</label> |
236
|
|
|
<span class="howto"><?php esc_html_e('Should search results match all search fields, or any?', 'gravityview' ); ?></span |
|
|
|
|
237
|
|
|
</p> |
238
|
|
|
|
239
|
|
|
<hr /> |
240
|
|
|
|
241
|
|
|
<?php // @todo: move style to CSS ?> |
242
|
|
|
<div style="margin-bottom: 1em;"> |
243
|
|
|
<label class="screen-reader-text" for="<?php echo $this->get_field_id('search_fields'); ?>"><?php _e( 'Searchable fields:', 'gravityview' ); ?></label> |
|
|
|
|
244
|
|
|
<div class="gv-widget-search-fields" title="<?php esc_html_e('Search Fields', 'gravityview'); ?>"> |
|
|
|
|
245
|
|
|
<input id="<?php echo $this->get_field_id('search_fields'); ?>" name="<?php echo $this->get_field_name('search_fields'); ?>" type="hidden" value="<?php echo esc_attr( $search_fields ); ?>" class="gv-search-fields-value"> |
|
|
|
|
246
|
|
|
</div> |
247
|
|
|
|
248
|
|
|
</div> |
249
|
|
|
|
250
|
|
|
<script> |
251
|
|
|
// When the widget is saved or added, refresh the Merge Tags (here for backward compatibility) |
252
|
|
|
// WordPress 3.9 added widget-added and widget-updated actions |
253
|
|
|
jQuery('#<?php echo $this->get_field_id( 'view_id' ); ?>').trigger( 'change' ); |
|
|
|
|
254
|
|
|
</script> |
255
|
|
|
<?php |
256
|
|
|
} |
257
|
|
|
|
258
|
|
|
} |