Drupal Search im eigenen Modul verwenden

Wer eine simple Volltextsuche für seine Drupal-7-Seite benötigt, aber nicht jedesmal den gesamten Node-Bestand mit SQL LIKE Statements durchforsten möchte, kann sich dem Core-Modul Search bedienen. Das geht auch programmatisch im eigenen Modul, wenn man z.B. andere Bedingungen festlegen möchte

Da das verändern des Kerns ja ein No-Go ist, kann man die entscheidende Funktion einfach aus dem Search Modul kopieren, entsprechend des Modulnamens anpassen und dann frei Schnauze darin herumpfuschen:

function MYMODULE_search_execute($keys = NULL, $conditions = NULL) {
  $limit = variable_get('search_result_limit', 100);
  // 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');

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

  // Load results.
  $find = $query->limit($limit)->execute();
  $results = array();
  foreach ($find as $item) {
    // Build the node body.
    $node = node_load($item->sid);
    node_build_content($node, 'search_result');
    $node->body = drupal_render($node->content);

    // Fetch comments for snippet.
    $node->rendered .= ' ' . module_invoke('comment', 'node_update_index', $node);
    // Fetch terms for snippet.
    $node->rendered .= ' ' . module_invoke('taxonomy', 'node_update_index', $node);

    $extra = module_invoke_all('node_search_result', $node);

    $results[] = array(
      'link' => url('node/' . $item->sid, array('absolute' => TRUE)),
      'type' => check_plain(node_type_get_name($node)),
      'title' => $node->title,
      'user' => theme('username', array('account' => $node)),
      'date' => $node->changed,
      'node' => $node,
      'extra' => $extra,
      'score' => $item->calculated_score,
      'snippet' => search_excerpt($keys, $node->body),
    );
  }
  return $results;
}

In Zeile 6 werden die Query-Conditions festgelegt. Wenn man z.B. das Modul Custom Publishing Options nutzt oder andere Eigenschaften der Node vergleichen möchte (zum Beispiel Erstellungs- oder Änderungsdatum), dann kann man das hier ergänzen.

Aus

$query->condition('n.status', 1)->addTag('node_access')->searchExpression($keys, 'node');

wird dann z.B.

$query->condition('n.status', 1)->condition('n.MYCUSTOMPROPERTY', VALUEFORMYCUSTOMPROPERTY)->addTag('node_access')->searchExpression($keys, 'node');

um das Feld MYCUSTOMPROPERTY gegen den Wert VALUEFORMYCUSTOMPROPERTY zu prüfen.