显示一个没有页面模板的Drupal视图

我想显示一个Drupal视图,但不包含通常围绕它的页面模板 – 我只想要视图节点的纯HTML内容。

这个视图将被包含在另一个非Drupal站点中。

我期望不得不这样做有很多的意见,所以一个解决scheme,让我快速和容易地设置这将是最好的 – 我不希望创build一个.tpl.php文件每次我需要包括一个视图的地方。

我正在寻找一种方法来通过ajax提取节点数据,并为Drupal 6提出了以下解决scheme。在实现下面的更改后,如果在URL中添加ajax = 1(例如mysite.com/node/1?ajax= 1),你会得到只是内容和没有页面布局。

在主题的template.php文件中:

function phptemplate_preprocess_page(&$vars) { if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) { $vars['template_file'] = 'page-ajax'; } } 

然后使用以下内容在您的主题目录中创buildpage-ajax.tpl.php:

 <?php print $content; ?> 

根据Ufonion实验室的回答,我能够通过在我的主题template.php中实现hook_preprocess_pagehook_preprocess_html来完全删除Drupal 7中页面内容的所有HTML输出,如下所示:

 function MY_THEME_preprocess_page(&$variables) { if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') { $variables['theme_hook_suggestions'][] = 'page__embed'; } } function MY_THEME_preprocess_html(&$variables) { if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') { $variables['theme_hook_suggestions'][] = 'html__embed'; } } 

然后我添加了两个模板到我的主题: html--embed.tpl.php

 <?php print $page; ?> 

page--embed.tpl.php

 <?php print render($page['content']); ?> 

现在,当我打开一个节点页面,如http://example.com/node/3 ,我像往常一样看到完整的页面,但是当我添加response_type参数,如http://example.com/node/ 3?response_type = embed ,我获取带有页面内容的<div> ,所以它可以embedded到另一个页面中。

我知道这个问题已经被回答了,但是我想添加我自己的解决scheme,使用费城网页devise(PWD)的答案元素,并使用Owenbuild议的hook_theme_registry_alter。 使用此解决scheme,您可以直接从自定义模块加载模板。

首先,我将raw.tpl.php添加到模块中新创build的“模板”文件夹中。 raw.tpl.php的内容与PWD的页面ajax.tpl.php相同:

 <?php print $content; ?> 

接下来,我在我的模块中以与PWD相同的方式实现了hook_preprocess_page(除了我修改了$ _GET参数并更新了模板文件引用:

 function MY_MODULE_NAME_preprocess_page(&$vars) { if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) { $vars['template_file'] = 'raw'; } } 

最后,我实现了hook_theme_registry_alter来将模块的“模板”目录添加到主题registry中(基于http://drupal.org/node/1105922#comment-4265700 ):

 function MY_MODULE_NAME_theme_registry_alter(&$theme_registry) { $modulepath = drupal_get_path('module','MY_MODULE_NAME'); array_unshift($theme_registry['page']['theme paths'], $modulepath.'/templates'); } 

现在,当我将?raw = 1添加到视图的URLpath时,它将使用我的模块中指定的模板。

对于其他可能触及此页面的用户,如果您只是使用标准callback(不一定是视图),则很容易。 在您的callback函数中,不要返回在页面内渲染的代码,而是使用“打印”function。

例如:

 function mymodule_do_ajax($node) { $rval = <<<RVAL <table> <th> <td>Data</td> <td>Data</td> <td>Data</td> </th> <tr> <td>Cool</td> <td>Cool</td> <td>Cool</td> </tr> </table> RVAL; //return $rval; Nope! Will render via the templating engine. print $rval; //Much better. No wrapper. } 

干杯!

另一种方法,我发现非常方便的是添加一个页面callback函数不返回一个string的菜单项:

例:

 /** * Implementation of hook_menu. */ function test_menu(){ $items['test'] = array ( /* [...] */ 'page callback' => 'test_callback', /* [...] */ ); return $items; } function test_callback() { // echo or print whatever you want // embed views if you want // DO NOT RETURN A STRING return TRUE; } 

– 更新

使用exit();会好得多exit(); 而不是return TRUE; (见评论)。

嘿,这是另一种方式:

1)下载并安装Views Bonus Pack( http://drupal.org/project/views_bonus )2)创build一个视图显示“Feed”并使用样式“XML”(或者你认为更适合你需要的东西)。 3)如果您对标准XML输出不满意,可以通过调整视图的模板来更改它。 检查“主题”设置以获得有关此特定视图的替代模板名称的build议(因此,您仍然会将默认的XML输出留作将来使用)。

祝你好运! //瑞典NodeOne的Johan Falk

基于费城网页devise的答案(谢谢)和一些Googlesearch( http://drupal.org/node/957250 ),这里是在Drupal 7中为我工作,让select的页面显示没有模板:

 function pixture_reloaded_preprocess_page(&$vars) { if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) { $vars['theme_hook_suggestions'][] = 'page__vlozeno'; } } 

在D7中代替phptemplate,在函数的名字中必须有name_of_your_theme。 另外,我不得不在phpvariables中加上两个下划线__和文件名,但实际的模板文件名需要两个破折号 –

页面内容 – vlozeno.tpl.php:

 <?php print render($page['content']); ?> 

然而,输出仍然有很多包装和主题的CSS参考。 不知道如何输出完全unthemed的数据…

假设你在Drupal 6中,最简单的方法是在template.php放置一个phptemplate_views_view_unformatted_VIEWNAME调用(假设你的视图是未格式化的 – 如果是其他内容,则使用相应的主题函数)。 主题视图结果在这个主题调用然后,而不是像往常一样返回结果,打印它们并返回NULL 。 这将直接输出HTML。

PS – 确保清除您的caching(在/pipe理/设置/性能)看到这个工作。

可能有很多方法,但是,“最简单”可能只是设置自己的自定义主题,并使page.tpl.php只是空的,或一些随机的div

 // page.tpl.php <div id="page"><?php print $content ?></div> 

这个方法基本上只允许node.tpl.php显示(或任何drupal的窗体视图等),并且将是一个简单的方法来避免修改核心,或不得不改变主题registry,以避免显示page.tpl .php摆在首位。

编辑 :见评论

好吧,我玩了一下视图,它看起来像接pipe并构build它自己的“node.tpl.php”(某种意义上),以显示在“page.tpl.php”。 乍看之下,我的直觉是挂钩到theme_registry_alter()

当您查看视图页面时,您可以访问这里的信息以及page.tpl.phppath/文件。 因此我会做这样的事情:

 function modulejustforalteration_theme_registry_alter(&$variables) { if (isset($variables['views_ui_list_views']) ) { // not sure if that's the best index to test for "views" but i imagine it'll work // as well as others $variables['page']['template'] = 'override_page'; } } 

这应该允许你在当前的主题中使用“override_page.tpl.php”模板,你可以在其中删除任何你想要的东西(就像我上面的第一个答案)。

一些东西:

  • 正如我所说,不知道是否views_ui_list_views总是可以检查,但它听起来像应该设置,如果我们正在查看视图
  • 如果您愿意,可以更改page数组的theme paths (更改drupal将查找page.tpl.php的位置,而不是完全重命名)
  • 这个特定的视图看起来没有任何标识符,所以这个方法可能是“所有视图都会被剥离”的方法。 如果你只需要去掉一个特定视图的page.tpl.php,也许挂钩到template_preprocess_page()可能是一个好主意。

我喜欢Drupal模块。 这是另一种方式

将主题文件夹中的page.tpl.php复制到名为page-VIEWNAME.tpl.php的新文件中,其中VIEWNAME是视图的机器可读名称。

然后编辑page-VIEWNAME.tpl.php以适应。

还有http://drupal.org/project/pagearray这是一个通用的解决scheme

此外,@Scott Evernden的解决scheme是一个跨站点脚本(XSS)安全漏洞。 不要这样做。 阅读drupal.org上有关如何以安全的方式处理文本的文档http://drupal.org/node/28984

一个简单的方法来显示一个特殊的内容types的内容,你希望显示没有所有的page.tpl.php的东西:
将下面的代码片段添加到你的template.php文件中:

 function mytheme_preprocess_page(&$vars) { if ($vars['node'] && arg(2) != 'edit') { $vars['template_files'][] = 'page-nodetype-'. $vars['node']->type; } } 

添加一个page-nodetype-examplecontenttype.tpl.php到你的主题,比如你的page.tpl.php但没有你不想显示的print $content ,并在主体中print $content

如果我理解你的问题,你想要包含从DOCTYPE到</ HTML>的页面的所有HTML的节点。 我要做的是为这些节点创build一个内容types – “fullhtml”作为其机器可读的名称 – 然后为它创build一个名为node-fullhtml.tpl.php的节点模板。 您不能仅仅转储节点的内容,因为它们已经被HTML消毒了。 node.fullhtml.tpl.php的字面意思就是这样:

 echo htmlspecialchars_decode($content); 

那么你需要一种方法来覆盖标准page.tpl.php。 我认为你可以做的是在你的page.tpl.php顶部检查$ node的内容types,并保留它是否是fullhtml。 或者,在page.tpl.php中检查的node-fullhtml.tpl.php中设置一个全局variables。

我不是Drupal的专家,但是我就是这么做的。 我正在和袖口谈话,所以在细节上注意魔鬼。

我发现你已经离开了,并且自己创build了一个模块,所以这可能不再有帮助,但是很容易获得暴露rss提要的视图,这可能是获取内容的一种更简单的方法,特别是如果你想将其包含在其他网站上。

在D7上,你可以使用menu_execute_active_handler

 $build = menu_execute_active_handler('user', FALSE); return render($build);