我想显示一个没有通常围绕它的页面模板的 Drupal 视图 - 我只想要视图节点的纯 HTML 内容。

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

我希望必须使用多个视图来执行此操作,因此让我快速轻松地设置这些视图的解决方案将是最好的 - 我不希望每次需要时都创建 .tpl.php 文件包括某处的视图。

有帮助吗?

解决方案

我一直在寻找一种通过ajax提取节点数据的方法,并为Drupal 6提出了以下解决方案。在实现下面的更改后,如果在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';
  }

}

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

<?php print $content; ?>

其他提示

根据Ufonion Labs的答案,我能够通过在我的主题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>页面内容,以便它可以嵌入到另一个页面中。

我知道这个问题已经得到解答,但我想添加自己的解决方案,该解决方案使用费城网页设计(PWD)答案的元素,并使用了欧文建议的hook_theme_registry_alter。使用此解决方案,您可以直接从自定义模块加载模板。

首先,我将raw.tpl.php添加到模块中新创建的“templates”文件夹中。 raw.tpl.php的内容与PWD的page-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,将我模块的'templates'目录添加到主题注册表中(基于 http:// drupal .ORG /节点/ 1105922#注释-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');
}

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

对于可能会点击此页面的其他人,如果您只是使用标准回调(不一定是视图),这很容易。在回调函数中,不要返回要在页面内呈现的代码,而是使用'print'函数。

例如:

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.
}

干杯!

我觉得非常方便的另一种方法是添加一个带有页面回调函数的菜单项,该函数不返回字符串:

示例:

/**
 * 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();代替return TRUE;(见注释)会更好。

嘿,这是另一种方法:

1)下载并安装Views Bonus Pack( http://drupal.org/project/views_bonus) 2)创建视图显示<!>“Feed <!>”;并使用style <!> quot; XML <!> quot; (或者你认为更符合你需求的东西)。 3)如果您对标准XML输出不满意,可以通过调整视图的模板来更改它。检查<!>“主题<!>”;设置以获取此特定视图的替代模板名称的建议(因此您仍将保留默认的XML输出以供将来使用)。

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

基于费城网页设计的回答(谢谢)和一些谷歌搜索(http://drupal.org/node/957250)这对我有用 德鲁帕尔7 要在没有模板的情况下显示所选页面:

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

在 D7 中,函数名称中必须包含 name_of_your_theme,而不是 phptemplate。另外,我必须在 php 变量中添加两个下划线 __ 和文件名,但实际的模板文件名需要两个破折号 --

页面内容--vlozeno.tpl.php:

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

然而,输出仍然有大量包装和主题的 CSS 引用。不知道如何输出完全没有主题的数据......

假设您在Drupal 6中,最简单的方法是在phptemplate_views_view_unformatted_VIEWNAME中进行template.php调用(假设您的视图未格式化 - 如果是其他内容,则列表说,使用适当的主题函数)。然后将视图结果主题化为此主题调用,而不是像往常一样返回结果,打印它们并返回NULL。这将直接输出HTML。

PS - 确保清除缓存(在/ admin / settings / performance)以查看此工作。

可能有很多方法可以解决这个问题,但是,“最简单的”可能只是设置您自己的自定义主题,并将 page.tpl.php 留空,或者一些随机的 div

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

此方法基本上只允许显示node.tpl.php(或任何drupal的表单视图等),并且是避免修改核心或必须更改主题注册表以避免显示page.tpl的简单方法.php 首先。

编辑: :看评论

好吧,我玩了一下视图,看起来它接管并构造了它自己的“node.tpl.php”(在某种意义上)以在“page.tpl.php”中显示。乍一看,我的直觉是会陷入其中 theme_registry_alter().

当您查看视图页面时,您可以访问此处的大量信息以及 page.tpl.php 路径/文件。因此我会做类似的事情:

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 始终可用于检查,但听起来如果我们正在查看视图,则应该设置它
  • 你可以改变 theme pathspage 如果您愿意,可以使用数组(更改 drupal 查找 page.tpl.php 的位置,而不是完全重命名)
  • 该特定视图似乎没有任何标识符,因此此方法可能是“所有视图都将被剥离”的方法。如果您需要仅针对特定视图剥离 page.tpl.php,也许可以挂钩 template_preprocess_page() 可能是一个更好的主意。

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

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

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

还有 http://drupal.org/project/pagearray ,这是一般解决方案...

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

显示您希望显示的特殊内容类型内容的简单方法,而不包含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,例如print $content,但不包含您不希望显示的内容以及正文中的<=>。

如果我理解您的问题,您希望拥有包含页面所有HTML的节点,从DOCTYPE到<!> lt; / HTML <!> gt;。我要做的是为这些节点创建一个内容类型 - <!> quot; fullhtml <!> quot;作为机器可读的名称 - 然后为它创建一个名为node-fullhtml.tpl.php的节点模板。您不能只是转储节点的内容,因为它们已经过HTML清理。 node.fullhtml.tpl.php就是这样:

echo htmlspecialchars_decode($content);

然后你需要一种方法来覆盖标准的page.tpl.php。我认为你可以做的是在你的page.tpl.php的顶部检查$ node的内容类型,如果它是fullhtml则挽救。或者,在page.tpl.php中检查的node-fullhtml.tpl.php中设置一个全局变量。

我不是Drupal专家,但我就是这样做的。我正在谈论袖口,所以请注意细节中的恶魔。

我看到你已经离开并自己制作了一个模块,所以这可能不再有用,但是很容易获得一个暴露rss feed的视图,这可能是获取内容的一种更简单的方法,尤其是如果您想将其包含在其他网站上。

在D7上,您可以使用 menu_execute_active_handler

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

jeroen的回答是在玩完之后为我做了什么。我有一个Drupal 7网站。

  1. 首先请确保将MY_THEME替换为您的主题名称。是的,很明显,但大多数新手都错过了。

  2. 我实际上已经有了function MY_THEME_preprocess_page(&$variables) {。不要重新创建该函数,但在使用}关闭它之前在函数末尾添加此代码。


  3. if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
      $variables['theme_hook_suggestions'][] = 'page__embed';
    }
    
    1. 我的功能$vars不是$variables,所以我也必须更新它。如果您考虑寻找它,那就很明显了。

我的第一个回答允许我仅在网络浏览器中调用节点时显示节点。然而,最终目标是使用iframe将drupal节点嵌入第三方站点。

自Drupal发布以来,默认阻止Core 7.50 iframe阻止Clickjacking

要仅使节点成功嵌入第三方站点,您还需要覆盖x帧默认设置。在template.php中添加以下内容后,一切都开始工作了

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top