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

2021/01/07 05:22 · php ·  · 0评论

我想显示一个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.phphook_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)的答案元素,并使用了Owen提出的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,将模块的“模板”目录添加到主题注册表中(基于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');
}

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

对于可能访问此页面的其他人,如果您仅使用标准回调(不一定是视图),则这很容易。在回调函数中,而不是返回要在页面中呈现的代码,请使用“打印”函数。

例如:

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)创建一个Views显示“ Feed”并使用样式“ XML”(或者您认为更适合自己的东西)。3)如果您对标准XML输出不满意,可以通过调整视图模板来更改它。检查“主题”设置,以获取有关此特定视图的替代模板名称的建议(因此,您仍将保留默认的XML输出以供将来使用)。

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

根据Philadelphia Web Design的回答(谢谢)和一些谷歌搜索(http://drupal.org/node/957250),这是在Drupal 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 paths的的page,如果你喜欢(改变的地方Drupal将寻找page.tpl.php中的位置,而不是将其重命名共)阵列
  • 该特定视图似乎没有任何标识符,因此此方法可能是“所有视图都将被剥离”的方法。如果您只需要为特定视图剥离page.tpl.php,则也许挂接template_preprocess_page()可能是一个更好的主意。

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

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

然后编辑页面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为您的主题添加一个主题,例如您的主题,page.tpl.php但不要包含您不想显示的内容并包含print $content在体内。

如果我理解您的问题,则希望有一个节点,其中包含页面的所有HTML,从DOCTYPE到</ HTML>。我要做的是为这些节点创建一个内容类型-“ fullhtml”作为其机器可读名称-然后为其创建一个名为node-fullhtml.tpl.php的节点模板。您不能仅转储节点的内容,因为它们已被HTML清理。node.fullhtml.tpl.php实际上就是这样:

echo htmlspecialchars_decode($content);

然后,您需要一种方法来覆盖标准的page.tpl.php。认为您可以做的是在您页面的顶部。tpl.php检查$ node的内容类型,并确保它是否为fullhtml。或者,在node.fullhtml.tpl.php中设置page.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) {然后,不要重新创建该函数,而应在函数末尾添加此代码,然后再用关闭}


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. 我的函数$vars没有使用过$variables,所以我也必须对其进行更新。如果您认为要寻找,它再次显而易见。

我的第一个回答只允许我在Web浏览器中调用该节点时显示该节点。但是,这样做的最终目标是使用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');
 } 
}
本文地址:http://php.askforanswer.com/xianshiyigemeiyouyemianmobandedrupalshitu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!