You are here

function node_ds_search_execute in Display Suite 7.2

Same name and namespace in other branches
  1. 7 modules/ds_search/ds_search.module \node_ds_search_execute()

Search on behalf of Drupal Core.

File

modules/ds_search/ds_search.module, line 453
Display Suite search.

Code

function node_ds_search_execute($keys = NULL, $conditions = NULL) {

  // Build matching conditions
  $query = db_select('search_index', 'i', array(
    'target' => 'slave',
  ))
    ->extend('SearchQuery')
    ->extend('PagerDefault');
  $query
    ->join('node', 'n', 'n.nid = i.sid');
  $query
    ->condition('n.status', 1)
    ->addTag('node_access')
    ->searchExpression($keys, 'node');

  // Language.
  if (variable_get('ds_search_language', FALSE)) {
    global $language;
    $query
      ->condition('n.language', $language->language);
  }

  // Insert special keywords.
  $query
    ->setOption('type', 'n.type');
  $query
    ->setOption('language', 'n.language');
  if ($query
    ->setOption('term', 'ti.tid')) {
    $query
      ->join('taxonomy_index', 'ti', 'n.nid = ti.nid');
  }

  // Only continue if the first pass query matches.
  if (!$query
    ->executeFirstPass()) {
    return array();
  }

  // Add the ranking expressions.
  _node_rankings($query);
  $limit = variable_get('ds_search_node_limit', 10);
  $query
    ->limit($limit);

  // Load results.
  $find = $query
    ->execute();
  $results = array();
  foreach ($find as $item) {
    $node = node_load($item->sid);
    $node->entity_type = 'node';
    $node->entity_id = $item->sid;
    $node->search_extra = module_invoke_all('node_search_result', $node);

    // Only build a node search snippet if this field is actually being used.
    $fields = ds_get_field_settings($node->entity_type, $node->type, 'search_result');
    if (!empty($fields) && isset($fields['search_snippet'])) {

      // Because the 'search_result' display is being built right now (and because it is being overridden by Display Suite),
      // it is necessary to use the 'search_index' display for rendered field content.
      $build = node_view($node, 'search_index');
      unset($build['#theme']);

      // Render the node.
      $rendered = drupal_render($build);

      // Attach extra information to the rendered output.
      $rendered .= ' ' . implode('', $node->search_extra);

      // Generate the snippet based on rendered content.
      $node->snippet = search_excerpt($keys, $rendered);
    }
    $results[$item->sid] = $node;
  }
  return $results;
}