You are here

search_api_saved_searches.pages.inc in Search API Saved Searches 7

User UI functions and form callbacks for saved searches.

File

search_api_saved_searches.pages.inc
View source
<?php

/**
 * @file
 * User UI functions and form callbacks for saved searches.
 */

/**
 * Page callback for listing all saved searches of a user.
 *
 * @param $account
 *   The user of which to list saved searches.
 */
function search_api_saved_searches_user_listing($account) {
  $base_path = 'search-api/saved-search/';
  $header = array(
    t('Name'),
    t('Created'),
    t('Last executed'),
    t('Interval'),
    t('Operations'),
  );
  $searches = search_api_saved_search_load_multiple(FALSE, array(
    'uid' => $account->uid,
  ));
  $rows = array();
  foreach ($searches as $search) {
    $settings = $search
      ->settings();
    if (empty($search->options['page'])) {
      $name = check_plain($search->name);
    }
    else {
      $name = $search
        ->l($search->name);
    }
    $created = format_date($search->created, 'short');
    $last_execute = t('@time ago', array(
      '@time' => format_interval(REQUEST_TIME - $search->last_execute),
    ));

    // Get the translated label for the interval.
    $available_intervals = $settings
      ->getTranslatedOption('interval_options');
    if (isset($available_intervals[$search->notify_interval])) {
      $interval = $available_intervals[$search->notify_interval];
    }
    elseif ($search->notify_interval < 0) {
      $interval = t('Never');
    }
    else {
      $interval = format_interval($search->notify_interval, 1);
    }
    $enable_options['attributes']['class'][] = 'saved-search-enable';
    $edit_options['attributes']['class'][] = 'saved-search-edit';
    $delete_options['attributes']['class'][] = 'saved-search-delete';
    if ($search->enabled) {
      $enable_action = '/disable';
      $enable_label = t('disable');
    }
    else {
      $enable_action = '/enable';
      $enable_label = t('enable');
      $enable_options['query']['token'] = drupal_get_token($search->id);
    }
    $path = $base_path . $search->id;
    $enable_link = l($enable_label, $path . $enable_action, $enable_options);
    $edit_link = l(t('edit'), $path . '/edit', $edit_options);
    $delete_link = l(t('delete'), $path . '/delete', $delete_options);
    $rows[] = array(
      $name,
      $created,
      $last_execute,
      $interval,
      $enable_link . ' | ' . $edit_link . ' | ' . $delete_link,
    );
  }
  $render = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
    '#empty' => t('No searches were saved yet.'),
    '#sticky' => TRUE,
  );
  return $render;
}

/**
 * Page callback for manually creating a new saved search.
 *
 * @param SearchApiSavedSearchesSettings $settings
 *   (optional) The settings to use. If not present, either the only available
 *   settings will be used, or a form for selecting one will be displayed.
 */
function search_api_saved_searches_create_manual(SearchApiSavedSearchesSettings $settings = NULL) {
  if (!isset($settings)) {
    foreach (search_api_saved_searches_settings_load_multiple(FALSE, array(
      'enabled' => TRUE,
    )) as $settings) {
      if (!empty($settings->options['manual']['allow'])) {
        $available_settings[$settings->delta] = $settings;
      }
    }
    if (empty($available_settings)) {
      return t('There are no searches for which saved searches can be created manually.');
    }
    if (count($available_settings) == 1) {
      $settings = reset($available_settings);
    }
    else {
      $render = array();
      $render['question']['#markup'] = t('For which search do you want to create a saved search?');
      $render['list']['#theme'] = 'list';
      $render['list']['#items'] = array();
      $base = 'search-api/saved-searches/add/';
      foreach ($available_settings as $id => $settings) {
        $name = $settings
          ->index()->name;
        if (!empty($settings->options['manual']['page']['path'])) {
          $item = menu_get_item($settings->options['manual']['page']['path']);
          if (!empty($item['title'])) {
            $name = $item['title'];
          }
        }
        $render['list']['#items'][]['#markup'] = l($name, $base . $id);
      }
      return $render;
    }
  }
  return drupal_get_form('search_api_saved_searches_save_form', $settings);
}

/**
 * Page callback that activates a saved search.
 *
 * This is mostly necessary for anonymous users, but also when a user enters a
 * different mail address than the one he registered with.
 *
 * @param SearchApiSavedSearch $search
 *   The search to activate.
 * @param string $key
 *   The secret access key for this search, used to authenticate the user.
 */
function search_api_saved_searches_activate_page(SearchApiSavedSearch $search, $key) {
  $ret = array(
    'message' => array(
      '#markup' => '',
    ),
    'link' => array(
      '#markup' => '<p>' . $search
        ->l(t('View this saved search')) . '</p>',
    ),
  );
  if ($search->enabled) {
    $msg = t('This saved search has already been activated.');
  }
  else {
    $search->enabled = TRUE;
    $success = $search
      ->save();
    if (!$success) {
      drupal_set_message(t('An error occurred while trying to activate the search. Please contact the site administrator.'), 'error');
      return $ret;
    }
    $msg = t('Your saved search was successfully activated.');
  }
  if ($search->notify_interval >= 0) {
    $msg .= ' ' . t('You will receive e-mail notifications for new results in the future.');
  }
  $ret['message']['#markup'] = '<p>' . $msg . '</p>';
  return $ret;
}

/**
 * Form builder for editing a saved search.
 *
 * @param SearchApiSavedSearch $search
 *   The search to edit.
 *
 * @see search_api_saved_searches_search_edit_form_submit()
 * @ingroup forms
 */
function search_api_saved_searches_search_edit_form(array $form, array &$form_state, SearchApiSavedSearch $search) {
  $form_state['search'] = $search;
  $settings = $search
    ->settings();
  if ($search->uid) {
    $form_state['destination']['path'] = 'user/' . $search->uid . '/saved-searches';
  }
  elseif (!empty($search->options['page'])) {
    $form_state['destination'] = array(
      $search->options['page']['path'],
      $search->options['page'],
    );
  }
  $form['enabled'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enabled'),
    '#description' => t('Disable to stop receiving notifications from this saved search.'),
    '#default_value' => $search->enabled,
  );
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#description' => t('The name that will be displayed for this saved search.'),
    '#maxlength' => 255,
    '#required' => TRUE,
    '#default_value' => $search->name,
  );
  if (!empty($settings->options['allow_keys_change'])) {
    $keywords = $search->query['keys'];
    if (is_array($keywords)) {
      $keywords = search_api_saved_searches_unparse_keys($keywords);
    }
    $form['keys'] = array(
      '#type' => 'textfield',
      '#title' => t('Keywords'),
      '#description' => t('The keywords to use for this search.'),
      '#default_value' => $keywords,
    );
  }
  if ($settings->options['user_select_interval'] && count($settings->options['interval_options']) > 1) {
    $form['notify_interval'] = array(
      '#type' => 'select',
      '#title' => t('Notification interval'),
      '#options' => $settings
        ->getTranslatedOption('interval_options'),
      '#required' => TRUE,
      '#default_value' => $search->notify_interval,
    );
  }
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save changes'),
  );
  if (!empty($form_state['destination'])) {
    $form['actions']['cancel'] = array(
      '#type' => 'link',
      '#title' => t('Cancel'),
      '#href' => $form_state['destination']['path'],
      '#options' => $form_state['destination'],
    );
  }
  return $form;
}

/**
 * Reverses the search keywords parsing to get string keywords.
 *
 * @param array $keys
 *   An array with search keys, as defined by
 *   SearchApiQueryInterface::getKeys().
 *
 * @return string
 *   A guess regarding the original keys used to come up with the given keys
 *   array.
 */
function search_api_saved_searches_unparse_keys(array $keys) {
  $simple_keys = array();
  foreach (element_children($keys) as $i) {
    $key = $keys[$i];
    if (is_scalar($key)) {
      if (strpos($key, ' ')) {
        $key = '"' . $key . '"';
      }
      $simple_keys[] = $key;
    }
  }
  return implode(' ', $simple_keys);
}

/**
 * Submission handler for search_api_saved_searches_search_edit_form().
 *
 * @see search_api_saved_searches_search_edit_form()
 */
function search_api_saved_searches_search_edit_form_submit(array $form, array &$form_state) {
  $values = $form_state['values'];

  /** @var SearchApiSavedSearch $search */
  $search = $form_state['search'];
  $search->name = $values['name'];
  $search->enabled = $values['enabled'];
  if (isset($values['notify_interval'])) {
    $search->notify_interval = $values['notify_interval'];
  }
  if (!empty($form['keys']) && $values['keys'] != $form['keys']['#default_value']) {
    $search->query['keys'] = $values['keys'] === '' ? NULL : $values['keys'];

    // Unsetting the results array will automatically re-calculate the current
    // results when saving.
    $search->results = NULL;
  }
  if ($search
    ->save()) {
    drupal_set_message(t('Successfully saved your changes.'));
    if (!empty($form_state['destination'])) {
      $form_state['redirect'] = $form_state['destination'];
    }
  }
  else {
    drupal_set_message(t('An error occurred while trying to save the changes.'), 'error');
  }
}

/**
 * Page callback: Enables a saved search.
 *
 * @param SearchApiSavedSearch $search
 *   The search to enable.
 */
function search_api_saved_searches_search_enable(SearchApiSavedSearch $search = NULL) {
  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], $search->id)) {
    return MENU_ACCESS_DENIED;
  }
  $search->enabled = TRUE;
  if ($search
    ->save()) {
    drupal_set_message(t('The saved search was successfully enabled.'));
  }
  else {
    drupal_set_message(t('The saved search could not be enabled.'), 'error');
  }
  drupal_goto(_search_api_saved_searches_admin_redirect_url($search));
  return NULL;
}

/**
 * Page callback: Constructs a form for disabling a saved search.
 *
 * @param SearchApiSavedSearch $search
 *   The search to disable.
 *
 * @see search_api_saved_searches_search_disable_form_submit()
 *
 * @ingroup forms
 */
function search_api_saved_searches_search_disable_form(array $form, array &$form_state, SearchApiSavedSearch $search) {
  $form_state['search'] = $search;
  $url = _search_api_saved_searches_admin_redirect_url($search);
  return confirm_form($form, t('Do you really want to disable this saved search?'), $url, t('You will not receive any updates for this saved search until it is re-enabled.'));
}

/**
 * Form submission handler for search_api_saved_searches_search_disable_form().
 */
function search_api_saved_searches_search_disable_form_submit(array $form, array &$form_state) {
  $search = $form_state['search'];
  $search->enabled = FALSE;
  $search
    ->save();
  drupal_set_message(t('The saved search was successfully disabled.'));
  $form_state['redirect'] = _search_api_saved_searches_admin_redirect_url($search);
}

/**
 * Form builder for confirming the deletion of a saved search.
 *
 * @param SearchApiSavedSearch $search
 *   The search to delete.
 *
 * @see search_api_saved_searches_search_delete_form_submit()
 * @ingroup forms
 */
function search_api_saved_searches_search_delete_form(array $form, array &$form_state, SearchApiSavedSearch $search) {
  $form_state['search'] = $search;
  $url = _search_api_saved_searches_admin_redirect_url($search);
  return confirm_form($form, t('Do you really want to delete this saved search?'), $url);
}

/**
 * Submission handler for search_api_saved_searches_search_delete_form().
 *
 * @see search_api_saved_searches_search_delete_form()
 */
function search_api_saved_searches_search_delete_form_submit(array $form, array &$form_state) {
  $search = $form_state['search'];
  $search
    ->delete();
  drupal_set_message(t('The saved search was successfully deleted.'));
  $form_state['redirect'] = _search_api_saved_searches_admin_redirect_url($search);
}

/**
 * Returns the correct redirect URL after changing a saved search.
 *
 * This will be the user's "Saved searches" overview tab, if it is accessible;
 * otherwise, if the search has a page associated with it, that page; and if
 * none of the two are the case, the front page.
 *
 * @param SearchApiSavedSearch $search
 *   The saved search that was edited, deleted or otherwise changed.
 *
 * @return string
 *   The URL to redirect to.
 */
function _search_api_saved_searches_admin_redirect_url(SearchApiSavedSearch $search) {
  if ($search->uid && search_api_saved_search_edit_access(user_load($search->uid))) {
    return 'user/' . $search->uid . '/saved-searches';
  }
  elseif (!empty($search->options['page'])) {
    return $search->options['page'];
  }
  return '<front>';
}

Functions

Namesort descending Description
search_api_saved_searches_activate_page Page callback that activates a saved search.
search_api_saved_searches_create_manual Page callback for manually creating a new saved search.
search_api_saved_searches_search_delete_form Form builder for confirming the deletion of a saved search.
search_api_saved_searches_search_delete_form_submit Submission handler for search_api_saved_searches_search_delete_form().
search_api_saved_searches_search_disable_form Page callback: Constructs a form for disabling a saved search.
search_api_saved_searches_search_disable_form_submit Form submission handler for search_api_saved_searches_search_disable_form().
search_api_saved_searches_search_edit_form Form builder for editing a saved search.
search_api_saved_searches_search_edit_form_submit Submission handler for search_api_saved_searches_search_edit_form().
search_api_saved_searches_search_enable Page callback: Enables a saved search.
search_api_saved_searches_unparse_keys Reverses the search keywords parsing to get string keywords.
search_api_saved_searches_user_listing Page callback for listing all saved searches of a user.
_search_api_saved_searches_admin_redirect_url Returns the correct redirect URL after changing a saved search.