xml - 以结构化 XML 格式输出完整的 Drupal 页面

标签 xml drupal

有没有办法以纯 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.phppage--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/

相关文章:

javascript - Php 和 javascript 在本地主机上工作,但在托管网站上不工作

c# - 添加为资源的 WPF C# XML 文件

java - 如何在 xslt 转换期间处理 org.apache.xml.utils.WrappedRuntimeException?

javascript - Node.js xml2js 解析器未定义

c# - WCF 动态响应格式

javascript - Drupal 中的哪个所见即所得编辑器能让我最大程度地控制标记?

c# - 无法将字符串转换为 int。来自 XML 元素的数据。 C#

css - 清除hr元素:both in CKEditor edit window

Drupal:添加新节点时自动添加菜单项

forms - 以 Drupal 形式设置单个单选按钮的样式