function theme_similar_content in Similar Entries 7
Same name and namespace in other branches
- 5 similar.module \theme_similar_content()
- 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,
)) : '';
}