Mercurial > hg > rr-repo
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/search_autocomplete/search_autocomplete.form.configure.inc Thu Sep 19 10:38:44 2013 +0100 @@ -0,0 +1,301 @@ +<?php + +/** + * @file + * Search Autocomplete + * Helper functions to retrive suggestions from database + * + * @authors + * Miroslav Talenberg (Dominique CLAUSE) <http://www.axiomcafe.fr/contact> + * + * Sponsored by: + * www.axiomcafe.fr + */ + +/** + * MENU CALLBACK: + * Define the form to configure the suggestions. + * @return A rendered form + */ +function search_autocomplete_form_configure($form, &$form_state) { + $base = "admin/config/search/search_autocomplete"; // base URL for this module configurations + + // get data from database + $fid = arg(4); + + $result = db_select('search_autocomplete_forms', 'f') + ->fields('f') + ->condition('fid', $fid) + ->execute() + ->fetchAllAssoc('fid'); + + foreach ($result as $item) { + $form['fid'] = array( + '#type' => 'hidden', + '#value' => $fid, + ); + // ------------------------------------------------------------------ + // HOW - How to display Search Autocomplete suggestions + $form['search_autocomplete_how'] = array( + '#type' => 'fieldset', + '#title' => t('HOW - How to display Search Autocomplete suggestions?'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + // Minimum characters to set autocompletion on + $form['search_autocomplete_how']['min_char'] = array( + '#type' => 'textfield', + '#title' => t('Minimum keyword size that uncouple autocomplete search'), + '#description' => t('Please enter the minimum number of character a user must input before autocompletion starts.'), + '#default_value' => $item->min_char, + '#maxlength' => 2, + '#required' => TRUE + ); + // Number of suggestions to display + $form['search_autocomplete_how']['max_sug'] = array( + '#type' => 'textfield', + '#title' => t('Limit of the autocomplete search result'), + '#description' => t('Please enter the maximim number of suggestion to display.'), + '#default_value' => $item->max_sug, + '#maxlength' => 2, + '#required' => TRUE + ); + // check if form should be autosubmitted + $form['search_autocomplete_how']['no_results'] = array( + '#type' => 'textfield', + '#title' => t('Behaviour when no suggestions are found'), + '#description' => t('Enter a message to display when no results are found. Leave empty for no message.'), + '#default_value' => $item->no_results, + '#maxlength' => 50, + '#required' => FALSE + ); + // check if form should be autosubmitted + $form['search_autocomplete_how']['auto_submit'] = array( + '#type' => 'checkbox', + '#title' => t('Auto Submit'), + '#description' => t('If enabled, the form will be submitted automatically as soon as your user choose a suggestion in the popup list.'), + '#default_value' => $item->auto_submit + ); + // check if form should be autoredirected + $form['search_autocomplete_how']['auto_redirect'] = array( + '#type' => 'checkbox', + '#title' => t('Auto Redirect'), + '#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.'), + '#default_value' => $item->auto_redirect + ); + + // ------------------------------------------------------------------ + // WHAT - What to display in Search Autocomplete suggestions + $form['search_autocomplete_what'] = array( + '#type' => 'fieldset', + '#title' => t('WHAT - What to display in Search Autocomplete suggestions?'), + '#description' => t('Choose which data should be added to autocompletion suggestions.'), + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#theme' => 'search_autocomplete_form_configuration_fieldset' + ); + $form['search_autocomplete_what']['suggestions'] = array( + '#type' => 'item', + '#title' => t('Suggestion source'), + '#description' => t('Choose the source of suggestions to display in this form') + ); + // use a callback + $form['search_autocomplete_what']['suggestions']['callback'] = array( ); + $form['search_autocomplete_what']['callback']['callback_option'] = array( + '#type' => 'radio', + '#title' => t('Callback URL:'), + '#return_value' => 1, + '#default_value' => $item->data_source<2 ? 1 : 2, + '#prefix' => '<div class="form-radios">', + '#parents' => array('suggestions') + ); + $descr = t('Enter the url where to retrieve suggestions. It can be internal (absolute or relative) or external.') . '<br/>' . + 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/>' . + t('Available views are:') . '<br/>' . + 'autocomplete-nodes : ' . t('suggest node titles'). '<br/>' . + 'autocomplete-users : ' . t('suggest user names'). '<br/>' . + 'autocomplete-words : ' . t('suggest the node titles for nodes containing the user input'); + $form['search_autocomplete_what']['callback']['callback_textfield'] = array( + '#type' => 'textfield', + '#description' => $descr, + '#default_value' => $item->data_callback, + '#size' => 80, // The default size is a bit large... + '#suffix' => '', // End of the "form-radios" style. + '#attributes' => array('onClick' => '$("input[name=suggestions][value=1]").attr("checked", true);') + ); + // use a static resource + + $form['search_autocomplete_what']['suggestions']['staticresource'] = array( ); + $form['search_autocomplete_what']['staticresource']['staticresource_option'] = array( + '#type' => 'radio', + '#title' => t('Static resource :'), + '#return_value' => 2, + '#default_value' => $item->data_source<2 ? 1 : 2, + '#parents' => array('suggestions') + ); + $form['search_autocomplete_what']['staticresource']['staticresource_textfield'] = array( + '#type' => 'textarea', + '#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>.'), + '#default_value' => $item->data_static, + '#size' => 20, // The default size is a bit large... + '#suffix' => '</div>', // End of the "form-radios" style. + '#attributes' => array('onClick' => '$("input[name=suggestions][value=2]").attr("checked", true);') + ); + + // template to use + $themes = array(); + $files = file_scan_directory( drupal_get_path('module', 'search_autocomplete') . '/css', '/.*\.css\z/', array('recurse' => FALSE)); + foreach ($files as $file) { + if ($file->name != 'jquery.autocomplete') $themes[$file->filename] = $file->name; + } + $form['search_autocomplete_what']['theme'] = array( + '#type' => 'select', + '#title' => t('Select a theme for your suggestions'), + '#options' => $themes, + '#default_value' => $item->theme, + '#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.'), + ); + + + // ------------------------------------------------------------------ + // ADVANCED - Advanced options + $form['search_autocomplete_advanced'] = array( + '#type' => 'fieldset', + '#title' => t('ADVANCED - Advanced options'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['search_autocomplete_advanced']['selector'] = array( + '#type' => 'textfield', + '#title' => t('ID selector for this form'), + '#description' => t('Please change only if you know what you do, read <a href="http://projects.axiomcafe.fr/search-autocomplete">documentation</a> first.'), + '#default_value' => $item->selector, + '#maxlength' => 255, + '#size' => 35 + ); + // Add button validation + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save configuration') + ); + } + return $form; +} +// ------------------------------------------------------------------------------------- +/** + * Implements hook_validate(). + * Save the changes in the database + */ +function search_autocomplete_form_configure_validate($form, &$form_state) { + + $values = $form_state['values']; + if ($values['suggestions'] == 1) { + $new_url = preg_replace('/\?[^=]*=[^&]*/', '', $values['callback_textfield']); + if (!drupal_valid_path($new_url)) { + form_set_error('url', 'callback url is not valid: ' . $new_url); + } + } +} + +// ------------------------------------------------------------------------------------- +/** + * Implements hook_submit(). + * Save the changes in the database + */ +function search_autocomplete_form_configure_submit($form, &$form_state) { + global $base_url; + + $ok_query = TRUE; // so far so good! + // get form submission values + $values = $form_state['values']; + //Update the database with the new values + $what = ''; + $sids = ''; + $weights = ''; + + // analyse incoming callback + $callback = $values['callback_textfield']; + $data_type = 2; // if static resource => type = 2 + if ($callback != '') { + if (url_is_external($callback)) { // if path is absolute: + if (strcmp(substr($callback, 0, strlen($base_url)), $base_url) === 0) { // if path is internal: + $callback = str_replace($base_url . "/", "", $callback); // get it relative + $data_type = 1; // type = 1 + } + else { // if external: type = 0 + $data_type = 0; + } + } + else { // if path is not absolute: + $data_type = 1; + } + } + if ($values['suggestions'] == 2) $data_type = 2; + + // ### + // UPDATE THE FORM + // -> update form + db_update('search_autocomplete_forms') + ->fields(array( + 'min_char' => $values['min_char'], + 'max_sug' => $values['max_sug'], + 'auto_submit' => $values['auto_submit'], + 'auto_redirect' => $values['auto_redirect'], + 'no_results' => $values['no_results'], + 'selector' => $values['selector'], + 'data_source' => $data_type, + 'data_callback' => $callback, + 'data_static' => $values['staticresource_textfield'], + 'theme' => $values['theme'] + )) + ->condition('fid', $values['fid']) + ->execute(); + // ### + // UPDATE CHILD LIST BUT NOT THE ADVANCED OPTIONS + $fids = _search_autocomplete_get_all_children($values['fid']); + // update the settings for this form + every children form + foreach ($fids as $fid) { + // -> update form + db_update('search_autocomplete_forms') + ->fields(array( + 'min_char' => $values['min_char'], + 'max_sug' => $values['max_sug'], + 'no_results' => $values['no_results'], + 'auto_submit' => $values['auto_submit'], + 'auto_redirect' => $values['auto_redirect'], + 'theme' => $values['theme'] + )) + ->condition('fid', $fid) + ->execute(); + } + // ### + drupal_clear_css_cache(); + $form_state['redirect'] = 'admin/config/search/search_autocomplete'; + $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'); +} + +///////////////////////////////////////////////////////////////////////////////////////// +//// HELPER FUNCTIONS //// + +// ------------------------------------------------------------------------------------- +/** + * Helper function: get the array of fids every of his children of the caller but not + * caller fid. + */ +function _search_autocomplete_get_all_children($fid, &$items = array(), $depth = 0) { + if ($depth) + $items[] = $fid; + + //$result = db_query('SELECT * FROM {search_autocomplete_forms} WHERE parent_fid=:parent_fid', array(':parent_fid' => $fid)); + $result = db_select('search_autocomplete_forms', 'f') + ->fields('f') + ->condition('parent_fid', $fid) + ->execute() + ->fetchAllAssoc('fid'); + + foreach ($result as $item) { + ++$depth; + _search_autocomplete_get_all_children($item->fid, $items, $depth); + } + return $items; +} \ No newline at end of file