输出结构化XML中的完整Drupal页面

时间:2011-06-08 11:27:36

标签: xml drupal

有没有办法以纯XML格式输出drupal页面(包含任何视图,块等的完整节点)?

谢谢,

沙迪

3 个答案:

答案 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.phppage--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)

我发布了working example on Drupal Answers。基本上您只需要hook_menu()以及node_feed()format_rss_channel()format_rss_item()的自定义版本。

以下博客文章也可能有所帮助。 https://www.phase2technology.com/blog/creating-rss-feeds-with-a-light-hand/