node_feed
modules/node/node.module, строка 1646
- Версии
- 5
node_feed(
$nodes= 0, $channel = array())- 6
node_feed($nids = FALSE, $channel = array())
A generic function for generating RSS feeds from a set of nodes.
Параметры
$nids
An array of node IDs (nid). Defaults to FALSE
so empty feeds can be
generated with passing an empty array, if no items are to be added
to the feed.
$channel
An associative array containing title, link, description and other keys.
The link should be an absolute URL.
Код
<?php
function node_feed($nids = FALSE, $channel = array()) {
global $base_url, $language;
if ($nids === FALSE) {
$nids = array();
$result = db_query_range(db_rewrite_sql('SELECT n.nid, n.created FROM {node} n WHERE n.promote = 1 AND n.status = 1 ORDER BY n.created DESC'), 0, variable_get('feed_default_items', 10));
while ($row = db_fetch_object($result)) {
$nids[] = $row->nid;
}
}
$item_length = variable_get('feed_item_length', 'teaser');
$namespaces = array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/');
$items = '';
foreach ($nids as $nid) {
// Load the specified node:
$item = node_load($nid);
$item->build_mode = NODE_BUILD_RSS;
$item->link = url("node/$nid", array('absolute' => TRUE));
if ($item_length != 'title') {
$teaser = ($item_length == 'teaser') ? TRUE : FALSE;
// Filter and prepare node teaser
if (node_hook($item, 'view')) {
$item = node_invoke($item, 'view', $teaser, FALSE);
}
else {
$item = node_prepare($item, $teaser);
}
// Allow modules to change $node->content before the node is rendered.
node_invoke_nodeapi($item, 'view', $teaser, FALSE);
// Set the proper node property, then unset unused $node property so that a
// bad theme can not open a security hole.
$content = drupal_render($item->content);
if ($teaser) {
$item->teaser = $content;
unset($item->body);
}
else {
$item->body = $content;
unset($item->teaser);
}
// Allow modules to modify the fully-built node.
node_invoke_nodeapi($item, 'alter', $teaser, FALSE);
}
// Allow modules to add additional item fields and/or modify $item
$extra = node_invoke_nodeapi($item, 'rss item');
$extra = array_merge($extra, array(array('key' => 'pubDate', 'value' => gmdate('r', $item->created)), array('key' => 'dc:creator', 'value' => $item->name), array('key' => 'guid', 'value' => $item->nid .' at '. $base_url, 'attributes' => array('isPermaLink' => 'false'))));
foreach ($extra as $element) {
if (isset($element['namespace'])) {
$namespaces = array_merge($namespaces, $element['namespace']);
}
}
// Prepare the item description
switch ($item_length) {
case 'fulltext':
$item_text = $item->body;
break;
case 'teaser':
$item_text = $item->teaser;
if (!empty($item->readmore)) {
$item_text .= '<p>'. l(t('read more'), 'node/'. $item->nid, array('absolute' => TRUE, 'attributes' => array('target' => '_blank'))) .'</p>';
}
break;
case 'title':
$item_text = '';
break;
}
$items .= format_rss_item($item->title, $item->link, $item_text, $extra);
}
$channel_defaults = array(
'version' => '2.0',
'title' => variable_get('site_name', 'Drupal'),
'link' => $base_url,
'description' => variable_get('site_mission', ''),
'language' => $language->language
);
$channel = array_merge($channel_defaults, $channel);
$output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$output .= "<rss version=\"". $channel["version"] ."\" xml:base=\"". $base_url ."\" ". drupal_attributes($namespaces) .">\n";
$output .= format_rss_channel($channel['title'], $channel['link'], $channel['description'], $items, $channel['language']);
$output .= "</rss>\n";
drupal_set_header('Content-Type: application/rss+xml; charset=utf-8');
print $output;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии