danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Search Autocomplete
|
danielebarchiesi@4
|
6 * Helper functions to retrive suggestions from database
|
danielebarchiesi@4
|
7 *
|
danielebarchiesi@4
|
8 * @authors
|
danielebarchiesi@4
|
9 * Miroslav Talenberg (Dominique CLAUSE) <http://www.axiomcafe.fr/contact>
|
danielebarchiesi@4
|
10 *
|
danielebarchiesi@4
|
11 * Sponsored by:
|
danielebarchiesi@4
|
12 * www.axiomcafe.fr
|
danielebarchiesi@4
|
13 */
|
danielebarchiesi@4
|
14
|
danielebarchiesi@4
|
15 /**
|
danielebarchiesi@4
|
16 * MENU CALLBACK:
|
danielebarchiesi@4
|
17 * Define the form to configure the suggestions.
|
danielebarchiesi@4
|
18 * @return A rendered form
|
danielebarchiesi@4
|
19 */
|
danielebarchiesi@4
|
20 function search_autocomplete_form_configure($form, &$form_state) {
|
danielebarchiesi@4
|
21 $base = "admin/config/search/search_autocomplete"; // base URL for this module configurations
|
danielebarchiesi@4
|
22
|
danielebarchiesi@4
|
23 // get data from database
|
danielebarchiesi@4
|
24 $fid = arg(4);
|
danielebarchiesi@4
|
25
|
danielebarchiesi@4
|
26 $result = db_select('search_autocomplete_forms', 'f')
|
danielebarchiesi@4
|
27 ->fields('f')
|
danielebarchiesi@4
|
28 ->condition('fid', $fid)
|
danielebarchiesi@4
|
29 ->execute()
|
danielebarchiesi@4
|
30 ->fetchAllAssoc('fid');
|
danielebarchiesi@4
|
31
|
danielebarchiesi@4
|
32 foreach ($result as $item) {
|
danielebarchiesi@4
|
33 $form['fid'] = array(
|
danielebarchiesi@4
|
34 '#type' => 'hidden',
|
danielebarchiesi@4
|
35 '#value' => $fid,
|
danielebarchiesi@4
|
36 );
|
danielebarchiesi@4
|
37 // ------------------------------------------------------------------
|
danielebarchiesi@4
|
38 // HOW - How to display Search Autocomplete suggestions
|
danielebarchiesi@4
|
39 $form['search_autocomplete_how'] = array(
|
danielebarchiesi@4
|
40 '#type' => 'fieldset',
|
danielebarchiesi@4
|
41 '#title' => t('HOW - How to display Search Autocomplete suggestions?'),
|
danielebarchiesi@4
|
42 '#collapsible' => TRUE,
|
danielebarchiesi@4
|
43 '#collapsed' => TRUE
|
danielebarchiesi@4
|
44 );
|
danielebarchiesi@4
|
45 // Minimum characters to set autocompletion on
|
danielebarchiesi@4
|
46 $form['search_autocomplete_how']['min_char'] = array(
|
danielebarchiesi@4
|
47 '#type' => 'textfield',
|
danielebarchiesi@4
|
48 '#title' => t('Minimum keyword size that uncouple autocomplete search'),
|
danielebarchiesi@4
|
49 '#description' => t('Please enter the minimum number of character a user must input before autocompletion starts.'),
|
danielebarchiesi@4
|
50 '#default_value' => $item->min_char,
|
danielebarchiesi@4
|
51 '#maxlength' => 2,
|
danielebarchiesi@4
|
52 '#required' => TRUE
|
danielebarchiesi@4
|
53 );
|
danielebarchiesi@4
|
54 // Number of suggestions to display
|
danielebarchiesi@4
|
55 $form['search_autocomplete_how']['max_sug'] = array(
|
danielebarchiesi@4
|
56 '#type' => 'textfield',
|
danielebarchiesi@4
|
57 '#title' => t('Limit of the autocomplete search result'),
|
danielebarchiesi@4
|
58 '#description' => t('Please enter the maximim number of suggestion to display.'),
|
danielebarchiesi@4
|
59 '#default_value' => $item->max_sug,
|
danielebarchiesi@4
|
60 '#maxlength' => 2,
|
danielebarchiesi@4
|
61 '#required' => TRUE
|
danielebarchiesi@4
|
62 );
|
danielebarchiesi@4
|
63 // check if form should be autosubmitted
|
danielebarchiesi@4
|
64 $form['search_autocomplete_how']['no_results'] = array(
|
danielebarchiesi@4
|
65 '#type' => 'textfield',
|
danielebarchiesi@4
|
66 '#title' => t('Behaviour when no suggestions are found'),
|
danielebarchiesi@4
|
67 '#description' => t('Enter a message to display when no results are found. Leave empty for no message.'),
|
danielebarchiesi@4
|
68 '#default_value' => $item->no_results,
|
danielebarchiesi@4
|
69 '#maxlength' => 50,
|
danielebarchiesi@4
|
70 '#required' => FALSE
|
danielebarchiesi@4
|
71 );
|
danielebarchiesi@4
|
72 // check if form should be autosubmitted
|
danielebarchiesi@4
|
73 $form['search_autocomplete_how']['auto_submit'] = array(
|
danielebarchiesi@4
|
74 '#type' => 'checkbox',
|
danielebarchiesi@4
|
75 '#title' => t('Auto Submit'),
|
danielebarchiesi@4
|
76 '#description' => t('If enabled, the form will be submitted automatically as soon as your user choose a suggestion in the popup list.'),
|
danielebarchiesi@4
|
77 '#default_value' => $item->auto_submit
|
danielebarchiesi@4
|
78 );
|
danielebarchiesi@4
|
79 // check if form should be autoredirected
|
danielebarchiesi@4
|
80 $form['search_autocomplete_how']['auto_redirect'] = array(
|
danielebarchiesi@4
|
81 '#type' => 'checkbox',
|
danielebarchiesi@4
|
82 '#title' => t('Auto Redirect'),
|
danielebarchiesi@4
|
83 '#description' => t('If enabled, the user will be directly routed to the suggestion he choosed instead of performing form validation process. Only works if "link" attribute is existing and if "Auto Submit" is enabled.'),
|
danielebarchiesi@4
|
84 '#default_value' => $item->auto_redirect
|
danielebarchiesi@4
|
85 );
|
danielebarchiesi@4
|
86
|
danielebarchiesi@4
|
87 // ------------------------------------------------------------------
|
danielebarchiesi@4
|
88 // WHAT - What to display in Search Autocomplete suggestions
|
danielebarchiesi@4
|
89 $form['search_autocomplete_what'] = array(
|
danielebarchiesi@4
|
90 '#type' => 'fieldset',
|
danielebarchiesi@4
|
91 '#title' => t('WHAT - What to display in Search Autocomplete suggestions?'),
|
danielebarchiesi@4
|
92 '#description' => t('Choose which data should be added to autocompletion suggestions.'),
|
danielebarchiesi@4
|
93 '#collapsible' => TRUE,
|
danielebarchiesi@4
|
94 '#collapsed' => FALSE,
|
danielebarchiesi@4
|
95 '#theme' => 'search_autocomplete_form_configuration_fieldset'
|
danielebarchiesi@4
|
96 );
|
danielebarchiesi@4
|
97 $form['search_autocomplete_what']['suggestions'] = array(
|
danielebarchiesi@4
|
98 '#type' => 'item',
|
danielebarchiesi@4
|
99 '#title' => t('Suggestion source'),
|
danielebarchiesi@4
|
100 '#description' => t('Choose the source of suggestions to display in this form')
|
danielebarchiesi@4
|
101 );
|
danielebarchiesi@4
|
102 // use a callback
|
danielebarchiesi@4
|
103 $form['search_autocomplete_what']['suggestions']['callback'] = array( );
|
danielebarchiesi@4
|
104 $form['search_autocomplete_what']['callback']['callback_option'] = array(
|
danielebarchiesi@4
|
105 '#type' => 'radio',
|
danielebarchiesi@4
|
106 '#title' => t('Callback URL:'),
|
danielebarchiesi@4
|
107 '#return_value' => 1,
|
danielebarchiesi@4
|
108 '#default_value' => $item->data_source<2 ? 1 : 2,
|
danielebarchiesi@4
|
109 '#prefix' => '<div class="form-radios">',
|
danielebarchiesi@4
|
110 '#parents' => array('suggestions')
|
danielebarchiesi@4
|
111 );
|
danielebarchiesi@4
|
112 $descr = t('Enter the url where to retrieve suggestions. It can be internal (absolute or relative) or external.') . '<br/>' .
|
danielebarchiesi@4
|
113 t('To make an easy internal suggestion url, create a view using "Autocompletion JSON" view style ! (<a href="http://projects.axiomcafe.fr/search-autocomplete/advanced-configuration/add-suggestion-type-version-3x">see documentation</a>)') . '<br/>' .
|
danielebarchiesi@4
|
114 t('Available views are:') . '<br/>' .
|
danielebarchiesi@4
|
115 'autocomplete-nodes : ' . t('suggest node titles'). '<br/>' .
|
danielebarchiesi@4
|
116 'autocomplete-users : ' . t('suggest user names'). '<br/>' .
|
danielebarchiesi@4
|
117 'autocomplete-words : ' . t('suggest the node titles for nodes containing the user input');
|
danielebarchiesi@4
|
118 $form['search_autocomplete_what']['callback']['callback_textfield'] = array(
|
danielebarchiesi@4
|
119 '#type' => 'textfield',
|
danielebarchiesi@4
|
120 '#description' => $descr,
|
danielebarchiesi@4
|
121 '#default_value' => $item->data_callback,
|
danielebarchiesi@4
|
122 '#size' => 80, // The default size is a bit large...
|
danielebarchiesi@4
|
123 '#suffix' => '', // End of the "form-radios" style.
|
danielebarchiesi@4
|
124 '#attributes' => array('onClick' => '$("input[name=suggestions][value=1]").attr("checked", true);')
|
danielebarchiesi@4
|
125 );
|
danielebarchiesi@4
|
126 // use a static resource
|
danielebarchiesi@4
|
127
|
danielebarchiesi@4
|
128 $form['search_autocomplete_what']['suggestions']['staticresource'] = array( );
|
danielebarchiesi@4
|
129 $form['search_autocomplete_what']['staticresource']['staticresource_option'] = array(
|
danielebarchiesi@4
|
130 '#type' => 'radio',
|
danielebarchiesi@4
|
131 '#title' => t('Static resource :'),
|
danielebarchiesi@4
|
132 '#return_value' => 2,
|
danielebarchiesi@4
|
133 '#default_value' => $item->data_source<2 ? 1 : 2,
|
danielebarchiesi@4
|
134 '#parents' => array('suggestions')
|
danielebarchiesi@4
|
135 );
|
danielebarchiesi@4
|
136 $form['search_autocomplete_what']['staticresource']['staticresource_textfield'] = array(
|
danielebarchiesi@4
|
137 '#type' => 'textarea',
|
danielebarchiesi@4
|
138 '#description' => t('Please enter one suggestion per line. You can use the syntax: "foo => http://bar" per line if you wish to add a jumping to URL for the suggestion. Please refer to <a href="http://projects.axiomcafe.fr/search-autocomplete">documentation</a>.'),
|
danielebarchiesi@4
|
139 '#default_value' => $item->data_static,
|
danielebarchiesi@4
|
140 '#size' => 20, // The default size is a bit large...
|
danielebarchiesi@4
|
141 '#suffix' => '</div>', // End of the "form-radios" style.
|
danielebarchiesi@4
|
142 '#attributes' => array('onClick' => '$("input[name=suggestions][value=2]").attr("checked", true);')
|
danielebarchiesi@4
|
143 );
|
danielebarchiesi@4
|
144
|
danielebarchiesi@4
|
145 // template to use
|
danielebarchiesi@4
|
146 $themes = array();
|
danielebarchiesi@4
|
147 $files = file_scan_directory( drupal_get_path('module', 'search_autocomplete') . '/css', '/.*\.css\z/', array('recurse' => FALSE));
|
danielebarchiesi@4
|
148 foreach ($files as $file) {
|
danielebarchiesi@4
|
149 if ($file->name != 'jquery.autocomplete') $themes[$file->filename] = $file->name;
|
danielebarchiesi@4
|
150 }
|
danielebarchiesi@4
|
151 $form['search_autocomplete_what']['theme'] = array(
|
danielebarchiesi@4
|
152 '#type' => 'select',
|
danielebarchiesi@4
|
153 '#title' => t('Select a theme for your suggestions'),
|
danielebarchiesi@4
|
154 '#options' => $themes,
|
danielebarchiesi@4
|
155 '#default_value' => $item->theme,
|
danielebarchiesi@4
|
156 '#description' => t('Choose the theme to use for autocompletion dropdown popup. Read <a href="http://projects.axiomcafe.fr/search-autocomplete">documentation</a> to learn how to make your own.'),
|
danielebarchiesi@4
|
157 );
|
danielebarchiesi@4
|
158
|
danielebarchiesi@4
|
159
|
danielebarchiesi@4
|
160 // ------------------------------------------------------------------
|
danielebarchiesi@4
|
161 // ADVANCED - Advanced options
|
danielebarchiesi@4
|
162 $form['search_autocomplete_advanced'] = array(
|
danielebarchiesi@4
|
163 '#type' => 'fieldset',
|
danielebarchiesi@4
|
164 '#title' => t('ADVANCED - Advanced options'),
|
danielebarchiesi@4
|
165 '#collapsible' => TRUE,
|
danielebarchiesi@4
|
166 '#collapsed' => TRUE
|
danielebarchiesi@4
|
167 );
|
danielebarchiesi@4
|
168 $form['search_autocomplete_advanced']['selector'] = array(
|
danielebarchiesi@4
|
169 '#type' => 'textfield',
|
danielebarchiesi@4
|
170 '#title' => t('ID selector for this form'),
|
danielebarchiesi@4
|
171 '#description' => t('Please change only if you know what you do, read <a href="http://projects.axiomcafe.fr/search-autocomplete">documentation</a> first.'),
|
danielebarchiesi@4
|
172 '#default_value' => $item->selector,
|
danielebarchiesi@4
|
173 '#maxlength' => 255,
|
danielebarchiesi@4
|
174 '#size' => 35
|
danielebarchiesi@4
|
175 );
|
danielebarchiesi@4
|
176 // Add button validation
|
danielebarchiesi@4
|
177 $form['submit'] = array(
|
danielebarchiesi@4
|
178 '#type' => 'submit',
|
danielebarchiesi@4
|
179 '#value' => t('Save configuration')
|
danielebarchiesi@4
|
180 );
|
danielebarchiesi@4
|
181 }
|
danielebarchiesi@4
|
182 return $form;
|
danielebarchiesi@4
|
183 }
|
danielebarchiesi@4
|
184 // -------------------------------------------------------------------------------------
|
danielebarchiesi@4
|
185 /**
|
danielebarchiesi@4
|
186 * Implements hook_validate().
|
danielebarchiesi@4
|
187 * Save the changes in the database
|
danielebarchiesi@4
|
188 */
|
danielebarchiesi@4
|
189 function search_autocomplete_form_configure_validate($form, &$form_state) {
|
danielebarchiesi@4
|
190
|
danielebarchiesi@4
|
191 $values = $form_state['values'];
|
danielebarchiesi@4
|
192 if ($values['suggestions'] == 1) {
|
danielebarchiesi@4
|
193 $new_url = preg_replace('/\?[^=]*=[^&]*/', '', $values['callback_textfield']);
|
danielebarchiesi@4
|
194 if (!drupal_valid_path($new_url)) {
|
danielebarchiesi@4
|
195 form_set_error('url', 'callback url is not valid: ' . $new_url);
|
danielebarchiesi@4
|
196 }
|
danielebarchiesi@4
|
197 }
|
danielebarchiesi@4
|
198 }
|
danielebarchiesi@4
|
199
|
danielebarchiesi@4
|
200 // -------------------------------------------------------------------------------------
|
danielebarchiesi@4
|
201 /**
|
danielebarchiesi@4
|
202 * Implements hook_submit().
|
danielebarchiesi@4
|
203 * Save the changes in the database
|
danielebarchiesi@4
|
204 */
|
danielebarchiesi@4
|
205 function search_autocomplete_form_configure_submit($form, &$form_state) {
|
danielebarchiesi@4
|
206 global $base_url;
|
danielebarchiesi@4
|
207
|
danielebarchiesi@4
|
208 $ok_query = TRUE; // so far so good!
|
danielebarchiesi@4
|
209 // get form submission values
|
danielebarchiesi@4
|
210 $values = $form_state['values'];
|
danielebarchiesi@4
|
211 //Update the database with the new values
|
danielebarchiesi@4
|
212 $what = '';
|
danielebarchiesi@4
|
213 $sids = '';
|
danielebarchiesi@4
|
214 $weights = '';
|
danielebarchiesi@4
|
215
|
danielebarchiesi@4
|
216 // analyse incoming callback
|
danielebarchiesi@4
|
217 $callback = $values['callback_textfield'];
|
danielebarchiesi@4
|
218 $data_type = 2; // if static resource => type = 2
|
danielebarchiesi@4
|
219 if ($callback != '') {
|
danielebarchiesi@4
|
220 if (url_is_external($callback)) { // if path is absolute:
|
danielebarchiesi@4
|
221 if (strcmp(substr($callback, 0, strlen($base_url)), $base_url) === 0) { // if path is internal:
|
danielebarchiesi@4
|
222 $callback = str_replace($base_url . "/", "", $callback); // get it relative
|
danielebarchiesi@4
|
223 $data_type = 1; // type = 1
|
danielebarchiesi@4
|
224 }
|
danielebarchiesi@4
|
225 else { // if external: type = 0
|
danielebarchiesi@4
|
226 $data_type = 0;
|
danielebarchiesi@4
|
227 }
|
danielebarchiesi@4
|
228 }
|
danielebarchiesi@4
|
229 else { // if path is not absolute:
|
danielebarchiesi@4
|
230 $data_type = 1;
|
danielebarchiesi@4
|
231 }
|
danielebarchiesi@4
|
232 }
|
danielebarchiesi@4
|
233 if ($values['suggestions'] == 2) $data_type = 2;
|
danielebarchiesi@4
|
234
|
danielebarchiesi@4
|
235 // ###
|
danielebarchiesi@4
|
236 // UPDATE THE FORM
|
danielebarchiesi@4
|
237 // -> update form
|
danielebarchiesi@4
|
238 db_update('search_autocomplete_forms')
|
danielebarchiesi@4
|
239 ->fields(array(
|
danielebarchiesi@4
|
240 'min_char' => $values['min_char'],
|
danielebarchiesi@4
|
241 'max_sug' => $values['max_sug'],
|
danielebarchiesi@4
|
242 'auto_submit' => $values['auto_submit'],
|
danielebarchiesi@4
|
243 'auto_redirect' => $values['auto_redirect'],
|
danielebarchiesi@4
|
244 'no_results' => $values['no_results'],
|
danielebarchiesi@4
|
245 'selector' => $values['selector'],
|
danielebarchiesi@4
|
246 'data_source' => $data_type,
|
danielebarchiesi@4
|
247 'data_callback' => $callback,
|
danielebarchiesi@4
|
248 'data_static' => $values['staticresource_textfield'],
|
danielebarchiesi@4
|
249 'theme' => $values['theme']
|
danielebarchiesi@4
|
250 ))
|
danielebarchiesi@4
|
251 ->condition('fid', $values['fid'])
|
danielebarchiesi@4
|
252 ->execute();
|
danielebarchiesi@4
|
253 // ###
|
danielebarchiesi@4
|
254 // UPDATE CHILD LIST BUT NOT THE ADVANCED OPTIONS
|
danielebarchiesi@4
|
255 $fids = _search_autocomplete_get_all_children($values['fid']);
|
danielebarchiesi@4
|
256 // update the settings for this form + every children form
|
danielebarchiesi@4
|
257 foreach ($fids as $fid) {
|
danielebarchiesi@4
|
258 // -> update form
|
danielebarchiesi@4
|
259 db_update('search_autocomplete_forms')
|
danielebarchiesi@4
|
260 ->fields(array(
|
danielebarchiesi@4
|
261 'min_char' => $values['min_char'],
|
danielebarchiesi@4
|
262 'max_sug' => $values['max_sug'],
|
danielebarchiesi@4
|
263 'no_results' => $values['no_results'],
|
danielebarchiesi@4
|
264 'auto_submit' => $values['auto_submit'],
|
danielebarchiesi@4
|
265 'auto_redirect' => $values['auto_redirect'],
|
danielebarchiesi@4
|
266 'theme' => $values['theme']
|
danielebarchiesi@4
|
267 ))
|
danielebarchiesi@4
|
268 ->condition('fid', $fid)
|
danielebarchiesi@4
|
269 ->execute();
|
danielebarchiesi@4
|
270 }
|
danielebarchiesi@4
|
271 // ###
|
danielebarchiesi@4
|
272 drupal_clear_css_cache();
|
danielebarchiesi@4
|
273 $form_state['redirect'] = 'admin/config/search/search_autocomplete';
|
danielebarchiesi@4
|
274 $ok_query ? drupal_set_message(t("Configuration success !")) : drupal_set_message(t("An error has occured while saving the settings. Please, double check your settings!"), 'error');
|
danielebarchiesi@4
|
275 }
|
danielebarchiesi@4
|
276
|
danielebarchiesi@4
|
277 /////////////////////////////////////////////////////////////////////////////////////////
|
danielebarchiesi@4
|
278 //// HELPER FUNCTIONS ////
|
danielebarchiesi@4
|
279
|
danielebarchiesi@4
|
280 // -------------------------------------------------------------------------------------
|
danielebarchiesi@4
|
281 /**
|
danielebarchiesi@4
|
282 * Helper function: get the array of fids every of his children of the caller but not
|
danielebarchiesi@4
|
283 * caller fid.
|
danielebarchiesi@4
|
284 */
|
danielebarchiesi@4
|
285 function _search_autocomplete_get_all_children($fid, &$items = array(), $depth = 0) {
|
danielebarchiesi@4
|
286 if ($depth)
|
danielebarchiesi@4
|
287 $items[] = $fid;
|
danielebarchiesi@4
|
288
|
danielebarchiesi@4
|
289 //$result = db_query('SELECT * FROM {search_autocomplete_forms} WHERE parent_fid=:parent_fid', array(':parent_fid' => $fid));
|
danielebarchiesi@4
|
290 $result = db_select('search_autocomplete_forms', 'f')
|
danielebarchiesi@4
|
291 ->fields('f')
|
danielebarchiesi@4
|
292 ->condition('parent_fid', $fid)
|
danielebarchiesi@4
|
293 ->execute()
|
danielebarchiesi@4
|
294 ->fetchAllAssoc('fid');
|
danielebarchiesi@4
|
295
|
danielebarchiesi@4
|
296 foreach ($result as $item) {
|
danielebarchiesi@4
|
297 ++$depth;
|
danielebarchiesi@4
|
298 _search_autocomplete_get_all_children($item->fid, $items, $depth);
|
danielebarchiesi@4
|
299 }
|
danielebarchiesi@4
|
300 return $items;
|
danielebarchiesi@4
|
301 } |