I needed to serve up some xml content to provide to a piece of flash that was handling the display. I knew I could get all the information I needed with a view but had no idea how to get it into the format that I wanted. Searching on the site resulted in mostly stuff about rss so I wanted to post a "How To" for anyone else that needed it.
First thing create your view. Use a page view and specify the fields you want on the view like you would for any view.
Next, create a new template file, I called mine page-xml.tpl.php, and it should contain: (Borrowing from Creating a separate admin theme )
<?php
drupal_set_header('Content-Type: text/xml; charset=utf-8');
print "<?xml version=\"1.0\"?>";
print "<root>";
print $content;
print "</root>";
Now, inside template.php, we have to modify the template variable for phptemplate:
function _phptemplate_variables($hook, $variables)
{
switch($hook) {
case 'page':
if(arg(0) == 'xml' && arg(1) == 'states') {
$variables['template_file'] = 'page-xml';
// skip everything else
break;
}
if(arg(0) == 'admin' || arg(0) == 'control_panel') {
$variables['template_file'] = 'page-admin';
}
blot_removetab('users', $variables);
blot_removetab('content', $variables);
break;
}
return $variables;
}
I used arg(0) and arg(1) since the url for my page view was "xml/states" but this could be done a few different ways. So whatever works for you.
You also need to theme the view form with template.php: (See Theming with Views)
function themeName_views_view_viewName($view, $type, $nodes, $level = NULL, $args = NULL) {
...
}
A limitation to this is that if you need more than one feed, it could get a little messy inside "_phptemplate_variables", but it could be done.
Enjoy! Hope it helps.
Eric.
Comments
Even easier with Drupal 5
simple create a new page template, page-xml.tpl.php:
* the q's should be ?,
Now just create a new View, and for that views url, use xml/whatever. The xml/ is key since that's how drupal will determine which page template to use. In this case, it will use page-xml.tpl.php. see http://drupal.org/node/104316 for more info.
Then just theme your view inside template.tpl.php and you are set. i.e.
Hi. I wondered if you could
Hi. I wondered if you could clarify something for me.
When you say "use xml/whatever" for the view, how exactly does that correspond to the function in the template.tpl.php file?
would it be like this?:
this seems obvious but it's not working for me yet.
In drupal 5 are the above two steps the only ones required?
Thanks.
This will help
My example is confusing a little. Instead of whatever, I should of put view-url. (remember the view-url is different from the view name)
So, The themeing function "themename_views_view_view_xml_whatever" would theme the view "xml_whatever".
For the xml part of the url, read this: http://drupal.org/node/104316
Basically, you are just theming a view like normal, mytheme_views_view_view_whatever, but calling the view with a different page template by adding xml to the path. xml/view-url
Doesn't work…
Servus!
I simply copied your code (great stuff, thanks) but it didn't work. I.e.:
didn't show any data, all I got was blank items. I changed that (and everything else) to
and it worked like a charm.
I just wonder if the code you posted ever worked for you, and if so, what's different here that your code didn't work for me… Oh, and that's with Drupal 5.5 / Views 5.x-1.6…
Norbert
-- form follows function
Norbert
-- form follows function
related item
http://drupal.org/node/189366
well I tried that "view -
well I tried that "view - page-xml.tpl.php - template.php hack" method and it worked. Now I have a fully drupal driven flash banner BUT, now I have a little problem. First of all I've realized that if I use for example,
$output .= "<title><![CDATA[".$node->path."]]></title>";as an output string, the page source is parsed as:
<![CDATA[science-and-future]]>As flash imports this value, the link becomes undifined. So I tried to ommit the cdata and used only:
$output .=<link>/". $node->path .";</link>and it worked.Now the output is:
science-and-futureSo far, so good. The last problem is Internet Explorer 7, FireFox 3 and Chrome parses different this code. While FF does his job IE shows nothing.
For IE 7:
<link></link>For FF 3:
<link>/science-and-future</link>What could be the problem?
WAY simpler with Views Node Feed module!!!!
no seriously.
--
..happiness is point and click..
--
http://drupaltees.com
80s themed Drupal T-Shirts
subscribing
subscribing
________________
Live fast die young
how i did it in drupal 6
http://drupal.org/node/189366#comment-2948484
Views bonus pack
You can use views bonus pack module, then in Views add feed display and in Style settings choose Style: XML.
XML
I have had some degree of success with http://drupal.org/project/views_datasource. Worked out well for a Drupal back-end with Adobe Flash content display.
A list of some of the Drupal sites I have designed and/or developed can be viewed at motioncity.com