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

cee*_*yoz 36 php drupal drupal-views

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

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

我希望必须通过一些视图来做到这一点,所以一个让我快速轻松地设置它们的解决方案将是最好的 - 我不希望每次需要时都不必创建.tpl.php文件在某处包含一个视图.

小智 49

我正在寻找一种通过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';
  }

}
Run Code Online (Sandbox Code Playgroud)

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

<?php print $content; ?>
Run Code Online (Sandbox Code Playgroud)


jer*_*oen 19

基于Ufonion实验室的答案,我能够通过在我的主题template.php中实现两者hook_preprocess_page,完全删除Drupal 7中页面内容周围的所有HTML输出hook_preprocess_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';
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<?php print $page; ?>
Run Code Online (Sandbox Code Playgroud)

并且page--embed.tpl.php:

<?php print render($page['content']); ?>
Run Code Online (Sandbox Code Playgroud)

现在,当我打开一个节点页面时,例如http://example.com/node/3,我像往常一样看到完整的页面,但是当我添加response_type参数时,例如http://example.com/node/ 3?response_type = embed,我获得<div>了页面内容,因此它可以嵌入到另一个页面中.


小智 7

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

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

<?php print $content; ?>
Run Code Online (Sandbox Code Playgroud)

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

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

最后,我实现了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');
}
Run Code Online (Sandbox Code Playgroud)

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


rin*_*ogo 5

对于可能会访问此页面的其他人,如果您只是使用标准回调(不一定是视图),这很容易.在回调函数中,使用'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.
}
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 这是迄今为止最简单的解决方案.谢谢. (2认同)