drupal 主题制作笔记

论坛: 
基本常识:
.info 文件是一个必需的文件:Drupal 必须包括它,才能看到主题。.info 文件告诉 Drupal 主题的内部名称。
template.php 文件中通常包含主题输出的所有条件逻辑和数据处理。您也可以使用 template.php 文件使主题的 .tpl.php 文件保持整洁。
page.tpl.php 就是负责排版的。
node.tpl.php 主题模板文件,这个node.tpl.php文件主要是输出content,比如文字列表,还是就是正文部分。
page.tpl.php是所有其它模板文件的祖宗,并为站点提供了整体的外观,其它模板文件被插入到了page.tpl.php
图像
block.tpl.php和node.tpl.php的插入由主题系统自动完成。
page.tpl.php文件的变量:$content包含了对node.tpl.php输出的调用、$sidebar_left包含了对block.tpl.php输出的调用。
(注意:如果你没有在page.tpl.php中使用区域变量($header, $footer, $sidebar_left,$sidebar_right),但是它们仍然会被系统自动创建。)
如果你需要创建一个定制的页面模板,你可以从复制你当前的page.tpl.php的开始,然后将它修改为你所需要的。
下面是在页面模板中可用到的变量:
$base_path:Drupal安装的基本路径。如果安装在根目录下,这是最简单的,他将默认为根目录。 
• $closure:返回hook_footer()的输出,它常在页面的底部使用。 
• $css:.返回一个所有css文件组成的数组结构,以添加到页面中去。使用$styles来返回$css数组的HTML版本。 
• $content:返回将要展示的HTML内容.例如,它可以包含一个节点,一组节点,管理接口的内容,等等。 
• $directory:主题所在的相对路径。例如themes/bluemarine 或者 sites/all/themes/custom/mytheme。你通常联合使用该变量和$base_path来构建你的站点主题的绝对路径:<?php print $base_path . $directory ?> 
• $feed_icons:返回该页面的RSS种子链接 
• $footer_message:返回页脚信息文本,在下面页面输入它:Administer ➤Site configuration ➤ Site information. 
• $head:返回放置在<head></head>部分的HTML。模块可以通过调用drupal_set_html_head()来向$head添加额外的比如RSS种子的纯文本。 
• $head_title:在页面标题中展示的文本,放在HTML <title></title>标签中。 
• $help: 帮助文本,大多数用于管理页面。模块可以通过实现hook_help()来提供该变量。 
• $is_front: 如果当前展示的为首页的话为真TRUE。 
• $language:站点展示时所使用的语言 
• $layout:这一变量允许你定义外观的不同类型的风格,而变量$layout的值依赖于启用的工具条(sidebars)的数量。可能的值包括:none, left,right, and both. 
• $logo: 指向logo图像的路径,在启用主题的主题配置页面定义。通常这样使用:<img src="<?php print $logo ?>" /> 
• $messages: 为表单或者其他信息返回的验证错误和正确的提示信息的HTML。它通常显示在页面的头部。 
• $mission: 返回站点使命文本,在 Administer ➤ Site configuration ➤ Site information中输入.只有当$is_front 为 TRUE时才可以使用。 
• $node:整个节点对象,当察看一个单独节点页面时可用。 
• $primary_links: 一个包含了一级链接的数组。在Administer ➤ Site building ➤ Menus中定义它们。通常$secondary_links通过函数theme('links')来定制输出的样式,如下所示:<?php print theme('links', $primary_links) ?> 
• $scripts: 返回向页面的<script>标签中所添加的HTML。 
• $search_box: 返回搜索表单的HTML。当管理员在启用的主题中的主题配置页面禁止展示搜索时,或者搜索模块禁用时,$site_slogan为空。 
• $secondary_links: 一个包含了二级链接的数组。在Administer ➤ Site building ➤ Menus中定义它们。通常$secondary_links通过函数theme('links')来定制输出的样式,如下所示:<?php print theme('links', $secondary_links) ?> 
• $sidebar_left:返回左边工具条的HTML,包含了属于该区域的所有区块的HTML。 
• $sidebar_right:返回右边工具条的HTML,包含了属于该区域的所有区块的HTML。 
• $site_name: 站点的名称。在Administer ➤ Site configuration ➤Site information中设置。当管理员在启用的主题中的主题配置页面禁止展示标语时,$site_ name为空。 
• $site_slogan: 站点的标语。在Administer ➤ Site configuration ➤Site information中设置。当管理员在启用的主题中的主题配置页面禁止展示标语时,$site_slogan为空。 
• $styles:返回连接到页面需要的CSS文件的HTML。CSS文件通过drupal_add_css()添加到$styles中去。 
• $tabs: 返回用于为节点展示诸如View/Edit的标签的HTML。 
• $title:主内容的标题,与$head_title不同。当察看一个单独节点视图页面时,$title就是节点的标题。当常看Drupal的管理员页面时,$title通常有菜单项来设置,菜单项对应于查看的页面。(参看第4章,关于菜单项的更多信息).
 
 
模板文件  node.tpl.php
节点模板负责控制一个页面内部的一片单独的内容的展示。而不是影响整个页面,节点模板仅影响page.tpl.php中的变量$content。
他们负责节点以teaser视图的方式展示(当多个节点在同一个页面列出时),或者以body视图的方式(当节点填充page.tpl.php中的整个变量$content并单独出现在他自己的页面)。节点文件中的变量$page,当为body视图方式时,它为真,当为teaser视图方式时,它为假。
模板文件node.tpl.php是一个处理所有节点视图的一般模板。如果你想要一个不同的模板,比如说,日志模板而不是论坛节点模板?你如何才能为特定节点类型创建一个专有的模板而不是全部都使用一个通用的模板?
  幸好节点模板提供了一个令人喜欢的粒度而没有超出盒子的范围。简单的将node.tpl.php复制一份并重命名为node-nodetype.tpl.php,这样PHPTempalte就可以选择这一个模板而不是通用模板。所以为blog实体定制输出样式时,仅需要简单的使用node-blog.tpl.php即可。你通过Administer ➤ Content management ➤ Content types创建的任何节点类型都可以以同样的方式拥有一个单独的模板文件。在节点模板中,你可以使用下面的变量:
• $content: 节点的主体部分,如果是一个分页显示的结果时,它为teaser。 
• $date:节点被创建的格式化日期。 
• $links: 与节点相关的链接,比如“read more” 或者“add comment.”模块通过实现hook_link()来添加额外的链接。 
• $name:创建该页面的用户名,连接到他的个人主页。 
• $node:整个节点对象和它的所有属性。 
• $node_url:该节点的持久化的URI。 
• $page: ,当为body视图方式时,它为真,当为teaser视图方式时,它为假。 
• $taxonomy.由节点的分类词语构成的一个数组
 • $teaser:布尔值,用来决定是否展示teaser。当它为假时,意味着节点采用body方式展示,为真时,表示以teaser方式展示。 
• $terms:与该节点相关的分类单词的HTML。每一个单词都指向他自己的分类单词页面。 
• $title:节点的标题。当在多个节点列表的页面这里有个链接指向该节点的主体视图。 
• $submitted: “Submitted by”文本。管理员可以配置这一信息的展示,在一个基于单个节点类型的主题配置页面配置。 
• $picture:用户图像的HTML,如果启用了图像并且设置了用户图像。
 
通常节点模板文件中的变量$content并不会像你期望的方式构建数据。当使用了一个扩展了节点属性的贡献模块比如CCK等字段相关的模块时,这尤其正确。
  幸运的是,PHPTemplate将整个节点对象传递给了节点模板文件。如果你在你的模板文件中的头部使用下面的调试语句并加载包含节点的页面,你将发现组成节点的所有属性。如果查看你浏览页面的源代码的话,读起来可能更容易一些。
<pre>
<?php print_r($node) ?>
</pre>
现在你可以看到组成节点的所有部分了,直接访问他们的属性,像期望的那样标识它们,而不是使用聚合的变量$content. 
警告:当直接格式化一个节点对象时,你也必须负责你站点的安全。
 
模板文件block.tpl.php
区块在Administer ➤ Site building ➤ Blocks中列出,并且由block.tpl.php提供的标识包装。如果你对区块不熟悉的话,可以参看第9章以获得更多信息。像页面模板和节点模板文件一样,区块系统使用了一个建议的层次来查找包裹了区块的模板文件。该层次如下所示:
block-modulename-delta.tpl.php
block-modulename.tpl.php
block-region.tpl.php
block.tpl.php
 
在上面的序列中,modulename是实现了该区块的模块的名称.例如,区块“Who’s Online”由模块user.module实现。由站点管理员创建的区块都指向区块模块。如果你不知道那个模块实现了给定的区块,通过使用一些PHP调试,你可以找到所有的原始信息.通过在你的block.tpl.php的头部键入下面一行代码,你将打印出在当前页面启用的每个区块的整个区块对象。
<pre>
<?php print_r($block); ?>
</pre>
如果你查看浏览页面的源代码的话,这会更容易读些。下面是区块“Who’s Online”所展示的:
stdClass Object
(
[module] => user
[delta] => 3
[theme] => bluemarine
[status] => 1
[weight] => 0
[region] => footer
[custom] => 0
[throttle] => 0
[visibility] => 0
[pages] =>
[title] =>
[subject] => Who's online
[content] => There are currently ...
)
现在你得到了该区块的所有的细节了,你可以非常容易的构建一个或多个如下所示的区块模板文件这依赖于你所想要指向的范围:
block-user-3.tpl.php // Target just the Who's Online block.
block-user.tpl.php // Target all block output by user module.
block-footer.tpl.php // Target all blocks in the footer region.
block.tpl.php // Target all blocks on any page.
 
下面是在区块模板文件中你可以使用的变量:
• $block:整个区块对象。
• $block_id:一个整数,当生成一个区块时,递增,同时区块模板文件被调用。
• $block_zebra: 当$block_id递增时,该变量不断的在“odd” and “even.”之间变换。
 
模板文件:comment.tpl.php
模板文件comment.tpl.php为评论添加修饰。它不像节点那样可以容易的将日志评论和论坛评论区分开来。可以这样做,但是必须使用代码完成,并且好好的钻研一下函数phptemplate_variables()。下面是使用评论模板文件时可使用的变量:
 
• $author: Hyperlink author name to the author’s profile page, if he or she has one.
• $comment: Comment object containing all comment attributes.
• $content: The body of the comment.
• $date: Formatted creation date of the post.
• $links: Contextual links related to the comment such as “edit, “reply,” and “delete.”
• $new: Returns “new” for a comment yet to be viewed by the currently logged in user and
“updated” for an updated comment. You can change the text returned from $new by
overriding theme_mark() in includes/theme.inc. Drupal doesn’t track which comments
have been read or updated for anonymous users.
• $picture: HTML for the user picture. You must enable picture support at Administer ➤
User management ➤ User settings, and you must check “User pictures in comments” on
each theme’s configuration page for enabled themes. Finally, either the site administrator
must provide a default picture or the user must upload a picture so there is an image
to display.
• $submitted: “Submitted by” string with username and date.
• $title: Hyperlink title to this comment.