您的位置:首页 > 其它

Drupal学习笔记

2008-12-07 01:18 302 查看

摘要

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"模板中的区域变量)

模板该如何定义?

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

模板中包括XHTML和PHP变量以及函数调用。模板中默认可用的PHP变量包括来自info文件中的区块变量,变量集中的变量($variables的键),模板中可用的函数包括模板引擎中的函数,核心框架函数(如theme.inc、common.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: