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' => '
', danielebarchiesi@4: '#parents' => array('suggestions') danielebarchiesi@4: ); danielebarchiesi@4: $descr = t('Enter the url where to retrieve suggestions. It can be internal (absolute or relative) or external.') . '
' . danielebarchiesi@4: t('To make an easy internal suggestion url, create a view using "Autocompletion JSON" view style ! (see documentation)') . '
' . danielebarchiesi@4: t('Available views are:') . '
' . danielebarchiesi@4: 'autocomplete-nodes : ' . t('suggest node titles'). '
' . danielebarchiesi@4: 'autocomplete-users : ' . t('suggest user names'). '
' . danielebarchiesi@4: 'autocomplete-words : ' . t('suggest the node titles for nodes containing the user input'); danielebarchiesi@4: $form['search_autocomplete_what']['callback']['callback_textfield'] = array( danielebarchiesi@4: '#type' => 'textfield', danielebarchiesi@4: '#description' => $descr, danielebarchiesi@4: '#default_value' => $item->data_callback, danielebarchiesi@4: '#size' => 80, // The default size is a bit large... danielebarchiesi@4: '#suffix' => '', // End of the "form-radios" style. danielebarchiesi@4: '#attributes' => array('onClick' => '$("input[name=suggestions][value=1]").attr("checked", true);') danielebarchiesi@4: ); danielebarchiesi@4: // use a static resource danielebarchiesi@4: danielebarchiesi@4: $form['search_autocomplete_what']['suggestions']['staticresource'] = array( ); danielebarchiesi@4: $form['search_autocomplete_what']['staticresource']['staticresource_option'] = array( danielebarchiesi@4: '#type' => 'radio', danielebarchiesi@4: '#title' => t('Static resource :'), danielebarchiesi@4: '#return_value' => 2, danielebarchiesi@4: '#default_value' => $item->data_source<2 ? 1 : 2, danielebarchiesi@4: '#parents' => array('suggestions') danielebarchiesi@4: ); danielebarchiesi@4: $form['search_autocomplete_what']['staticresource']['staticresource_textfield'] = array( danielebarchiesi@4: '#type' => 'textarea', danielebarchiesi@4: '#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 documentation.'), danielebarchiesi@4: '#default_value' => $item->data_static, danielebarchiesi@4: '#size' => 20, // The default size is a bit large... danielebarchiesi@4: '#suffix' => '
', // 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: }