有没有办法以纯XML格式输出drupal页面(包含任何视图,块等的完整节点)?
谢谢,
沙迪
答案 0 :(得分:3)
您可以使用模板文件覆盖默认输出并发送XML而不是HTML。
我不确定您使用的是哪个版本的Drupal,但两者的原理相同(GrayB在另一个答案中提供了主题文档的链接)。
对于Drupal 7,你必须覆盖html.tpl.php
,它通常位于/ modules / system中,因为这会设置周围的HTML(你基本上可以摆脱它)。您可能还想覆盖page.tpl.php
和/或node.tpl.php
,具体取决于您的需求。
如果您的主题目录已有template.php
,则可以添加以下内容。如果没有template.php
文件,您可以创建一个并添加这些行(将yourtheme
更改为实际主题名称)。
<?php
function yourtheme_preprocess_html(&$vars) {
/***
* A bunch of other preprocess stuff you don't need to touch
*/
// this works for a single page, check if node id = '3'
if (in_array('html__node__3', $vars['theme_hook_suggestions'])) {
$vars['theme_hook_suggestions'][] = 'html__xml';
}
}
function yourtheme_preprocess_page(&$vars) {
/***
* Same as above
*/
$page_nids = $vars['node']->nid;
if (!$vars['is_front'] && $page_nids == '3') {
$vars['theme_hook_suggestions'][] = 'page__xml';
}
}
function yourtheme_preprocess_node(&$vars) {
/***
* Same as above
* You may not need this one, depending on how much control
* you want over the XML output
*/
$node_nid = $vars['nid'];
if ($node_nid == 3) {
$vars['theme_hook_suggestions'][] = 'node__xml';
}
}
这告诉Drupal查找名称为html--xml.tpl.php
等的模板。如果你知道你只想要主题节点3,你也可以使用类似html--node--3.tpl.php
的东西,但是给它一个通用名称就可以了更灵活。
您现在可以将相应的主题文件添加到主题文件夹中:html--xml.tpl.php
,page--xml.tpl.php
(如果您在上面添加了node--xml.tpl.php
函数,则node_preprocess
。请注意,上面建议变量中的下划线在主题文件名中变为破折号。
如果您的主题中尚不存在这些文件,您可以复制原始tpl.php
文件并更改名称(查看现有核心主题以获取这些文件 - 如上所述,您可以获取来自/ modules / system文件夹的html.tpl.php
,或创建新的。复制可能更容易,因此您可以看到您正在开始的内容并可以回滚更改。
在html--xml.tpl.php
中,您可以删除所有HTML内容并将其删除到核心输出以及XML标头:
<?php header('Content-Type: text/xml'); ?>
<?php print '<?xml version="1.0"?>'; ?>
<document>
<?php print $page; ?>
</document>
然后,您可以根据需要为page.tpl.php
执行相同的操作。这就是我的精简版本:
<?php if ($page['sidebar_first']): ?>
<sidebar>
<?php print render($page['sidebar_first']);
print render($page['sidebar_first']);
?>
</sidebar>
<?php endif; ?>
<pagenode><?php print render($page['content']); ?></pagenode>
<?php if ($page['sidebar_second']): ?>
<?php print render($page['sidebar_second']); ?>
<?php endif; ?>
当然,你的看起来会有所不同。之后,您可以随心所欲地放置要渲染的块,菜单项等。
答案 1 :(得分:1)
以下示例将创建&#34; XML&#34;选项卡旁边的&#34;查看&#34;和&#34;编辑&#34;节点页面上的选项卡:
/**
* Implementation of hook_menu().
*/
function example_menu() {
return array(
'node/%node/xml' => array(
'title' => 'XML',
'page callback' => '_example_xml',
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('view', 1),
'type' => MENU_LOCAL_TASK,
),
);
}
function _example_xml($node) {
node_feed(array($node->nid));
}
为了简单起见,我重用了node_feed,你可以用自己的标题替换它
drupal_add_http_header('Content-Type', 'text/xml');
和xml builder。
答案 2 :(得分:0)