2012-09-02 58 views
1

我想设置自定义的PHP变量,可以在我的drupal主题(html.tpl.php,page.tpl.php等)中使用我需要基于$节点的标题。我不是Drupal工作方式,模块和钩子方面的专家,我只需要知道最简单/最简单的方法来完成此任务。我一直在阅读关于在template.php文件中实现某种钩子的地方,你可以在其中设置变量,但是我已经试过了我所做的所有事情。为Drupal 7主题文件设置PHP变量

所以,基本上,你将如何做到这一点:节点的

  1. 得到$标题
  2. 将被一起传递到主题文件(例如设置变量,做基本的东西,如:如果( $标题== 'news_page'){$ siteSection = “新闻”;})
  3. 有$ siteSection可在主题文件中使用

任何帮助将是巨大的..谢谢!

回答

2

在Drupal为主题模板(.tpl.php文件)中的页面构建HTML之前,它会运行预处理“钩子”。钩子基本上是一个函数的命名约定,可以让模块和主题覆盖或“挂钩”到Drupal核心流程上。

例如,如果您想在登录时向用户显示消息,则可以使用hook_user_login

function MODULENAME_user_login(&$edit, $account) { 
    drupal_set_message("Welcome, ". $account->name); 
} 

当用户登录时,Drupal的查找,在“_user_login”结束所有加载功能,运行他们。如果此功能位于启用的模块中,则它已加载,所以它也会运行。

如果要在page.tpl.php文件中创建一个名为$site_section的变量,可以将其挂接到template_preprocess_page。这是一个主题钩子,所以名称有点不同,但功能几乎相同。要从主题中调用此钩子,您需要在主题目录中创建一个名为template.php的文件。里面template.php,我们将添加:

<?php 
function THEMENAME_preprocess_page(&$vars){ 
    switch (drupal_strtolower($vars['node']->title)) { 
    case "about page": 
    $site_section = "about"; 
    break; 
    case "news page": 
    case "news page1": 
    case "news page2": 
    $site_section = "news"; 
    break; 
    default: 
    $site_section = "none"; 
    break; 
    } 

    $vars['site_section'] = $site_section; 
} 

<?php是用来告诉服务器把所有的程序代码的PHP。然后我们声明我们的钩子函数,意图将Drupal的页面变量数组加载到名为$vars的局部变量中。通过在$vars之前添加&,我们将被允许修改在该函数外部使用的值。

switch语句将让我们有效地测试多个值的页面标题。节点标题的值可能包含大写字母,小写字母和符号,因此为了避免区分大小写的不匹配,我们将标题转换为小写字母,然后仅测试它(符号仍然在标题中,尽管)。在switch语句之后,我们将我们的$site_section本地值的值设置为参考$vars阵列以用于page.tpl.php

但是,如果您只是打算为了主题目的而将网站分成多个部分,还有其他方法可以实现此目的。 My answer to a similar situation a few months ago可能会对您有所帮助。