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时,它将使用我的模块中的指定模板.
对于可能会访问此页面的其他人,如果您只是使用标准回调(不一定是视图),这很容易.在回调函数中,使用'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)
干杯!