当自定义模板已应用于节点的内容类型时,如何在 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 中自定义特定节点?的主要内容,如果未能解决你的问题,请参考以下文章
Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid
当自定义 collectionViewCell 中包含标签时,不会调用 didSelectItemAtIndexPath