Categories
Blog

Customizing an RSS feed using Drupal and Views

Note: This has only been tested with Drupal 6.x.

For some boneheaded reason, the latest version of Views for Drupal doesn’t let you customize the fields output in an RSS feed. If you create a new feed view, under the Fields block, you’ll get a message saying “The style selected does not utilize fields.” Well la de da. This means you’re stuck displaying the default content, despite which fields CCK says it is displaying or hiding.

Of course. Why would you want to customize your fields, anyway?

So here’s how I was able to customize the RSS fields output by including the entire node in the RSS feed results. If you want a tutorial on how to first setup an RSS feed, there’s a tutorial on creating a custom rss feed in Drupal.

Now that you have your feed setup, you’ll see there’s nothing you can do with it. But there is a Views function you can overwrite in template.php to add more data to the output rows.

/**
 * Default theme function for all RSS rows.
 */
function phptemplate_preprocess_views_view_row_rss(&$vars) {
  $view     = &$vars['view'];
  $options  = &$vars['options'];
  $item     = &$vars['row'];
 
  // Use the [id] of the returned results to determine the nid in [results]
  $result	= &$vars['view']->result;
  $id		= &$vars['id'];
  $node		= node_load( $result[$id-1]->nid );
 
  $vars['title'] = check_plain($item->title);
  $vars['link'] = check_url($item->link);
  $vars['description'] = check_plain($item->description);
  //$vars['description'] = check_plain($node->teaser);
  $vars['node'] = $node;
  $vars['item_elements'] = empty($item->elements) ? '' : format_xml_elements($item->elements);
}

I need to get a real code parser. This is just embarrassing.

What I’ve done above is use the 'result' array and 'id' value returned in the &$vars variable to determine the node ID of the returned results. The ID is just the position the node appears in the list of results (1,2,3,etc.). It’s one higher than the keys to the objects in the ‘results’ array (0,1,2,etc.) so just tell the function to get the nid in the object at position ID minus 1, and now you have the nid of the result. I load the nid into the &$vars array to be sent to the Views template, which I’ll get to now.

Views already has support for templates, but my complaint with its templates — like my complaint with much of Drupal — is that it gives you a half-finished template. It doesn’t give you the perfectly-rendered, nicely polished HTML to want, and it doesn’t give you an array to customize how you see fit: it gives you something in the middle, usually consisting of an array of preformatted elements. So thanks for that. I hope you like all your content wrapped in <p> tags! Well, most of the time, anyway!

Ahem, where was I? Ah, the template. Views recommends using a template called views-view-row-rss.tpl.php (you’ll notice it corresponds to the function name above). This is the most generic RSS template, but you can use a more specific one if you don’t want to use the same formatting on all your RSS feeds. Now that you have the $node variable at your fingertips, you can put any of the node content in the feed. Here’s what I did with it.

< ?php
// $Id: views-view-row-rss.tpl.php 3296 2009-05-27 23:08:21Z timtoon $
/**
 * @file views-view-row-rss.tpl.php
 * Default view template to display a item in an RSS feed.
 *
 * @ingroup views_templates
 */
?>
  <item>
	<title>< ?php print $title; ?></title>
	<link />< ?php print $link; ?>
	<description>![CDATA[< ?php 
		$desc = $node->field_teaser[0]['value'] ? $node->field_teaser[0]['value'] : $node->body;
		print nl2br(check_plain(trim($desc)));
	?>]]</description>
	< ?php print $item_elements; ?>
</item>

Christ how can anyone read that. Fixed! Anyway, nothing too fancy here. I don’t like Drupal’s auto-truncating teaser field, so I’m using my own in a custom field called field_teaser. But if there is no field_teaser value, use the whole node body. I hope this isn’t too many unrelated things to make a clear example.

Now that I have my node’s teaser/body, I trim the content, use Drupal’s check_plain function to do the same thing as PHP’s strip_tags method, and convert the new lines to line breaks using nl2br.

So your RSS reader won’t try to parse those <br /> tags as XML, I enclosed the content in <![CDATA[ ... ]]>, so now you won’t lose any formatting that wasn’t just stripped out by check_plain.

At last, I have a custom-formatted RSS feed showing only the field I want. I can use this to put whatever node content I want into my RSS feed, and if you have been able to follow my rambling example, so can you!

There is another method here: Control Title link and “read more” in RSS Feed of views

Home Theater Alchemy

Now that I have my home theater setup (…er, mostly), it’s time for me to find the right set of speakers. There is so much jargon in home audio I can’t pretend to understand it. But I went to How to choose the right speakers for your amplifier or AV receiver and feel like I was able to divine some truths. I think.

The optimal settings for matching speakers to a home theater receiver are:

Match Ohms and wattage from the receiver to the speakers, erring on the side of extra wattage from the receiver and higher Ohms on the speakers.

Ohms: speakers >= receiver (lower Ohms are better)
Watts: receiver = speakers + up to 10% (more watts are better)
Sensitivity: 87-93dB (higher dBs are better)

Categories
Blog

Home Theater Roundup

I went through half a dozen home theater receivers last year, trying to find one that would work connected to my Mac Mini media PC. Here are the results:

The Dark Age of genre movies

What set me off was the post And the He-Man Movie Is Back to Being F@#$ed about some nobody writer, egged on by Warner Bros., fucking up the script to a potential Masters of the Universe movie.

Warners sees the big-screen version as a gritty fantasy and reimagines Adam as a soldier who sets off to find his destiny, happening upon the magical world of Eternia. There, Skeletor has raised a technological army and is bent on eradicating magic.

A technological army? Robots? Why? Well, robots are natural cannon fodder, I concluded. No one cares when they get blown-up, cut in half or crushed (just ask HELPeR, a Battle Droid, or the Terminator). Having disposable baddies lets you get action in your movie without having to worry about killing off any beloved characters and risking tying your hands when it comes time for a sequel. But wouldn’t an action movie where no one dies be better described as a motion movie? Transformers: The Movie killed off characters in spades, and it still remains one of the most memorable movies from my childhood. It never had a sequel.

True, the reason so many G1 Transformers were killed off was to make room for new toys, but I would rather have old characters killed off and new ones brought in than to let a franchise wallow in its own ossified nostalgia. Must He-Man, Transformers, or GI Joe (whoa… all movies) be the exact same things from our childhood? We grew up, why couldn’t they? (OK, maybe some of us didn’t grow up so well, so I guess maybe toy franchises are no different.)

But with this eye-rolling example of a writer who just doesn’t get it writing the He-Man movie, plus the huge shit Michael Bay has taken on the Transformers franchise, not to mention the sound and fury signifying nothing that was Wolverine, I feel like comic book movies are suffering through the same Dark Age that comic books went through in the ’90s.

It took some time to digest, but soon the better draftsmen in the field began to interject their art with realism and reverence. … Artists who draw in the cartoon style of the Eighties or the hyper-thyroid style of the Nineties are out of fashion — perhaps forever.

This excerpt is taken from Our Gods Wear Spandex, how Alex Ross’ Kingdom Come broke the mold that had stifled comic books in their garish pre-bagged, chromium-covered trappings throughout the Nineties. It was a time when talentless hacks churned out mediocre characters and horrible art. Sound like something playing at a theater near you?

Mike & Ben Show.com is no more

The domain www.mikeandbenshow.com expires today, taking with it the all the online memories of “The Mike & Ben Show” — a college TV show that I haven’t been a part of for eight years. But please take a moment to browse old episode synopses and snarky email exchanges, not to mention the prominent button on the front page linking to the NEW site… which itself no longer exists.

I assure you, you’ll be the first non-googlebot visitor to the site in years.