用于 drupal 视图的自定义 page.tpl.php

Posted

技术标签:

【中文标题】用于 drupal 视图的自定义 page.tpl.php【英文标题】:custom page.tpl.php for a drupal view 【发布时间】:2010-12-02 17:56:47 【问题描述】:

如何为特定视图创建自定义 page.tpl.php

我说的不是视图本身的样式,而是呈现该视图的页面。

谢谢。

@Keith Morgan - 这是页面。

【问题讨论】:

该方法取决于您使用的视图显示类型。例如是页面还是块? 【参考方案1】:

根据 Allartk 的解决方案 在 Drupal 7 模板.php 中:

function <theme>_preprocess_page(&$variables) 
    if (($views_page = views_get_page_view()) && $views_page->name === "galleries") 
      $variables['theme_hook_suggestions'][] = 'page__views__galleries';
    

然后在您的主题目录中,创建页面--views--galleries.tpl.php 文件。 清除 drupal 缓存和模板应该可以工作。 我使用“画廊”作为示例视图名称。

【讨论】:

不需要这个,用drupal 7 is page--path-to-view.tpl.php @Duncanmoo - Amir 方法的优势在于,如果您关心命名约定,您可以明确地看到模板包含一个视图(就像我们有 page--node-mynode.tpl.php 一样实例)。我喜欢将类似于上面的内容与使用视图的机器名称结合起来,例如,如果我的视图存在于此处/那里/myview,我可以拥有页面--view--myview.tpl.php,而不是标准页面--这里--那里--myview.tpl.php【参考方案2】:

您可以创建模板文件来主题化视图输出的几乎任何方面。在您的情况下,您想为页面显示创建自定义模板。

在视图设计器中,单击基本设置中的主题链接。您将看到一些模板文件命名选项,具体取决于您是否要为整个视图(例如,views-view--example--page.tpl.php)、每一行(例如,views-view-fields--example --page.tpl.php) 等等。

将您想要自定义的相应模板从 /sites/all/modules/views/theme 复制到您的主题并根据需要进行自定义。

创建自定义模板文件后,您可以返回视图设计器主题链接以确保它正在被使用。您的模板应加粗。

希望这会有所帮助。

【讨论】:

当视图处于活动状态而不是视图本身时,OP 不是在询问页面主题吗?当你有一个带有页面显示的视图时,最顶层的模板仍然来自views-view.tpl.php,它不包含任何页面元素。这仍然会被填充到任何处于活动状态的页面模板中。【参考方案3】:

有一些documentation on template suggestions,您可能对page.tpl.php suggestions 感兴趣。如果是页面视图,您可以使用路径建议。因此,如果您的视图位于http://www.example.com/photos,则page.tpl.php 文件将命名为page-photos.tpl.php

【讨论】:

【参考方案4】:

有一个类似的问题,通过在我的主题的模板文件夹中放置一个 .tpl.php 来解决这个问题。 drupal 7中视图页面显示的命名约定是page--path-to-view.tpl.php

【讨论】:

【参考方案5】:

在一个 drupal 7 主题中,我在 template.php 中添加了一个模板建议:

function sovon_preprocess_page(&$variables)    
if(views_get_page_view())   
    $variables['theme_hook_suggestions'][] = 'page__view';      


请参阅http://api.drupalize.me/api/drupal/function/views_get_page_view/7 和http://drupal.org/node/223440#custom-suggestions 了解更多信息。

【讨论】:

我喜欢你的简单回答,但我想我会在此基础上再接再厉。我也意识到它已经有两年多了,但这可能会有所帮助。所以,我所做的就是将函数的内部更改为: if($view = views_get_page_view()) $variables['theme_hook_suggestions'][] = 'page--view-'.$view->name;它的作用是获取视图名称并查找前缀为“page--view-”和您的视图名称的任何模板文件。这样您就可以扩展它,而无需为每个视图编写 if 语句。【参考方案6】:

假设视图是一个页面,您可以在预处理中使用page_manager_get_current_page() 的结果来确定您的视图是否处于活动状态,然后采取适当的步骤(添加主体类、添加模板建议等)。

【讨论】:

【参考方案7】:

使用 sillygwailo 的建议,我得到了这个非常适合我的工作:

function YOUR-THEME-NAME_preprocess_page(&$vars) 

 //allow template suggestions based on url paths.  
 $alias = drupal_get_path_alias(str_replace('/edit','',$_GET['q'])); 
 if ($alias != $_GET['q'])  $suggestions = array();
 $template_filename = 'page'; 
 foreach (explode('/', $alias) as $path_part) 
 $template_filename = $template_filename . '-' . $path_part; 
 $suggestions[] = $template_filename;
  
 $alias_array = explode('/', $alias);
 $variables['template_files'] = $suggestions; 

然后,如果您的视图位于 www.example.com/photos ,请在您的主题目录中创建一个 page-photos.tpl.php,drupal 将使用它作为您的模板。

【讨论】:

【参考方案8】:

如果检查的答案不起作用(因为它不适合我),您可以创建一个页面--(urlname).tpl.php,然后根据您的需要设置您的主题样式。然后您可以通过以下几种方式之一导入您的视图...

       print render($page['content']);  

$view = views_get_view('viewname'); print $view->execute_display('default', $args);

$args 只是一个数组,可以为空..你可以完全不使用它

【讨论】:

以上是关于用于 drupal 视图的自定义 page.tpl.php的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Drupal 视图模块实现 node-VIEWNAME.tpl.php?

如何替换从 Drupal 中的模块加载的 page.tpl.php?

PHP Drupal page.tpl.php导航块

带有自定义模板暴露过滤器的 Drupal 7 视图不显示

PHP Drupal 5.x page.tpl.php模板

Drupal 视图中的自定义排序