有没有办法以纯 XML 格式输出 drupal 页面(带有任何 View 、 block 等的完整节点)?
谢谢
沙迪
最佳答案
您可以使用模板文件覆盖默认输出并发送 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
等的模板。您也可以使用类似 html--node--3.tpl.php 的模板
如果您知道您只想主题节点 3,但给它一个通用名称可以使其更加灵活。
您现在可以将适当的主题文件添加到主题文件夹中: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 header :
<?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; ?>
当然,你的看起来会很不一样。之后,您可以做任何您喜欢的事情来放置您想要渲染的 block 、菜单项等。
关于xml - 以结构化 XML 格式输出完整的 Drupal 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6278014/