Недавно понадобилось публиковать на сайте новости по ключевому слову... подсказали что есть модуль News_page - модуль создает новый тип материала и в итоге можно получить разные страницы с ссылками по разным словам (для определенной категории)...
Мне данный функционал не совсем подходил... Поэтому я переделал данный модуль в сниппет - блок с ссылками по одному ключевому слову и категории...
Для того чтобы все работало нужно:
1. admin/content/aggregator тут добавляете необходимые вам ленты, и назначаете их одной категории...
2. Создаете блок и вставляете в него код:
<?php
$keywords = "земля, +марс, -венера"; //Фильтр при наличии нескольких слов работает так - слова которые не должны присутствовать должны находится в конце...
$cid=2; //номер назначенной категории
$arguments = array($cid);
if (!empty(
$keywords)) {
$words = explode(",", $keywords);
print $word;
foreach ($words as $word) {
$word = trim($word);
if (
preg_match("/^-/", $word)) {
$word = preg_replace('/^-/','', $word);
$not_title_filter[] = "lower(i.title) NOT LIKE '%%%s%%'";
$arguments[] = $word;
$not_content_filter[] = "lower(i.description) NOT LIKE '%%%s%%'";
$arguments[] = $word;
$not_filter_query = implode(" AND ", $not_title_filter) . ' AND ' . implode(" AND ", $not_content_filter);
} elseif (
preg_match("/^\+/", $word)) {
$word = preg_replace('/^\+/','', $word);
$and_title_filter[] = "lower(i.title) LIKE '%%%s%%'";
$arguments[] = $word;
$and_content_filter[] = "lower(i.description) LIKE '%%%s%%'";
$arguments[] = $word;
$and_filter_query = implode(" AND ", $and_title_filter) . ' OR ' . implode(" AND ", $and_content_filter);
} else {
$title_filter[] = "lower(i.title) LIKE '%%%s%%'";
$arguments[] = $word;
$content_filter[] = "lower(i.description) LIKE '%%%s%%'";
$arguments[] = $word;
$filter_query = implode(" OR ", $title_filter) . ' OR ' . implode(" OR ", $content_filter);
}
}
$news_queries = array($filter_query, $and_filter_query, $not_filter_query);
$i = 0;
foreach (
$news_queries as $query) {
if ($i > 0 && drupal_strlen($query) > 0) {
$news_query .= "AND " ;
}
if (drupal_strlen($query)) {
$news_query .= "(". $query .")";
$i++;
}
}
}
$search->sql = 'SELECT i.*, f.link AS flink, f.title AS ftitle
FROM {aggregator_item} i
LEFT JOIN {aggregator_feed} f ON i.fid = f.fid
LEFT JOIN {aggregator_category_feed} c ON c.fid = f.fid
WHERE c.cid = %d';
if (!empty(
$news_query)) $search->sql .= " AND ($news_query)";
$search->sql .= ' ORDER BY timestamp DESC';
$search->arguments = $arguments;
$result = db_query_range($search->sql, $search->arguments, 0, 4 /*$node->max_items*/);
$output .= '<div class="out-links_cont">';
while ($item = db_fetch_object($result)){
$output .= '<div class="out-link"><a href="' . check_url($item->link) . '"><b>—</b> ' .filter_xss($item->title, array()) . '</a></div>';
}
$output .= '</div>';
return
$output;
?>
Как результат получите 4 самых свежих ссылки на новости...