You are here

function theme_similar_content in Similar Entries 7

Same name and namespace in other branches
  1. 5 similar.module \theme_similar_content()
  2. 6 similar.module \theme_similar_content()

Queries the database for similar entries and puts them in a HTML list.

Parameters

$node: The current node being viewed.

Return value

A themed item list of related links.

1 theme call to theme_similar_content()
similar_block_view in ./similar.module
Implements hook_block_view().

File

./similar.module, line 350
Module that shows a block listing similar entries. NOTE: Uses MySQL's FULLTEXT indexing for MyISAM tables.

Code

function theme_similar_content($variables) {
  $node = $variables['node'];
  $boolean = variable_get('similar_boolean_mode', 1) == 1;
  $summary = variable_get('similar_summary_enabled', 0);
  $items = array();
  $text = $node->title;
  if (isset($node->body) && isset($node->body[$node->language])) {
    $text .= " {$node->body[$node->language][0]['value']}";
  }

  // Create a comma-separated list of available node types.
  $types = _similar_published_node_types();
  $types = variable_get('similar_node_types', $types);
  array_walk($types, '_similar_content_type_escape');

  // Build the database query.
  $query = db_select('node_revision', 'r');
  $query
    ->addField('r', 'nid');
  $query
    ->join('node', 'n', 'r.nid = n.nid AND r.vid = n.vid');

  // Add fields and MATCH queries.
  $selects = array();
  if (db_table_exists('field_data_body')) {
    $body_table = $query
      ->join('field_data_body', 'b', 'n.nid = b.entity_id');
    $selects[] = "{$body_table}.body_value";
  }

  // Add extra fields to the query if enabled.
  if (module_exists('field') && variable_get('similar_include_fields', 0) == 1) {
    foreach (similar_get_indices() as $table => $indexed) {
      if (!empty($indexed) && db_table_exists($table)) {
        $alias = $query
          ->join($table, $table, "n.nid = {$table}.entity_id");
        if (count($indexed) > 1) {
          $selects[] = "{$alias}." . implode(", {$alias}.", $indexed);
        }
        elseif (count($indexed) == 1) {
          $field = array_pop($indexed);
          $selects[] = "{$alias}.{$field}";
        }
      }
    }
  }
  $expression_params = array();
  $expression = "(2 *(MATCH (r.title) AGAINST (:expr_param)))";
  $expression_params['expr_param'] = $text;
  $param_count = 1;
  foreach ($selects as $field) {
    $param_count++;
    $expression_params['expr_param_' . $param_count] = $text;
    $expression .= " + (MATCH ({$field}) AGAINST (:expr_param_{$param_count}))";
  }
  $expression = "({$expression})";

  //$fields = implode(", ", $selects);

  //$expression = "MATCH ($fields) AGAINST ('$text')";
  $query
    ->addExpression($expression, 'score', $expression_params);
  $query
    ->condition('n.status', 0, '<>');
  $query
    ->condition('r.nid', $node->nid, '<>');
  $query
    ->condition('n.type', $types, 'IN');
  $query
    ->groupBy('n.nid');
  $query
    ->having('score > 0');
  $query
    ->orderBy('score', 'DESC');
  $query
    ->range(0, variable_get('similar_num_display', 5));
  $query
    ->addTag('node_access');

  // Add taxonomy filter if enabled.
  if (module_exists('taxonomy') && (variable_get('similar_taxonomy_filter', 0) == 2 && ($taxonomy_tids = variable_get('similar_taxonomy_tids', array()))) || variable_get('similar_taxonomy_filter', 0) == 1 && ($taxonomy_tids = _similar_taxonomy_membership($node->nid))) {
    array_walk($taxonomy_tids, '_similar_force_int');
    if (sizeof($taxonomy_tids) > 1) {
      $taxonomy_tids = implode(',', $taxonomy_tids);
    }
    else {
      list(, $taxonomy_tids) = each($taxonomy_tids);
      $taxonomy_tids = (int) $taxonomy_tids;
    }
    $query
      ->join('taxonomy_index', 'i', 'r.nid = i.nid AND i.tid IN (:tids)', array(
      ':tids' => $taxonomy_tids,
    ));
  }
  $result = $query
    ->execute()
    ->fetchAll();
  foreach ($result as $node) {
    $content = node_load($node->nid);
    $no_follow = variable_get('similar_rel_nofollow', 0) ? array(
      'rel' => 'nofollow',
    ) : array();
    if ($summary) {
      $items[] = '<div class="similar-title">' . l($content->title, 'node/' . $node->nid, array(
        'attributes' => array(
          'title' => $content->title,
        ) + $no_follow,
        'absolute' => TRUE,
      )) . '</div><div class="similar-summary">' . check_markup($content->body[$content->language][0]['safe_summary'], $content->body[$content->language][0]['format'], FALSE) . '</div>';
    }
    else {
      $items[] = l($content->title, 'node/' . $node->nid, array(
        'attributes' => array(
          'title' => $content->title,
        ) + $no_follow,
      ));
    }
  }
  return sizeof($items) > 0 ? theme('item_list', array(
    'items' => $items,
  )) : '';
}