annotate sites/all/modules/search_autocomplete/search_autocomplete.form.configure.inc @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents
children
rev   line source
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 }