Drupal 7 - template.php中的变量是什么决定了使用哪个页面模板?

时间:2011-04-11 21:36:59

标签: php templates drupal-7 drupal-themes

好的,这是交易:我正在构建一个有几个不同部分的Drupal网站。每个部分都是一个显示内容类型的视图。 (每个部分都有自己的内容类型)例如,我有一个指向显示内容类型?q=blog的{​​{1}}的视图。

所有部分看起来都有点不同。不像'网站内的网站'不同但足够不同,以至于他们不能全部使用相同的模板文件,并且每个都用CSS修改。每个部分都需要它自己的blog

不幸的是,AFAIK Drupal主题的.info文件只能为整个主题分配一个page.tpl.php或为每个节点分配page.tpl.php。这个网站上会有很多内容,所以设置Drupal为每个创建的节点创建一个新的相同page-node-####.tpl.php将会非常快速地无法管理。

要解决此问题,我将使用pathauto为每种内容类型创建别名。例如,内容类型page-node-####.tpl.php的所有节点都被赋予别名blog。修改?q=blog/[post title]以使用template.php用于别名以“blog”开头的任何网页。

其他人尝试过做这种事情,并创造了所描述的功能。不幸的是,我见过的所有人都是Drupal 6或者以下。我试过修改现有的没有成功。不过,到目前为止,我认为这是在正确的轨道上:

page-blog.tpl.php

我找不到function basic_preprocess_page(&$vars, $hook) { ... if( module_exists('path') ) { $alias = drupal_get_path_alias( $_GET['q'] ); $site_section = "blog"; if( strpos( $alias, $site_section ) === 0 ) { $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE = "/path/to/page-blog.php"; } } } 有谁知道它是什么?

也许我的网站结构糟糕。如果有人知道如何重组我的网站,以便我可以更容易地制作一个单独的部分主题,请分享如何!

万分感谢! $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE

编辑:也许我需要使用模板建议。有没有人知道用于设置它的函数或变量?

2 个答案:

答案 0 :(得分:3)

他们在D7中更改了此数组键的名称,我没有在任何地方看到它。经过一段时间的调试后,我终于弄明白了。您可以使用hook_preprocess_page()覆盖template.php中的主题模板,如下所示:

function myTheme_preprocess_page(&$vars) {
global $node;

if ($node->type == 'blog') {
     $vars['theme_hook_suggestions'] = array('my__blog_template'); // use my--blog-template.tpl.php, note '-' = '_'
}
elseif ($node->type == 'articles') {
    $vars['theme_hook_suggestions'] = array('article__node_template'); // use article--node-template.tpl.php
}
}

哦,不要忘记在更改template.php后刷新Drupal缓存。

答案 1 :(得分:0)

好的,我找到了: http://drupal.org/node/223440#comment-991840

$alias = drupal_get_path_alias($_GET['q']);
  if ($alias != $_GET['q']) {
    $template_filename = 'page';
    foreach (explode('/', $alias) as $path_part) {
      $template_filename = $template_filename . '-' . $path_part;
      $variables['template_files'][] = $template_filename;
    }
  }

归功于此功能转到用户mfb。

我遇到了很多麻烦所以我会在这里解释一下,以防有人发现它有用。

此功能在template.php中。它必须是<theme name>_preprocess_page函数的一部分。它的作用是获取别名,然后将其分解为一堆不同的组件。例如,如果您在包含别名?q=blog/blog-post-title的网页上,则会展开到blogblog-post-title。然后,它会将每个组件转换为模板建议的名称。它将每个模板建议放入template_files[]数组($variables[]数组内),以便页面现在有两个新的模板建议:

page-blogpage-blog-blog-post-title

模板建议是备用模板文件。在这种情况下,它们用于页面,但它们不一定必须是。您可以为您能想到的任何内容提供模板建议,包括块,节点等。不要让名称'模板建议'欺骗你。模板建议将在默认模板上使用,只要它们存在即可。我不知道为什么会这样命名。我认为它应该重命名。

现在,您已经设置了Drupal以查找指向别名的模板建议,然后创建一个新的模板文件,其中所有其余的都在您的主题中。在这种情况下,让我们说我想主题我的整个博客部分。在模板文件夹中,我应该使用我想要的布局创建一个名为page--blog.tpl.php的文件(注意--double hyphens--)。

Drupal将使用它可以找到的最具体的模板建议,所以如果你想要你可以让一篇博文看起来与网站的其他部分完全不同,只要你为它创建一个名为page--blog--blog-post-title的模板并放置它在你主题的模板目录中。 (再次注意双连字符。)