Drupal 7 如何为特定的内容类型覆盖 page.tpl?

15

我想为特定的内容类型覆盖page.tpl.php文件。

我尝试了以下这些方法,但都无法正常工作:

  1. page--article.tpl.php
  2. page--node--article.tpl.php
  3. page--node--type--article.tpl.php
  4. page--node-type--article.tpl.php
  5. page--type--article.tpl.php

但是当我通过编号指定特定节点,即page--node--8.tpl.php时,它可以正常工作。

我认为应该使用page--article.tpl.php,但不知道为什么它不起作用。

请告诉我是否命名错误以及如何调试此类问题。我听说可以使用Devel模块,但对此一无所知。欢迎在正确方向上给我一点提示。

先行致谢

8个回答

19

你必须确保你的模板能够处理这个...我在这里得到了一个对我有用的代码片段:

http://drupal.org/node/1089656#comment-4426790

<?php
function themeName_preprocess_page(&$vars, $hook) {
  if (isset($vars['node'])) {
    // If the node type is "blog_madness" the template suggestion will be "page--blog-madness.tpl.php".
    $vars['theme_hook_suggestions'][] = 'page__'. $vars['node']->type;
  }
}
?>

4
请问您是否已经记得清除缓存(在管理界面的“站点配置”-“性能”中),以便Drupal“知道”您的新文件并使用它而不是默认文件?
详情请参见此处关于清除缓存数据的说明
此外,您可能需要添加一个预处理钩子(我自己没有使用过D7,只用过5/6,我认为这有些改变)。此篇发表在Drupal Stack Exchange上的文章似乎提供了更多详细信息。

Drupal代码主题建议没有节点类型模板建议。因此,您必须将主题建议函数添加到您的template.php中(请参见上面的链接):) - AKS
如果不是基本页面,您需要覆盖节点模板文件。如果您要覆盖整个节点,无需在template.php中执行建议。 - chadpeppers

3

我刚遇到了同样的问题。

node--recipe.tpl.php

不是

page--recipe.tpl.php

当然,这是针对名为“recipe”的内容类型。


1

经常清除缓存...

前往 /admin/config/development/performance 并点击清除缓存按钮。如果您对后端结构进行了更改并且更改未按预期显示,那么这应该是您首先要做的事情。

否则,您几乎做对了

  1. page--content-type-name.tpl.php

这将允许您为内容类型模板设置主题。


0

步骤1. 创建一个内容类型,例如:我的内容类型是“fullwidthpage”

步骤2. 在模板文件夹中复制 page.tpl.php 并将其重命名为 page--fullwidthpage.tpl

步骤3. 将以下代码添加到 template.php 文件中

function <strong>YOUR_THEME_NAME_HERE</strong>_preprocess_page(&$variables) {
  if (isset($variables['node']->type)) {
    // If the content type's machine name is "my_machine_name" the file
    // name will be "page--my-machine-name.tpl.php".
    $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }
}

不要忘记更改YOUR_THEME_NAME_HERE

0

如果内容类型不是基本页面,您需要覆盖特定节点模板。请查看以下链接:

http://api.drupal.org/node/19080

在此页面下复制/粘贴 node.tpl.php 页面中的项目,并覆盖您想要的内容。您可以通过 $node 特别访问节点。

您的文章模板应该是:

node--article.tpl.php

一旦创建完成,请确保清除缓存以确保其正常工作。


0

我知道这是一个老问题,但如果其他人来到这里,我在Drupal 7中覆盖内容类型的方法是这样的:

node--contenttype.tpl


0

所以根据你想要实现的目标,可能有一些 CSS 技巧可以帮助你。

例如,要覆盖特定节点类型的任何 CSS 规则,只需记住该节点类型的页面将具有一个 body 类名为 "node-type-[TYPE]"(例如:.node-type-article

然后你可以按如下方式覆盖 CSS:

body.node-type-article #selector {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接