当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?

Posted

技术标签:

【中文标题】当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?【英文标题】:How can I customize a specific node in Drupal 6 WHEN a custom template has already been applied to the node's content type? 【发布时间】:2012-02-15 21:10:37 【问题描述】:

[对于 Drupal 6] 假设我创建了一个名为“my_content_type”的内容类型。我可以通过创建“page-node-my_content_type.tpl.php”来覆盖整个内容类型的默认模板。但是,进一步自定义该内容类型的单个节点(例如节点 5555)的最佳方法是什么?

我尝试了以下方法,但没有成功:

page-node-5555.tpl.php page-node-my_content_theme-5555.tpl.php node-5555.tpl.php

这些都不起作用。他们都继续使用我原来的内容类型模板。

【问题讨论】:

我是否需要在 template.php 中添加一些内容? 【参考方案1】:

Drupal 的页面模板适用于建议系统。基于当前 URL,创建了一组可能的模板文件。它循环遍历数组(以相反的顺序)寻找存在的模板文件。它找到的第一个,它将使用。

drupal 的主题系统为您提供了修改模板建议的钩子。打开您的 template.php 并找到

function phptemplate_preprocess_page(&$vars) 

$vars 变量包含建议,特别是 $vars['template_files']

默认情况下,唯一可用的页面建议是

page.tpl.php page-node.tpl.php 页面节点-[node_id].tpl.php

据我所知,page-node-[node_type].tpl.php 默认情况下不起作用,因此您可能已经修改了 preprocess_page 模板以添加到此功能中。

但是,如果您想添加更具体的模板,您可以执行以下操作...

function phptemplate_preprocess_page(&$variables) 
  if ($variables['node']->type != "") 
    $variables['template_files'][] = "page-node-" . $variables['node']->type;
    $variables['template_files'][] = "page-node-" . $variables['node']->type . "-" . $variables['node']->nid;
  

这将允许模板建议的以下层次结构

page.tpl.php page-node.tpl.php 页面节点-[node_id].tpl.php page-node-[node_type].tpl.php page-node-[node_type]-[node_id].tpl.php

【讨论】:

谢谢。这样可行。关于如何仅针对节点的内容(而不是整个页面)的任何提示,例如 node.tpl.php?我应该使用 phptemplate_preprocess_node 吗?我希望它将我的主模板(page-node-my_content_type.tpl.php)应用于所有内容类型,包括相关页面。但是,我希望 Drupal 查看另一个文件的建议,以对单个节点 (5555) 的内容部分进行特定渲染。您提供的是自定义节点的整个模板,而不仅仅是内容部分。 忽略后续问题。使用 phptemplate_preprocess_node 函数可以满足我的需要。再次感谢。【参考方案2】:

在 Drupal 7 中,只需复制 page.tpl.php template 并将其重命名为

页面--节点--[node:id].tpl.php

清除缓存并开始调整..

【讨论】:

【参考方案3】: 函数 phptemplate_preprocess_page(&$variables) if ($variables['node']->type != "") $variables['template_files'][] = "page-node-" 。 $变量['节点']->类型; $variables['template_files'][] = "page-node-" 。 $variables['node']->type 。 “-”。 $variables['node']->nid;

此代码应该工作,因为 hook_preprocess_page() 没有传递任何节点信息。 hook_preprocess_node() 可以。因此,您可以轻松地创建自定义 node.tpl,但不能轻松地为特定节点创建自定义 page.tpl。并不是说我已经能够弄清楚:)

稍后...

在默认的 Drupal 中,page-node-NID.tpl.php 无需特殊编码即可工作。但是,在我的网站上,它无法正常工作,我使用以下代码使其工作:

/**
 * Implementation of hook_preprocess_page().
 */
function MYMODULE_preprocess_page(&$variables) 
  // Allow per-node theming of page.tpl
  if (arg(0) == 'node' && is_numeric(arg(1))) 
    $variables['template_files'][] = "page-node-" . arg(1);
  

【讨论】:

以上是关于当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?的主要内容,如果未能解决你的问题,请参考以下文章

flutter Set集合妙用

Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid

当自定义 collectionViewCell 中包含标签时,不会调用 didSelectItemAtIndexPath

无服务器错误,当自定义命名资源需要替换时,CloudFormation 无法更新堆栈

Drupal 将类添加到特定于节点类型的行

如何在自定义 Xcode 项目模板中创建或定义新目标