1

I want to set custom php variables that can be used throughout my drupal theme (html.tpl.php, page.tpl.php etc.) I need the variables set based on the $title of the node. I'm not an expert on how Drupal works, the moduling and hooks, and I just need to know the simplest/easiest way to accomplish this. I keep reading about implementing some sort of hook in the template.php file where you can set variables, but I've been unsuccesful with everything I've tried.

So, basically, how would you accomplish this:

  1. Get $title of Node
  2. Set variables that will be passed along into theme files (for example, to do basic things like: if($title == 'news_page') { $siteSection = "news"; } )
  3. Have $siteSection be available to use in theme files

Any help would be great.. thanks!

4

1 回答 1

2

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

例如,如果您想在用户登录时向他们显示一条消息,您可以使用hook_user_login.

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

当用户登录时,Drupal 会查找所有以“_user_login”结尾的加载函数并运行它们。如果这个函数在一个启用的模块中,它已经被加载,所以它也会被运行。

如果你想$site_section在你的文件中使一个名为的变量可用page.tpl.php,你可以挂钩到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. 通过添加&before $vars,我们将被允许修改在此函数之外使用的值。

switch 语句将让我们有效地测试多个值的页面标题。节点标题的值可能包含大写字母、小写字母和符号,因此为避免区分大小写不匹配,我们将标题转换为小写并仅测试(符号仍将在标题中,但)。在 switch 语句之后,我们将$site_section本地值的值设置到引用的$vars数组中以供 in 使用page.tpl.php

但是,如果您只是打算将网站分成几个部分以进行主题化,那么还有其他方法可以实现。几个月前我对类似情况的回答可能会有所帮助。

于 2012-09-02T19:46:13.147 回答