You are here

search_autocomplete.form.configure.inc in Search Autocomplete 7.2

Search Autocomplete Helper functions to retrive suggestions from database

@authors Miroslav Talenberg (Dominique CLAUSE) <http://www.axiomcafe.fr/contact>

Sponsored by: www.axiomcafe.fr

File

search_autocomplete.form.configure.inc
View source
<?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,
    );

    // Number of characters before suggestions
    $trigger = array();
    for ($i = 1; $i < 20; $i++) {
      $trigger[$i] = $i . ' ' . t('characters');
    }
    $form['search_autocomplete_how']['min_char'] = array(
      '#type' => 'select',
      '#title' => t('Minimum keyword size that uncouple autocomplete search'),
      '#default_value' => $item->min_char,
      '#options' => $trigger,
      '#multiple' => FALSE,
      '#required' => TRUE,
    );

    // Number of suggestions to display
    $limit = array();
    for ($i = 1; $i < 50; $i++) {
      $limit[$i] = $i . ' ' . t('results');
    }
    $form['search_autocomplete_how']['max_sug'] = array(
      '#type' => 'select',
      '#title' => t('Limit of the autocomplete search result'),
      '#default_value' => $item->max_sug,
      '#options' => $limit,
      '#multiple' => FALSE,
      '#required' => TRUE,
    );

    // ------------------------------------------------------------------
    // 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' => TRUE,
      '#theme' => 'search_autocomplete_form_configuration_fieldset',
    );
    $form['search_autocomplete_what']['#tree'] = TRUE;

    // Built possible suggestions
    $result = db_select('search_autocomplete_suggestions', 's')
      ->fields('s')
      ->condition('sug_fid', $fid)
      ->orderBy('sug_weight')
      ->execute()
      ->fetchAllAssoc('sid');
    foreach ($result as $suggestion) {

      // if the module has no dependencies, or if the dependencies are enabled: activate the suggestion
      if (drupal_strlen($suggestion->sug_dependencies) == 0 || module_exists($suggestion->sug_dependencies)) {
        $activate = TRUE;
        $title = $suggestion->sug_title;
      }
      else {
        $activate = FALSE;
        $title = $suggestion->sug_title . '  ' . t('(require @module module)', array(
          '@module' => $suggestion->sug_dependencies,
        ));
      }
      $sid = $suggestion->sid;
      $form['search_autocomplete_what'][$sid]['sid'] = array(
        '#type' => 'hidden',
        '#value' => $sid,
        '#disabled' => !$activate,
      );
      $form['search_autocomplete_what'][$sid]['sug_title'] = array(
        '#type' => 'item',
        '#title' => $title,
        '#disabled' => !$activate,
      );
      $form['search_autocomplete_what'][$sid]['sug_enabled'] = array(
        '#type' => 'checkbox',
        '#return_value' => 1,
        '#default_value' => $suggestion->sug_enabled,
        '#disabled' => !$activate,
      );
      $form['search_autocomplete_what'][$sid]['sug_prefix'] = array(
        // -> sug_prefix
        '#type' => 'textfield',
        '#default_value' => $suggestion->sug_prefix,
        '#maxlength' => 255,
        '#size' => 35,
        '#disabled' => !$activate,
      );
      $form['search_autocomplete_what'][$sid]['sug_weight'] = array(
        // -> weight of the item in hierarchy
        '#type' => 'weight',
        '#default_value' => $suggestion->sug_weight,
        '#disabled' => !$activate,
      );
      $form['search_autocomplete_what'][$sid]['sug_edit'] = array(
        // -> weight of the item in hierarchy
        '#type' => 'item',
        '#title' => l(t('edit'), "{$base}/suggestion/" . $suggestion->sid . "/edit"),
      );
    }

    // ------------------------------------------------------------------
    // 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;
}

// -------------------------------------------------------------------------------------

/**
 * Implementation of hook_submit().
 * Save the changes in the database
 */
function search_autocomplete_form_configure_submit($form, &$form_state) {
  $ok_query = TRUE;

  // so far so good!

  //Update the database with the new values
  $what = '';
  $sids = '';
  $weights = '';

  // ###
  // UPDATE THE FORM
  // -> update form
  $values = $form_state['values'];
  db_update('search_autocomplete_forms')
    ->fields(array(
    'min_char' => $values['min_char'],
    'max_sug' => $values['max_sug'],
    'selector' => $values['selector'],
  ))
    ->condition('fid', $values['fid'])
    ->execute();

  // -> update each suggestions
  foreach ($form_state['input']['search_autocomplete_what'] as $key => $item) {
    $values['search_autocomplete_what'][$key]['sug_fid'] = $values['fid'];
    drupal_write_record('search_autocomplete_suggestions', $values['search_autocomplete_what'][$key], array(
      'sid',
      'sug_fid',
    ));
  }

  // ###
  // 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'],
    ))
      ->condition('fid', $fid)
      ->execute();

    // -> update each suggestions
    foreach ($form_state['input']['search_autocomplete_what'] as $key => $item) {
      $values['search_autocomplete_what'][$key]['sug_fid'] = $fid;
      drupal_write_record('search_autocomplete_suggestions', $values['search_autocomplete_what'][$key], array(
        'sid',
        'sug_fid',
      ));
    }
  }

  // ###
  $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');
}

// -------------------------------------------------------------------------------------

/**
 * CALLBACK:
 * Theme function for this treelist form
 */
function theme_search_autocomplete_form_configuration_fieldset($variables) {
  $form = $variables['form'];
  $header = array(
    'Title',
    'Enabled',
    'Prefix of the item in suggestions',
    'Weight',
    'Operation',
  );
  $rows = array();

  // for each elements to anchor in the form
  foreach (element_children($form) as $key) {
    $element =& $form[$key];
    $element['sug_weight']['#attributes']['class'] = array(
      'weight-group',
    );
    $rows[] = array(
      'data' => array(
        drupal_render($element['sug_title']),
        drupal_render($element['sug_enabled']),
        drupal_render($element['sug_prefix']),
        drupal_render($element['sug_weight']),
        drupal_render($element['sug_edit']),
      ),
      'class' => array(
        'draggable',
      ),
    );
  }

  // Themize the table and render the form
  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'draggable-table',
    ),
  ));
  $output .= drupal_render($form['submit']);
  $output .= drupal_render_children($form);
  drupal_add_tabledrag('draggable-table', 'order', 'sibling', 'weight-group');
  return $output;
}

// function theme_search_autocomplete_form_configuration()

/////////////////////////////////////////////////////////////////////////////////////////

////                             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;
}

Functions

Namesort descending Description
search_autocomplete_form_configure MENU CALLBACK: Define the form to configure the suggestions.
search_autocomplete_form_configure_submit Implementation of hook_submit(). Save the changes in the database
theme_search_autocomplete_form_configuration_fieldset CALLBACK: Theme function for this treelist form
_search_autocomplete_get_all_children Helper function: get the array of fids every of his children of the caller but not caller fid.