代码之家  ›  专栏  ›  技术社区  ›  ceejayoz

显示不带页面模板的Drupal视图

  •  36
  • ceejayoz  · 技术社区  · 16 年前

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

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

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

    17 回复  |  直到 6 年前
        1
  •  49
  •   Philadelphia Web Design    16 年前

    我正在寻找一种通过Ajax提取节点数据的方法,并为Drupal6提供了以下解决方案。在实现下面的更改之后,如果在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; ?>
    
        2
  •  19
  •   jeroen    13 年前

    根据Ufonion实验室的答案,我可以通过实现这两种方法完全删除Drupal7中页面内容周围的所有HTML输出。 hook_preprocess_page hook_preprocess_html 在my themes template.php中,如下所示:

    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 ,我像往常一样看到完整的页面,但是当我添加响应类型参数时,例如 http://example.com/node/3?response_type=embed 只有 得到 <div> 使其嵌入到另一页中。

        3
  •  7
  •   SwarmIntelligence    12 年前

    我知道这个问题已经被回答了,但是我想添加我自己的解决方案,它使用费城网页设计(pwd)答案的元素,并使用hook_theme_registry_alter,正如欧文建议的那样。使用此解决方案,可以直接从自定义模块加载模板。

    首先,我将raw.tpl.php添加到模块中新创建的“templates”文件夹中。raw.tpl.php的内容与pwd的page-ajax.tpl.php相同:

    <?php print $content; ?>
    

    接下来,我在模块中以与pwd相同的方式实现了hook_预处理页面(除了我修改了$_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/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到视图的url路径,它将在我的模块中使用指定的模板。

        4
  •  5
  •   rinogo    16 年前

    对于可能访问此页面的其他人,如果您只是使用标准回调(不一定是视图),这很容易。在回调函数中,不要返回要在页面内呈现的代码,而是使用“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.
    }
    

    干杯!

        5
  •  3
  •   Nabil Kadimi    11 年前

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

    例子:

    /**
     * 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; (见评论)。

        6
  •  2
  •   Itangalo    15 年前

    嘿,还有另一种方法:

    1)下载并安装VIEWS奖励包( http://drupal.org/project/views_bonus ) 2)创建一个视图显示“feed”,并使用样式“xml”(或者您认为更适合您需要的东西)。 3)如果您对标准XML输出不满意,可以通过调整视图的模板来更改它。请检查“主题”设置,以获取有关此特定视图的可选模板名称的建议(这样您仍然可以保留默认的XML输出以供将来使用)。

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

        7
  •  2
  •   Ufonion Labs    14 年前

    基于费城网页设计的答案(谢谢)和一些谷歌搜索( 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中,函数名中必须有主题的名称_,而不是phptemplate。另外,我必须在php变量中用文件名加上两个下划线,但是实际的模板文件名需要两个破折号。--

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

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

    然而,输出仍然有很多包装和主题的CSS引用。不知道如何输出完全未选边的数据…

        8
  •  2
  •   Alfred redcoder    12 年前

    假设你在Drupal6,最简单的方法是 phptemplate_views_view_unformatted_VIEWNAME 拜访 template.php (假设您的视图是未格式化的-如果它是其他东西,比如说,使用适当的主题函数)。对该主题调用中的视图结果设置主题,然后打印并返回结果,而不是像通常那样返回结果。 NULL . 这将直接输出HTML。

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

        9
  •  1
  •   Owen Ryan Doherty    16 年前

    可能有很多方法可以解决这个问题,但是,“最简单的”可能只是设置自己的自定义主题,让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() 也许是个更好的主意。
        10
  •  1
  •   xyzzy    16 年前

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

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

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

        11
  •  1
  •   greggles    16 年前

    也有 http://drupal.org/project/pagearray 这是一个通用的解决方案…

    另外,@scott evernden的解决方案是一个跨站点脚本(xss)安全漏洞。别那么做。阅读drupal.org上关于如何以安全方式处理文本的文档 http://drupal.org/node/28984

        12
  •  1
  •   stealthyninja michkra    13 年前

    一种显示特殊内容类型的内容的简单方法,您希望不显示 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 在体内。

        13
  •  0
  •   Adam Bellaire    16 年前

    如果我理解您的问题,您希望节点包含页面的所有HTML,从doctype到</html>。我要做的是为这些节点创建一个内容类型——“fullhtml”作为其机器可读的名称——然后为它创建一个名为node-fullhtml.tpl.php的节点模板。您不能只是转储节点的内容,因为它们已经经过了HTML清理。node.fullhtml.tpl.php字面意思是:

    echo htmlspecialchars_decode($content);
    

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

    我不是Drupal专家,但我就是这么做的。我是在胡说八道,所以要注意细节上的恶魔。

        14
  •  0
  •   Andrew    16 年前

    我看到你已经把自己变成了一个模块,所以这可能不再有帮助,但是让一个视图公开一个RSS提要是相当容易的,这可能是获取内容的一种更容易的方法,特别是如果你想把它包含在一个不同的站点上。

        15
  •  0
  •   Alan Bondarchuk    10 年前

    在D7上可以使用 menu_execute_active_handler

    $build = menu_execute_active_handler('user', FALSE);
    return render($build);
    
        16
  •  0
  •   eisbehr    6 年前

    杰罗恩的回答是,我玩过之后做了什么。我有一个Drupal7网站。

    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 ,所以我也必须更新它。很明显,如果你想找的话。
        17
  •  0
  •   Wilhelm Stoker    6 年前

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

    自从Drupal发行以来 Core 7.50 iframe is by default blocked to prevent Clickjacking

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

    function MY_THEME_page_alter($page) {
    
     if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
       header_remove('X-Frame-Options');
     } 
    }