? atom_views_feed.patch
Index: atom.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/atom/atom.module,v
retrieving revision 1.20
diff -u -p -r1.20 atom.module
--- atom.module 13 Jan 2006 04:03:55 -0000 1.20
+++ atom.module 24 Jun 2006 07:44:02 -0000
@@ -134,53 +134,13 @@ function _atom_print_feed($nodes, $feed_
$output = '';
$last_mod = 0;
while ($node = db_fetch_object($nodes)) {
- $item = node_load(array('nid' => $node->nid));
- $link = url("node/$node->nid", NULL, NULL, true);
+ $output .= _atom_print_node($node, $last_mod);
+ }
- if (node_hook($item, 'view')) {
- node_invoke($item, 'view', TRUE, FALSE);
- }
- else {
- $item = node_prepare($item, TRUE);
- }
+ _atom_print_feed_output($output, $feed_info, $last_mod);
+}
- // Allow modules to change $node->teaser before viewing.
- node_invoke_nodeapi($item, 'view', true, false);
-
- $output .= " \n";
- $output .= ' '. check_plain(strip_tags($item->title)) ."\n";
- $output .= ' '. "\n";
- $output .= ' '. $link ."\n";
- $output .= ' '. _atom_timestamp2w3dtf($item->created) ."\n";
- $output .= ' '. _atom_timestamp2w3dtf($item->changed) ."\n";
- $last_mod = $item->changed;
- $output .= " \n";
- if ($item->name) {
- $output .= ' '. $item->name ."\n";
- }
- else {
- $output .= ' '. variable_get('anonymous', 'Anonymous') ."\n";
- }
- $output .= " \n";
- if (module_exist('taxonomy')) {
- $terms = taxonomy_node_get_terms($item->nid);
- foreach ($terms as $term) {
- $output .= ' '. "\n";
- }
- }
- // Summary
- $output .= ' teaser);
- $output .= " ]]>\n";
-
- // Body
- $output .= ' nid, variable_get('atom_ad_code', ''))) : '';
- $output .= check_markup($item->body);
- $output .= variable_get('atom_ad_location', 'off') == 'append' ? str_replace('%link', urlencode($link), str_replace('%id', $node->nid, variable_get('atom_ad_code', ''))) : '';
- $output .= " ]]>\n";
- $output .= " \n";
- }
+function _atom_print_feed_output($output, $feed_info, $last_mod) {
drupal_set_header('Content-Type: application/xml');
@@ -196,6 +156,55 @@ function _atom_print_feed($nodes, $feed_
print "\n";
}
+function _atom_print_node($node, &$last_mod) {
+ $item = node_load(array('nid' => $node->nid));
+ $link = url("node/$node->nid", NULL, NULL, true);
+
+ if (node_hook($item, 'view')) {
+ node_invoke($item, 'view', TRUE, FALSE);
+ }
+ else {
+ $item = node_prepare($item, TRUE);
+ }
+
+ // Allow modules to change $node->teaser before viewing.
+ node_invoke_nodeapi($item, 'view', true, false);
+
+ $output .= " \n";
+ $output .= ' '. check_plain(strip_tags($item->title)) ."\n";
+ $output .= ' '. "\n";
+ $output .= ' '. $link ."\n";
+ $output .= ' '. _atom_timestamp2w3dtf($item->created) ."\n";
+ $output .= ' '. _atom_timestamp2w3dtf($item->changed) ."\n";
+ $last_mod = $item->changed;
+ $output .= " \n";
+ if ($item->name) {
+ $output .= ' '. $item->name ."\n";
+ }
+ else {
+ $output .= ' '. variable_get('anonymous', 'Anonymous') ."\n";
+ }
+ $output .= " \n";
+ if (module_exist('taxonomy')) {
+ $terms = taxonomy_node_get_terms($item->nid);
+ foreach ($terms as $term) {
+ $output .= ' '. "\n";
+ }
+ }
+ // Summary
+ $output .= ' teaser);
+ $output .= " ]]>\n";
+
+ // Body
+ $output .= ' nid, variable_get('atom_ad_code', ''))) : '';
+ $output .= check_markup($item->body);
+ $output .= variable_get('atom_ad_location', 'off') == 'append' ? str_replace('%link', urlencode($link), str_replace('%id', $node->nid, variable_get('atom_ad_code', ''))) : '';
+ $output .= " ]]>\n";
+ $output .= " \n";
+ return $output;
+}
/**
* @return string
*/
@@ -240,4 +249,64 @@ function atom_settings() {
return $form;
}
+
+/**
+ * Provide views plugins for the atom types we support.
+ */
+function atom_views_style_plugins() {
+ return array(
+ 'atom' => array(
+ 'name' => t('Atom: atom feed'),
+ 'theme' => 'views_atom_feed',
+ ),
+ );
+}
+
+function atom_views_feed_argument($op, &$view, $arg) {
+ if ($op == 'argument' && $arg == 'atom') {
+ $view->page_type = 'atom';
+ }
+ else if ($op == 'post_view') {
+ $url = views_post_view_make_url($view, $arg, 'atom');
+ drupal_add_link(array('rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Atom'),
+ 'href' => url($url, NULL, NULL, TRUE)));
+ // There needs to be a separate atom feed icon!
+ return theme('feed_icon', url($url));
+ }
+}
+
+function theme_views_atom_feed($view, $nodes) {
+ // figure out the non-feed URL
+ $args = array();
+ foreach ($view->args as $id => $arg) {
+ if ($arg != 'atom') {
+ // This condition only happens if there are, for some odd reason,
+ // arguments *after* the feed. This is illogical but possible.
+ if ($skip) {
+ $args[] = '*';
+ }
+ $args[] = $arg;
+ }
+ else {
+ $skip = true;
+ }
+ }
+
+ $url = views_get_url($view, $args);
+ $feed_info = array();
+ $feed_info['title'] = views_get_title($view);
+ $feed_info['html_url'] = url($url, NULL, NULL, true);
+ $feed_info['atom_url'] = url($view->real_url, NULL, NULL, true);
+
+ $last_mod = 0;
+ foreach($nodes as $node) {
+ $output .= _atom_print_node($node, $last_mod);
+ }
+
+ _atom_print_feed_output($output, $feed_info, $last_mod);
+ exit;
+}
+
?>