danielebarchiesi@4:
danielebarchiesi@4: *
danielebarchiesi@4: * Sponsored by:
danielebarchiesi@4: * www.axiomcafe.fr
danielebarchiesi@4: */
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * MENU CALLBACK:
danielebarchiesi@4: * Define the form to configure the suggestions.
danielebarchiesi@4: * @return A rendered form
danielebarchiesi@4: */
danielebarchiesi@4: function search_autocomplete_form_configure($form, &$form_state) {
danielebarchiesi@4: $base = "admin/config/search/search_autocomplete"; // base URL for this module configurations
danielebarchiesi@4:
danielebarchiesi@4: // get data from database
danielebarchiesi@4: $fid = arg(4);
danielebarchiesi@4:
danielebarchiesi@4: $result = db_select('search_autocomplete_forms', 'f')
danielebarchiesi@4: ->fields('f')
danielebarchiesi@4: ->condition('fid', $fid)
danielebarchiesi@4: ->execute()
danielebarchiesi@4: ->fetchAllAssoc('fid');
danielebarchiesi@4:
danielebarchiesi@4: foreach ($result as $item) {
danielebarchiesi@4: $form['fid'] = array(
danielebarchiesi@4: '#type' => 'hidden',
danielebarchiesi@4: '#value' => $fid,
danielebarchiesi@4: );
danielebarchiesi@4: // ------------------------------------------------------------------
danielebarchiesi@4: // HOW - How to display Search Autocomplete suggestions
danielebarchiesi@4: $form['search_autocomplete_how'] = array(
danielebarchiesi@4: '#type' => 'fieldset',
danielebarchiesi@4: '#title' => t('HOW - How to display Search Autocomplete suggestions?'),
danielebarchiesi@4: '#collapsible' => TRUE,
danielebarchiesi@4: '#collapsed' => TRUE
danielebarchiesi@4: );
danielebarchiesi@4: // Minimum characters to set autocompletion on
danielebarchiesi@4: $form['search_autocomplete_how']['min_char'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#title' => t('Minimum keyword size that uncouple autocomplete search'),
danielebarchiesi@4: '#description' => t('Please enter the minimum number of character a user must input before autocompletion starts.'),
danielebarchiesi@4: '#default_value' => $item->min_char,
danielebarchiesi@4: '#maxlength' => 2,
danielebarchiesi@4: '#required' => TRUE
danielebarchiesi@4: );
danielebarchiesi@4: // Number of suggestions to display
danielebarchiesi@4: $form['search_autocomplete_how']['max_sug'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#title' => t('Limit of the autocomplete search result'),
danielebarchiesi@4: '#description' => t('Please enter the maximim number of suggestion to display.'),
danielebarchiesi@4: '#default_value' => $item->max_sug,
danielebarchiesi@4: '#maxlength' => 2,
danielebarchiesi@4: '#required' => TRUE
danielebarchiesi@4: );
danielebarchiesi@4: // check if form should be autosubmitted
danielebarchiesi@4: $form['search_autocomplete_how']['no_results'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#title' => t('Behaviour when no suggestions are found'),
danielebarchiesi@4: '#description' => t('Enter a message to display when no results are found. Leave empty for no message.'),
danielebarchiesi@4: '#default_value' => $item->no_results,
danielebarchiesi@4: '#maxlength' => 50,
danielebarchiesi@4: '#required' => FALSE
danielebarchiesi@4: );
danielebarchiesi@4: // check if form should be autosubmitted
danielebarchiesi@4: $form['search_autocomplete_how']['auto_submit'] = array(
danielebarchiesi@4: '#type' => 'checkbox',
danielebarchiesi@4: '#title' => t('Auto Submit'),
danielebarchiesi@4: '#description' => t('If enabled, the form will be submitted automatically as soon as your user choose a suggestion in the popup list.'),
danielebarchiesi@4: '#default_value' => $item->auto_submit
danielebarchiesi@4: );
danielebarchiesi@4: // check if form should be autoredirected
danielebarchiesi@4: $form['search_autocomplete_how']['auto_redirect'] = array(
danielebarchiesi@4: '#type' => 'checkbox',
danielebarchiesi@4: '#title' => t('Auto Redirect'),
danielebarchiesi@4: '#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: '#default_value' => $item->auto_redirect
danielebarchiesi@4: );
danielebarchiesi@4:
danielebarchiesi@4: // ------------------------------------------------------------------
danielebarchiesi@4: // WHAT - What to display in Search Autocomplete suggestions
danielebarchiesi@4: $form['search_autocomplete_what'] = array(
danielebarchiesi@4: '#type' => 'fieldset',
danielebarchiesi@4: '#title' => t('WHAT - What to display in Search Autocomplete suggestions?'),
danielebarchiesi@4: '#description' => t('Choose which data should be added to autocompletion suggestions.'),
danielebarchiesi@4: '#collapsible' => TRUE,
danielebarchiesi@4: '#collapsed' => FALSE,
danielebarchiesi@4: '#theme' => 'search_autocomplete_form_configuration_fieldset'
danielebarchiesi@4: );
danielebarchiesi@4: $form['search_autocomplete_what']['suggestions'] = array(
danielebarchiesi@4: '#type' => 'item',
danielebarchiesi@4: '#title' => t('Suggestion source'),
danielebarchiesi@4: '#description' => t('Choose the source of suggestions to display in this form')
danielebarchiesi@4: );
danielebarchiesi@4: // use a callback
danielebarchiesi@4: $form['search_autocomplete_what']['suggestions']['callback'] = array( );
danielebarchiesi@4: $form['search_autocomplete_what']['callback']['callback_option'] = array(
danielebarchiesi@4: '#type' => 'radio',
danielebarchiesi@4: '#title' => t('Callback URL:'),
danielebarchiesi@4: '#return_value' => 1,
danielebarchiesi@4: '#default_value' => $item->data_source<2 ? 1 : 2,
danielebarchiesi@4: '#prefix' => '
', // End of the "form-radios" style.
danielebarchiesi@4: '#attributes' => array('onClick' => '$("input[name=suggestions][value=2]").attr("checked", true);')
danielebarchiesi@4: );
danielebarchiesi@4:
danielebarchiesi@4: // template to use
danielebarchiesi@4: $themes = array();
danielebarchiesi@4: $files = file_scan_directory( drupal_get_path('module', 'search_autocomplete') . '/css', '/.*\.css\z/', array('recurse' => FALSE));
danielebarchiesi@4: foreach ($files as $file) {
danielebarchiesi@4: if ($file->name != 'jquery.autocomplete') $themes[$file->filename] = $file->name;
danielebarchiesi@4: }
danielebarchiesi@4: $form['search_autocomplete_what']['theme'] = array(
danielebarchiesi@4: '#type' => 'select',
danielebarchiesi@4: '#title' => t('Select a theme for your suggestions'),
danielebarchiesi@4: '#options' => $themes,
danielebarchiesi@4: '#default_value' => $item->theme,
danielebarchiesi@4: '#description' => t('Choose the theme to use for autocompletion dropdown popup. Read documentation to learn how to make your own.'),
danielebarchiesi@4: );
danielebarchiesi@4:
danielebarchiesi@4:
danielebarchiesi@4: // ------------------------------------------------------------------
danielebarchiesi@4: // ADVANCED - Advanced options
danielebarchiesi@4: $form['search_autocomplete_advanced'] = array(
danielebarchiesi@4: '#type' => 'fieldset',
danielebarchiesi@4: '#title' => t('ADVANCED - Advanced options'),
danielebarchiesi@4: '#collapsible' => TRUE,
danielebarchiesi@4: '#collapsed' => TRUE
danielebarchiesi@4: );
danielebarchiesi@4: $form['search_autocomplete_advanced']['selector'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#title' => t('ID selector for this form'),
danielebarchiesi@4: '#description' => t('Please change only if you know what you do, read documentation first.'),
danielebarchiesi@4: '#default_value' => $item->selector,
danielebarchiesi@4: '#maxlength' => 255,
danielebarchiesi@4: '#size' => 35
danielebarchiesi@4: );
danielebarchiesi@4: // Add button validation
danielebarchiesi@4: $form['submit'] = array(
danielebarchiesi@4: '#type' => 'submit',
danielebarchiesi@4: '#value' => t('Save configuration')
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4: return $form;
danielebarchiesi@4: }
danielebarchiesi@4: // -------------------------------------------------------------------------------------
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_validate().
danielebarchiesi@4: * Save the changes in the database
danielebarchiesi@4: */
danielebarchiesi@4: function search_autocomplete_form_configure_validate($form, &$form_state) {
danielebarchiesi@4:
danielebarchiesi@4: $values = $form_state['values'];
danielebarchiesi@4: if ($values['suggestions'] == 1) {
danielebarchiesi@4: $new_url = preg_replace('/\?[^=]*=[^&]*/', '', $values['callback_textfield']);
danielebarchiesi@4: if (!drupal_valid_path($new_url)) {
danielebarchiesi@4: form_set_error('url', 'callback url is not valid: ' . $new_url);
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: // -------------------------------------------------------------------------------------
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_submit().
danielebarchiesi@4: * Save the changes in the database
danielebarchiesi@4: */
danielebarchiesi@4: function search_autocomplete_form_configure_submit($form, &$form_state) {
danielebarchiesi@4: global $base_url;
danielebarchiesi@4:
danielebarchiesi@4: $ok_query = TRUE; // so far so good!
danielebarchiesi@4: // get form submission values
danielebarchiesi@4: $values = $form_state['values'];
danielebarchiesi@4: //Update the database with the new values
danielebarchiesi@4: $what = '';
danielebarchiesi@4: $sids = '';
danielebarchiesi@4: $weights = '';
danielebarchiesi@4:
danielebarchiesi@4: // analyse incoming callback
danielebarchiesi@4: $callback = $values['callback_textfield'];
danielebarchiesi@4: $data_type = 2; // if static resource => type = 2
danielebarchiesi@4: if ($callback != '') {
danielebarchiesi@4: if (url_is_external($callback)) { // if path is absolute:
danielebarchiesi@4: if (strcmp(substr($callback, 0, strlen($base_url)), $base_url) === 0) { // if path is internal:
danielebarchiesi@4: $callback = str_replace($base_url . "/", "", $callback); // get it relative
danielebarchiesi@4: $data_type = 1; // type = 1
danielebarchiesi@4: }
danielebarchiesi@4: else { // if external: type = 0
danielebarchiesi@4: $data_type = 0;
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4: else { // if path is not absolute:
danielebarchiesi@4: $data_type = 1;
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4: if ($values['suggestions'] == 2) $data_type = 2;
danielebarchiesi@4:
danielebarchiesi@4: // ###
danielebarchiesi@4: // UPDATE THE FORM
danielebarchiesi@4: // -> update form
danielebarchiesi@4: db_update('search_autocomplete_forms')
danielebarchiesi@4: ->fields(array(
danielebarchiesi@4: 'min_char' => $values['min_char'],
danielebarchiesi@4: 'max_sug' => $values['max_sug'],
danielebarchiesi@4: 'auto_submit' => $values['auto_submit'],
danielebarchiesi@4: 'auto_redirect' => $values['auto_redirect'],
danielebarchiesi@4: 'no_results' => $values['no_results'],
danielebarchiesi@4: 'selector' => $values['selector'],
danielebarchiesi@4: 'data_source' => $data_type,
danielebarchiesi@4: 'data_callback' => $callback,
danielebarchiesi@4: 'data_static' => $values['staticresource_textfield'],
danielebarchiesi@4: 'theme' => $values['theme']
danielebarchiesi@4: ))
danielebarchiesi@4: ->condition('fid', $values['fid'])
danielebarchiesi@4: ->execute();
danielebarchiesi@4: // ###
danielebarchiesi@4: // UPDATE CHILD LIST BUT NOT THE ADVANCED OPTIONS
danielebarchiesi@4: $fids = _search_autocomplete_get_all_children($values['fid']);
danielebarchiesi@4: // update the settings for this form + every children form
danielebarchiesi@4: foreach ($fids as $fid) {
danielebarchiesi@4: // -> update form
danielebarchiesi@4: db_update('search_autocomplete_forms')
danielebarchiesi@4: ->fields(array(
danielebarchiesi@4: 'min_char' => $values['min_char'],
danielebarchiesi@4: 'max_sug' => $values['max_sug'],
danielebarchiesi@4: 'no_results' => $values['no_results'],
danielebarchiesi@4: 'auto_submit' => $values['auto_submit'],
danielebarchiesi@4: 'auto_redirect' => $values['auto_redirect'],
danielebarchiesi@4: 'theme' => $values['theme']
danielebarchiesi@4: ))
danielebarchiesi@4: ->condition('fid', $fid)
danielebarchiesi@4: ->execute();
danielebarchiesi@4: }
danielebarchiesi@4: // ###
danielebarchiesi@4: drupal_clear_css_cache();
danielebarchiesi@4: $form_state['redirect'] = 'admin/config/search/search_autocomplete';
danielebarchiesi@4: $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: }
danielebarchiesi@4:
danielebarchiesi@4: /////////////////////////////////////////////////////////////////////////////////////////
danielebarchiesi@4: //// HELPER FUNCTIONS ////
danielebarchiesi@4:
danielebarchiesi@4: // -------------------------------------------------------------------------------------
danielebarchiesi@4: /**
danielebarchiesi@4: * Helper function: get the array of fids every of his children of the caller but not
danielebarchiesi@4: * caller fid.
danielebarchiesi@4: */
danielebarchiesi@4: function _search_autocomplete_get_all_children($fid, &$items = array(), $depth = 0) {
danielebarchiesi@4: if ($depth)
danielebarchiesi@4: $items[] = $fid;
danielebarchiesi@4:
danielebarchiesi@4: //$result = db_query('SELECT * FROM {search_autocomplete_forms} WHERE parent_fid=:parent_fid', array(':parent_fid' => $fid));
danielebarchiesi@4: $result = db_select('search_autocomplete_forms', 'f')
danielebarchiesi@4: ->fields('f')
danielebarchiesi@4: ->condition('parent_fid', $fid)
danielebarchiesi@4: ->execute()
danielebarchiesi@4: ->fetchAllAssoc('fid');
danielebarchiesi@4:
danielebarchiesi@4: foreach ($result as $item) {
danielebarchiesi@4: ++$depth;
danielebarchiesi@4: _search_autocomplete_get_all_children($item->fid, $items, $depth);
danielebarchiesi@4: }
danielebarchiesi@4: return $items;
danielebarchiesi@4: }