Drupal学习笔记

摘要

Drupal协会今天宣布,Drupal赢得了Packt出版社2008开源CMS大奖中的两项桂冠-全球年度最佳开源CMS大奖和最佳PHP开源CMS大奖.这意味着Drupal连续两年赢得了Packt出版社的全球开源CMS大奖.另外,drupal社区的贡献者Earl Miles,在这周一获得了开源CMS MVP称号.Drupal成为了08年度开源CMS大奖的最大赢家.

Drupal Framework Structure

Drupal 框架由Core, Module, Theme三个部分组成。

 

Theme作为Drupal 的表示层,通过函数和模板输出用户所能看到的页面, 包括页面的样式。 Theme将程序的表示层完全分离了出来,更换一个Theme就能够很轻易地将整个网站“改头换面”。

 

主题文件包括info配置,图片,CSS,模板文件(*.tpl.php),引擎文件(template.php),设置文件(settings.php)。模板文件负责进行内容输出,不进行复杂的逻辑处理,只需要包含xHTML标签和PHP变量,每个.tpl.php文件负责特定一块数据的输出,它也可以处理多个.tpl.php文件;引擎文件(template.php)中主要进行数据处理,包括对tpl.php文件中的PHP变量进行预处理以及定制内容输出函数(输出样式或内容)、覆写主题函数或者其他任意函数。

Drupal Features

 

 

 

开发模板

Info文件:定义区块,样式(区块定义的内部名称将自动转化为"page.tpl.php"模板中的区域变量)

 

模板该如何定义?

模板文件的组织结构是怎么?哪些模板是必须的?模板的命名有什么约束?

 

模板中包括XHTMLPHP变量以及函数调用。模板中默认可用的PHP变量包括来自info文件中的区块变量,变量集中的变量($variables的键),模板中可用的函数包括模板引擎中的函数,核心框架函数(如theme.inccommon.inc中的函数)。

 

变量集中常用的变量:$head_title, $base_path, $front_page, $search_box, $site_name, $site_slogan, $title

模板引擎该如何定义?

函数在模板引擎文件中定义。可以通过theme_get_setting() theme_get_settings()获取配置文件中的变量,也可以使用全局变量。

 

< includes/theme.inc>, < includes/common.inc>有一些经常被用到的函数。例如:

t();

l();

———————————————————————————————————————

预处理函数

预处理函数仅适用于模板形式的主题钩子.它的主要作用是设置模板文件(tpl.php)中所用到的变量。在预处理器(Preprocessor)中,一般涉及不到普通的主题函数。默认的预处理器及其执行顺序

 

1.         template_preprocess

-这个是由内核提供的,也是始终存在的。这里声称的变量在所有的模板钩子中都可以使用.

2.         template_preprocess_hook

-实现了主题钩子的内核或者模块提供该处理器。特定于某个钩子的变量,通常首先在这里生成。

3.         moduleName_preprocess

-不要将这个与前面的预处理器混淆了。对于那些最初没有实现钩子的模块,它允许影响变量集。它将在所有的钩子中运行。

4.         moduleName_preprocess_hook

-和第3个一样,但是特定于某个钩子。

5.         engineName_engine_preprocess

-主题引擎的预处理器。适用于所有的钩子。

6.         engineName_engine_preprocess_hook

-主题引擎的另一个预处理器,特定于单个钩子。

7.         engineName_preprocess

-这是第一个可以在主题内部使用的预处理器。命名方式为,主题所用引擎名称+预处理器名。适用于所有的钩子。

8.         engineName_preprocess_hook

-这个和第7个一样,但是特定于单个钩子。

9.         themeName_preprocess

-命名方式为:主题名+预处理器名。适用于所有的钩子。

10.     themeName_preprocess_hook

-与前者一样,但是特定于单个钩子。

 

注意:

l  一般推荐在基主题的预处理器中使用引擎名称(7 & 8)。这有利于代码在主题之间的迁移,同时有利于在Drupal.org上发布代码片断。

l  只有在子主题(sub-themes)中才使用主题名称(9 & 10)。这将减少潜在的重名冲突,在PHP中是不允许重名的。

l  为了识别你主题的预处理器,与钩子相关联的模板必须位于主题内部。如果存在默认的模板的话,将其拷贝到你的主题下面,并清空注册表。

l  函数中都没有返回值,所有的变量都是通过引用传递的,前面都有符号“&,比如&$var

 

这个例子,来自于实现了钩子"foo"的模块:

 

 

<?php

function template_preprocess_foo(&$variables) {

  $variables['foo_list'] = array(

    'list item 1',

    'list item 2',

    'list item 3',

  );

}

?>

 

 

在主题的预处理器中添加变量集:

 

 

<?php

function drop_preprocess_foo(&$variables) {

  // Do not do this unless you mean to:

  $variables['foo_list'] = array('list item 4');

 

  // Instead do this:

  $variables['foo_list'][] = 'list item 4';

}

?>

 

 

在模板文件中使用的变量,就是$variables的键。所以,在上面的例子中,在模板文件中可用的变量就是$foo_list

 

引用:

http://zhupou.cn/theme-guide-drupal-6/preprocess-functions

http://drupal.org/node/173880#convert-type

http://api.drupal.org/

———————————————————————————————————————

使用drupal_set_content可以将内容手工的添加到区域中.例如, drupal_set_content('header', 'Welcome!')将文本'Welcome!'添加到页首区域.下面是一个更有用的例子,构建所有评论的总结并将其放到"right"区域.

<?php

function drop_preprocess_comment(&$variables) {

 

  // Setup a few variables.

  $comment = $variables['comment'];

  $title = l(

    $comment->subject,

    comment_node_url(),

    array('fragment' => "comment-$comment->cid")

  );

  $new_marker = $comment->new ? t('new') : '';

  $by_line = t('by') .' '. theme('username', $comment);

 

  // Form the markup.

  $summary = '<div class="comment-sidebar">';

  $summary .= "<span class=/"title/">$title $new_marker</span>";

  $summary .= "<span class=/"credit/">$by_line</span>";

  $summary .= '</div>';

 

  // Set the comment into the right region.

  drupal_set_content('right', $summary);

}

?>

 

注意通过这个函数设置内容,发生在区块区域回显以前,它是这样调用的template_preprocess_page > theme_blocks > drupal_get_content 将前缀"drop"改为你主题的名字.更多信息参看预处理器

 

引用:http://zhupou.cn/theme-guide-drupal-6/manually-assigning-content-to-regions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值