欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

添加和操作模板变量

shiping1 的头像

在一个预处理函数是 global 一个变量 在后续的预处理函数中 可以通过global取到
例如在
function lanyulu_preprocess_node(&$vars)
{
    global $aaa;
    $aaa ="AAAAAAAA"; 
}

function lanyulu_preprocess_comment_wrapper(&$vars) {
     global $aaa;
     此时就可以取到 $aaa的值
}



添加和操作模板变量

现在的问题变成:如果你制作自己的模板文件并控制变量传递给他们,那你怎么操纵或添加变量传递给页面模板和节点模板?

注意:变量只汇总并传递给以模板文件实现的主题化内容,而不能传递给以主题函数实现的主题化内容。

每次调用一个模板文件时,都要经过一系列的预处理函数。这些函数负责收集变量,并传递给适当的模板文件。让我们继续看看我们的面包屑例子。首先,让 我修改sites/ all/themes/custom/greyscale/breadcrumb.tpl.php,用一个变量作为面包屑的分隔符。

1
2
3
4
5
<?php if (!empty($breadcrumb)): ?><br>
<span class="breadcrumb"><br>
<?php print implode(' '. $breadcrumb_delimiter .' ', $breadcrumb) ?><br>
</span><br>
<?php endif; ?><br>

那我们怎么为$breadcrumb_delimiter变量赋值呢?一种方法是建立一个模板。 我们建立sites/all/modules/custom/crumbpicker.info文件:

1
2
3
4
5
; $Id$<br>
name = Breadcrumb Picker<br>
description = Provide a character for the breadcrumb trail delimiter.<br>
package = Pro Drupal Development<br>
core = 6.x<br>

模块文件
sites/all/modules/custom/crumbpicker.module的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?php<br>
// $Id$<br>
/**<br>
* @file<br>
* Provide a character for the breadcrumb trail delimiter.<br>
*/<br>
/**<br>
* Implementation of $modulename_preprocess_$hook().<br>
*/<br>
function crumbpicker_preprocess_breadcrumb(&$variables) {<br>
$variables['breadcrumb_delimiter'] = '/';<br>
}<br>

在管理>站点构建>模块激活这个模块后,你的面包屑应该像这样Home / Administer
/ Site building。

前面的例子显示了模块怎样为一个模板文件的变量赋值。但是有更简单的方法来实现,那就是使用template.php。我们可以在template.php 中写一个函数来设置面包屑的分隔符。添加下面的代码到template.php 文件中:

1
2
3
4
5
6
7
/**<br>
* Implementation of $themeenginename_preprocess_$hook().<br>
* Variables we set here will be available to the breadcrumb template file.<br>
*/<br>
function phptemplate_preprocess_breadcrumb(&$variables) {<br>
$variables['breadcrumb_delimiter'] = '#';<br>
}<br>

这比创建一个模块理容易,坦率地说,这种创建新模块来为已有模块的模板提供变量的方式是最好的;模块通常不是用来干这事的。现在,我们已有一个模块为某个变量赋值,同时template.php中有一个函数也为这个变量赋值。哪那一个会被使用呢?

事实上,所有预处理函数以一定的秩序执行,每个可覆盖的函数或变量都已经在前面的预处理函数中定义。在前面的例子中,面包屑分隔符将是 #,因 为phptemplate_preprocess_breadcrumb()将在 crumbpicker_preprocess_breadcrumb()后执行,
因此它给$breadcrumb_delimiter赋值将覆盖此前变量的任何值。作者:预处理函数的执行顺序如图 8-6。

对于Greyscale主题的面包屑进行主题定制,预处理函数的执行顺序(按由前向后依次调用)如下:

template_preprocess()

template_preprocess_breadcrumb()

crumbpicker_preprocess()

crumbpicker_preprocess_breadcrumb()

phptemplate_preprocess()

phptemplate_preprocess_breadcrumb()

greyscale_preprocess()

greyscale_preprocess_breadcrumb()

因此greyscale_preprocess_breadcrumb()是最后被调用的,将覆盖前面的任何赋值。当主题的所胡这些函的都执行,那 这个过程似乎是浪费时间的。如果你有这样的想法,那是正确的。但当模板注册表被重建时,Drupal就已经判断出哪了些函数已实现、并只调用哪一个函数。

来自 http://www.cuitu.net/book/tian-jia-he-cao-zuo-mo-ban-bian-liang

普通分类: