不爱其亲,而爱他人者,谓之悖德。

Drupal使用指南

技术文档 84389浏览 0评论

/***
说明:
本文参考了网上的一些文章,删除和修改了其中一些比较老的或者不准确的内容,再结合自己使用的实际情况、心得和体会,写作而成。算是对这段时期使用Drupal的一个总结吧。当然,还有许多的特性和功能等待我去发掘,这将是一个漫长而有趣的过程!
自由的风
2007.11-27
***/
1. Drupal 的功能特点
Drupal应该翻译成什么呢?觉得还是翻译为“水滴”比较好。Drupal这个词其实是荷兰语Druppel的英语发音,而Druppel在荷兰语里面是Drop也就是水滴的意思。Drupal的编写者最初选择这个词实在是意外,他本来想注册一个名为“Dorp” 的域名,Dorp在荷兰语里是“小村庄”的意思,英语里其实也有这个名词,但是他一不小心犯了个错误,于是就注册成了Drop,于是也就有了后来的 Drupal。呵呵,所以汉语翻译成“水滴”还是蛮贴切的,听起来也不错了。
有的人把Drupal当作是blog系统,我一开始也是这样认为的,其实这只是Drupal的一方面的应用,Drupal是一个功能强大的content manage system(cms),在功能设计上它仿照了phpnuke,xoops等的模块化方式,界面上仿照了blog模式。这个程序以极少的代码实现了非常强大的功能。很多人用“神奇” 两个字来形容它,它是一个完全开放源代码的程序,所以吸引了众多PHP爱好者的目光,很多PHP高手参与了它的开发行列中来了,开发速度非常块,几乎两个月出一个新版本,modules和skins也越来越多。从官方站点有时上千人的在线情况就可以看出它的受欢迎程度。

2. Drupal 安装
在安装Drupal前,你需要在服务器上先搭建一个PHP+MySQL环境。专业网站一般是安装LAMP(Linux+Apache+MySQL+PHP)。
环境的搭建可参考如下文章:
     Windows下php服务器配置过程:http://www.loosky.net/?q=node/25
     Linux下Lamp服务器的配置:http://www.loosky.net/?q=node/337

简单的安装步骤:
目前的版本的安装过程已经是非常简化了,跟其他大多数系统的安装差不多,运行网址/install.php按步骤操作即可。但是只有英文操作界面,中语言包只有等安装完成后进入管理才能导入。
+ 下载Drupal
+ 将Drupal上传到web服务器的目录内
+ 运行网址/install.php按步骤操作,填入数据库等信息
这里要注意的就是安装完成后,会新建一个用户,这第一个用户是具有最大权限的,认真对待就行。

3. Drupal 中文语言包安装
Drupal 的设计比较科学,不仅扩展性好,安装语言包也非常方便。
+ 先下载官方中文语言包
网址:http://drupal.org/files/projects/zh-hans-5.3.0.tar.gz
解压后得到一个zh-hans.po 文件,这就是中文语言包。
+ 让Drupal加载国际化模块
administer->modules->locale选择打勾,这样管理界面才会出现语言包管理界面
+ 导入中文语言包
administer->localization,选择import导入其他语言包,选择刚刚解压的zh-hans.po文件,然后选择import to:chinese simplified。
+ 选择中文为默认语言
装完语言包后,就会发现现在系统有两个语言包,一个是默认的英文,一个就是刚刚我们导入的中文。我们只要启动中文语言包,并设置成默认就行,系统的页面马上就会变成中文。

4. Drupal的模块
模块化是Drupal的一个特色,极大的方便了Drupal的扩展和灵活定制的能力。Drupal模块的安装使用也很方便,只要将相应文件复制到modules目录下,就可以在‘管理-设置’里面方便地开启使用了。
Drupal的模块分为基本功能模块和功能增强模块。基本功能模块是Drupal安装包里自带的功能模块,扩展功能模块则需要到[http://drupal.org/project/Modules]下载。基本功能模块又分为固定启用的基本功能模块和可选用的基本功能模块,固定启用的模块在Drupal安装后即自动启用。这里有一个比较详细的介绍:http://bbs.chinahtml.com/74310
模块的安装请根据自己的需要,如果安装太多的模块可能会对服务器产生更大的压力。

== 固定启用的模块 ==
- block:用于支持区块的实现
- filter:用于处理内容过滤以便于显示。
- Node:允许内容被提交到站点并显示。
- system:用于处理管理员对站点的设置。
- user:用户管理及注册系统。
- watchdog:生成并管理系统日志。

== 基本功能模块 ==
- aggregator:将drupal变成一个在线的rss订阅器。支持RSS和RDF格式。开启后可定时扫描新闻源自动更新内容(需要crontab支持)。
- blog:这个模块让会员发表个人blog,使Drupal变成一个多人blog系统。
- blog api:支持XML-RPC blog接口,允许用户通过第三方应用程序发表blog。
- book:允许用户合作写作手册。
- Color:允许用户更改特定主题的配色方案。
- comment:开启blog或文章的评论回复功能,并且可以定制评论的权限以及每一篇文章是否允许评论。
- contact:启用个人和站点联络表。。
- drupal:让用户使用一个 Drupal ID 跨站登录。
- forum:论坛
- help:在线帮助。很多标准模块和功能的帮助都可以在‘管理-帮助’里找到。
- legacy:为升级版本提供向下兼容的接口。
- locale:开启多语言支持,汉化drupal必须开启的模块。
- menu:允许管理员定制,添加新的导航菜单。
- path:支持URL别名,便于管理记忆。
- ping:在发表新文章的时候通知其他网站。
- poll:开启投票功能。
- profile:支持可配置的用户信息。
- search:启用全站关键词搜索。
- statistics:站点访问的统计日志。
- taxonomy:开启目录分类支持
- throttle:站点节流控制机制。当站点流量过大网络阻塞时可以通过节流设定自动关闭相应模块功能以保证访问响应。
- tracker:跟踪用户的最新发布。
- upload:支持上传文件。

== 功能增强模块 ==
Drupal的功能增强模块太多了,并且每天都在不断增加,这里只列出小站使用的一些模板,更多的简介请看(http://bbs.chinahtml.com/74310):
- archive:支持存档内容的管理与浏览,实现blog常见的日历查询功能,可通过区块显示。
- Attachment:支持上传附件,可以用来替代Drupal自带的upload模块。不同节点的附件将分开放置,避免了文件重名的问题。需要先安装Filemanager模块。
- Database Administration:提供数据库管理功能。管理员可以通过此模块在drupal界面进行数据库查询/修改/删除等功能。
- FCKeditor:支持FCKeditor输入格式。
- Filemanager:此模块为其它模块提供文件管理接口,其本身并无实际功用。Attachment模块就是建立在Filemanager模块基础上的。
- IMCE:一个小型的图片上传管理模块,可以与FCKeditor等编辑器结合使用。
- Paging:给文章增加分页功能
- Poormanscron:通过用户的浏览来调用cron任务,使不能设置crontab的站点也能简单地解决cron运行的问题。

5. Drupal 模块安装/卸载
Drupal 已经自带了许多基本功能模块,在完成 Drupal 的安装后,开启这些模块就可以了。如果你需要功能扩展模块,则需要到http://drupal.org/project/Modules下载并安装这些模块。
安装步骤:
+ 下载模块包
+ 解压缩
+ 把模块文件上传到 Drupal 的 modules 目录中
+ 有些模块可能需要运行mysql文件创建表
+ 在“管理->站点创建->模块"中开启这个模块即可
卸载步骤:
+ 先在“管理->站点创建->模块"中停用这个模块
+ 在“管理->站点创建->模块->卸载"中卸载这个模块即可,这个步骤并不是必须的,因为有的模块不需要这个过程。

6. Drupal 的主题风格
== 模板引擎 ==
Drupal支持三种模板引擎:xTemplate、PHPTemplate、wgSmarty。PHPTemplate是Drupal自带的模板引擎。其他两个模板引擎需要到http://drupal.org/project/Themes/engines 下载。其中基于 PHPTemplate 的主题风格非常多。
模板引擎的安装方法:
+ 下载 模板引擎
+ 将解压后的模板引擎目录拷贝到Drupal的themes/engines目录

== 主题风格 ==
“主题”是Drupal站点的基本外貌和感觉。有时一个特定的站点会安装不止一个的主题。如果站点管理员提供了多个主题,你可以为你的帐号选择你喜欢的默认主题。
Drupal的官方站点提供了许多主题风格,具体见:http://drupal.org/project/Themes

= Drupal 主题风格安装 =
Drupal 主题风格的安装步骤:
+ 在http://drupal.org/project/Themes下载新的主题风格
+ 阅读主题风格包中的 README 和 INSTALL 文件,看该主题风格包的安装是否需要一些特殊的步骤
+ 检查一下主题风格需要的模板引擎是否已安装
+ 将主题风格上载到Drupal的themes目录中
+ 通过"管理->主题"启用该主题风格,并将其设置为默认风格

= Drupal 界面定制 =
当 Drupal 站点安装好后,有许多方法对站点界面进行个性化的设置和定制:
+ 安装主题风格:主题风格控制了站点的外观和感受,你可以在网上下载Drupal的主题风格,并在"管理->主题"中启用这些风格。
+ 创建你自己的主题风格:如果你不想用别人预先做好的主题风格,而想为自己的站点打造一个完全不一样的外观,你可以通过开发自己的主题风格来达到这个目的。主题风格的开发人员应具备HTML/CSS知识,如果要开发复杂的主题,则需要懂得PHP。
+ 定制导航菜单:页面顶部和底部的菜单可以在"管理->站点创建->菜单"中进行定制,主链接和备用链接中可以直接编写HTML代码。如果主链接为空,Drupal将根据你安装的模块自动建立导航菜单。每个主题风格可以定义不同的导航菜单。如果是基于PHPTemplate引擎的主题风格,导航菜单的定义方式是为每个菜单进行定义。
+ 定制文字串:可以通过"管理->本地化->管理字符串"来定制本地语言的文本字符串,Drupal中几乎所有的文本字符串都可以修改。
+ 定制区块:区块是显示在网页侧栏的小块内容,通过定制区块可以进行一些个性化的设置。

 

  

 

7. 创建自己的主题风格
== 创建一个新的PHPTemplate主题风格 ==
+ 在Drupal的themes目录下创建一个主题目录,例如mytheme。
+ 在自己的主题目录下创建一个 page.tpl.php 文件这是唯一的一个必需创建的文件,它重载了theme('page')函数,并输出整个页面的内容,包括额外的装饰、页头、页签、内容小块、侧栏、页脚等你所想在页面上显示的所有东西。
+ 你还可以创建其他文件重载其他函数
- block.tpl.php:重载theme('block')函数:控制区块的风格
- box.tpl.php:重载theme('box')函数:控制页面主区域的容器(盒子)的风格
- comment.tpl.php:重载theme('comment')函数:控制评论的风格
- node.tpl.php:重载theme('node')函数,控制节点的风格
- PHPTemplate包含有这些模板文件的例子,可以将这些例子拷贝到theme/mytheme目录中进行修改

== 为不同的节点类型定制不同的模板 ==
假设你希望不同类型的节点具有不同的显示风格,只需要将"node.tpl.php"文件拷贝为"node-节点类型.tpl.php"文件,并对该文件进行定制。

例如:
+ node-story.tpl.php:稿件风格
+ node-blog.tpl.php:Blog风格
+ node-forum.tpl.php:论坛风格
+ node-page.tpl.php:静态页面风格
+ node-weblink.tpl.php:网页导航的风格
+ node-image.tpl.php:像集的风格
+ ......

= 网页布局:Page.tpl.php =可参见:http://drupal.org/node/11816
Page.tpl.php是负责网页布局的模板,这个模板控制整个页面的主框架。在这个模板里,有以下变量可供使用:
+ head_title: 页面标题。
    用法举例:<head><title><?php print $head_title ?></title> ...</head>
+ language: 站点所使用的语言。
    用法举例:<html lang="<?php print $language ?>" ...>
+ site: 站点名称
+ head: drupal_get_html_head() 函数产生的HTML代码
    用法举例:<head><title>...</title><?php print $head ?></head>
+ onload_attribute: Onload tags to be added to the head tag, to allow for autoexecution of attached scripts.
    用法举例:<body <?php print theme("onload_attribute"); ?>>
+ directory: 主题所在的目录,例如:themes/spreadfirefox 或 themes/box_grey
+ logo: logo图片的路径。在“管理->主题->配置”中可以对这个变量的值进行设置
    用法举例:
      <?php if ($logo) : ?>
      <div id="site-name">
         <a href="<?php print url() ?>" title="Home"><img src="<?php print $logo ?>"/></a>
      </div>
      <?php endif; ?>
+ site_name: 用于header的站点名称
+ site_slogan: 网站的口号
    用法举例:
        <?php if ($site_slogan) : ?>
            <div id="site-slogan"><span><?php print($site_slogan) ?></span></div>
        <?php endif;?>
+ search_box: True(1) if the search box has been enabled.
+ search_url: URL the search form is submitted to.
+ search_button_text: 搜索按钮的文字
+ search_description: 搜索按钮的描述文字
     这四个变量的用法举例:
         <?php if ($search_box) { ?>
            <form action="<?php print $search_url; ?>" method="post" id="search">
            <div>
              <input class="form-text" type="text" size="15" value="" name="edit[keys]" id="keys" />
              <input class="form-submit" type="submit" id="submit" value="<?php print $search_button_text ?>" />
            </div>
            </form>
         <?php } ?>
+ title: 标题,different from head_title, as this is just the node title most of the time.
     用法举例:
         <?php if ($title != ""): ?>
             <h1 id="title"><?php print $title ?></h1>
         <?php endif; ?>
+ primary_links (array): An array containing the links as they have been defined in the phptemplate specific configuration  block.
+ secondary_links (array): An array containing the links as they have been defined in the phptemplate specific configuration block.
     这两个变量的用法举例:
         <?php if ($primary_links) : ?>
            <ul id="primary">
               <?php foreach (array_reverse($primary_links) as $link): ?>
               <li><?php print $link; ?></li>
               <?php endforeach; ?>
            </ul>
         <?php elseif ($secondary_links) : ?>
            <ul id="secondary">
               <?php foreach (array_reverse($secondary_links) as $link): ?>
               <li><?php print $link; ?></li>
               <?php endforeach; ?>
            </ul>
         <?php endif; ?>
+ breadcrumb: 路径导航的HTML代码。
     用法举例:
         <?php if ($breadcrumb != ""): ?>
            <div id="breadcrumbs">
            <?php print $breadcrumb;?>
             <span class="breadcrumb"> &raquo; <?php if ($title != ""): print ucwords($title); endif; ?></span>
            </div>
         <?php endif; ?>
+ tabs: 页签的HTML代码.
     用法举例:
         <?php if ($tabs != ""): ?>
                <?php print $tabs ?>
         <?php endif; ?>
+ messages: 状态或错误信息的HTML代码, 一般显示在页面的顶部.
     用法举例:
         <?php if ($messages != ""): ?>
             <div id="message"><?php print $messages ?></div>
         <?php endif; ?>
+ layout: This setting allows you to style different types of layout ('none', 'left', 'right' or 'both') differently,depending on how many sidebars are enabled.
+ help: 动态帮助文本
     用法举例:
         <?php if ($help != ""): ?>
            <p id="help"><?php print $help ?></p>
         <?php endif; ?>
+ styles: Required for stylesheet switching to work. This prints out the style tags required.
     用法举例:<head>...<?php print $styles ?></head>
+ mission: 站点使命.
+ is_front: 当前显示的页面是否是网站首页
+ sidebar_left: 左侧栏的HTML代码。该HTML代码是由theme_blocks("left")产生的。
+ content: 内容的HTML代码
+ sidebar_right: 右侧栏的HTML代码。该HTML代码是由theme_blocks("right")产生的。
     这三个变量的用法举例:
        <?php if ($sidebar_left != '') { ?>
           <div class="leftcolumn sidebar" id="sidebar-left">
              <div class="leftpadding">
                 <?php print $sidebar_left; ?>
              </div>
           </div>
        <?php } ?>
        <?php if ($sidebar_right != '') { ?>
           <div class="rightcolumn sidebar" id="sidebar-right">
              <div class="rightpadding">
                 <?php print $sidebar_right; ?>
              </div>
           </div>
        <?php } ?>
        <div class="centercolumn">
            <div class="centerpadding">
               <?php print($content) ?>
            </div>
        </div>
+ footer_message: 显示在页面底部的信息,在"管理->设置->通用设置->底部信息"中可以对该变量的值进行设置。
+ closure: Needs to be displayed at the bottom of the page, for any dynamic javascript that needs to be called once the page has already been displayed.
      这两个变量的用法举例:
         <div id="footer" class="footer">
            <?php if ($footer_message) : ?>
              <p><?php print $footer_message;?></p>
            <?php endif; ?>
            <?php print $closure;?>
         </div>
+ node:

== page.tpl.php设计建议 ==
目前比较好的网页设计模式是DIV+CSS模式,为了方便布局,建议采用以下方法设计模板:
+ 将整个页面的内容放入到一个id为wrapper的DIV中
+ 在wrapper中包含三个DIV,其class分别为header、columns、footer,header和footer用于显示页面的头部信息和尾部信息,columns显示页面的内容。
+ columns中包含三个DIV,其class分别为leftcolumn、rightcolumn、centercolumn,leftcolumn和rightcolumn是左右侧栏,分别用于显示左右侧栏的各区块。centercolumn用于显示节点的内容。
页面的总体架构如下:
<div id="wrapper">
<div class="header" id="header">
...
</div>
<div class="columns">
<div class="leftcolumn sidebar" id="sidebar-left">
...
</div>
<div class="rightcolumn sidebar" id="sidebar-right">
...
</div>
<div class="centercolunmn">
...
</div>
</div>
<div id="footer" class="footer">
...
</div>
</div>

CSS对布局的控制如下:
div {margin: 0px;}
.header {margin: 0px;}
.columns {margin: 0px;}
.leftcolumn {float: left; margin: 0; width: 150px;} /*其宽度应等于centercolumn的margin-left*/
.rightcolumn {float: right; margin: 0px; width:160px;} /*其宽度应等于centercolumn的margin-right*/
.centercolumn {margin-right: 160px; margin-left:150px;}
.footer {margin: 0px;}

= node.tpl.php =
该模板用户控制node的显示。
在该模板内可以使用以下变量:
+ $title : node的标题
+ $node_url : Link to node.
+ $terms : HTML for taxonomy terms.
+ $name : Formatted name of author.
+ $date : Formatted creation date.
+ $sticky : 该node是否在主页上置顶
+ $picture : HTML for user picture, if enabled.
+ $content : 该node的内容, teaser if it is a summary.
+ $links : 该node的相关操作或链接
+ $taxonomy (array) : array of taxonomy terms.
+ $node (object) : The node object.
+ $main : True if the node is appearing in a context, like the front page, where only the teaser should be shown.
+ $page : True if the node is being displayed by itself as a page.
+ $submitted : Translated text, if the node info display is enabled for this node type.

布局
+ 为整个node建立一个class为"node"的DIV中,对于置顶的node,其class为"node sticky"
     <div class="node<?php print ($sticky) ? " sticky" : ""; ?>">...</div>
+ node的内容放在class为"content"的DIV中。
     <div class="content"><?php print $content ?></div>
+ node的相关链接放在一个class为"links"的DIV中
     <?php if ($links): ?><div class="links"><?php print $links ?></div><?php endif; ?>

  

 

8. 其他
= 开发者模块 =
Drupal 提供了一个特殊的模块:Devel 模块。
这个模块是为开发者和网站系统管理员提供的。该模块能在每个页面的末尾输出页面执行的所有数据库查询,并且提供每个数据库查询用掉的时间。该模块还提供了许多其它的好工具。
这个模块可以从以下地址下载:http://drupal.org/project/devel

= 编写自己的区块 =
区块是显示在网页侧栏的小块内容。Drupal的许多模块都提供了模块内置的区块。可以通过“管理->站点创建->区块”启用这些区块。
通过“管理->站点创建->区块->添加区块”还可以增加自己的区块。区块的编写有3种不同的方法:Filtered HTML、PHP code、Full HTML。

= 提供搜索引擎友好的URL地址 =
Drupal提供了一个path模块,该模块能定义URL地址的别名。这些别名能大大提高地址的可读性,能帮助搜索引擎更有效地对站内内容进行索引。每个页面可以创建多个别名。

== 批量别名设置 ==
Drupal里允许批量为URL设置别名。通过这个功能,可以提供完全不一样的URL地址,甚至可以为不同的语言提供完全本地化的地址。
批量修改别名的方法是在sites/default/settings.php中添加一个conf_url_rewrite函数(4.6.x),如果是Drupal 4.7.x,则函数名是custom_url_rewrite。
以下例子将所有的"node/$node_id"类型的URL修改为"display/$node_id":
<?php
// 用于 Drupal 4.6.x 的例子
function conf_url_rewrite($path, $mode = 'incoming') {
if ($mode == 'incoming') { // 从客户端来的URL
return preg_replace('!^display/(\d+)$!', 'node/\1', $path);
}
elseif ($mode == 'outgoing') { // 到客户端去的URL
return preg_replace('!^node/(\d+)$!', 'display/\1', $path);
}
}
?>

<?php
// 用于 Drupal 4.7.x 及更高版本的例子:
function custom_url_rewrite($type, $path, $original) {
// 如果已经为该地址设置了别名,则不作进一步处理
if ($path != $original) {
return $path;
}
if ($type == 'source') { // 从客户端来的URL
return preg_replace('!^display/(\d+)$!', 'node/\1', $path);
}
elseif ($type == 'alias') { // 到客户端去的URL
return preg_replace('!^node/(\d+)$!', 'display/\1', $path);
}
}
?>

= 站内搜索 =
Drupal提供了search模块,用于对站内内容进行搜索。搜索引擎会自动为站内内容建立索引。在"管理->设置->搜索"能看到搜索状态。搜索引擎在建立索引时需要用到cron功能。

== cron设置 ==
cron用于定期执行一些工作,例如清除日志、建立索引等。
Drupal已经把要定期执行的工作写在cron.php中了,并且在scripts目录下提供了一个cron-lynx.sh脚本,只需将其配置到crontab中就行了

== 让自己开发的模块具备搜索功能 ==
如果要让自己开发的模块支持Drupal的搜索引擎,只需要实现search钩子就行了:hook_search($op='search',$keys=null)
search钩子的文档见:http://drupaldocs.org/api/head/function/hook_search

9. 小站所做的一些修改:
== 设置403和404错误页面 ==这个还是很有用地!!
Drupal的页面错误信息是简明扼要的。您可能希望这些信息对于用户显得更友好些,通过一下步骤,您可以自定义它们:
   1. 创建两个节点,分别用于403和404错误页面。
   2. 记下这两个节点的id号。
   3. 现在在“管理”>>“设置”>>“错误设置”中,将403错误和404错误两处设置分别输入相应的路径。例如,为403错误创建的节点的id号为129,则在“默认禁止访问(403错误)页面”文本框中输入“node/129”。

== 配置站点的错误报告 ==
错误报告,记录Drupal、PHP和SQL错误记录的地方。在一个正式服务器上,建议只将错误写入日志;而在一个正在测试的服务器上,建议选择将错误同时输出到屏幕(当然错误仍将写入日志),这对于您及时发现错误、调试错误会很有帮助。您可以设定日志的保持时间,当超过这个时间后Drupal会自动将旧日志删除。注意,这需要已被正确设置的crontab(yoursite.com/cron.php)

== 显示文章分类和文章数目的实现 ==
新建一个区块,添加如下PHP代码:
<?php
if (user_access('access content')) {
$result = db_query("SELECT d.tid, d.name, COUNT(*) AS count FROM {term_data} d INNER JOIN {term_node} USING(tid) INNER JOIN

{node} n USING (nid) WHERE n.status = 1 GROUP BY d.tid,d.name ORDER BY d.weight ASC,d.name");
$items = array();
while ($category = db_fetch_object($result)) {
   $items[] = l($category->name .' ('. $category->count .')','taxonomy/term/'. $category->tid);
}
return theme('item_list', $items);
}
?>

== 在文章中显示上一篇下一篇 ==参见:http://drupal.org/node/45050
在template.php中添加如下函数:
function next_prev($current_nid, $type, $button_type, $label, $prepend_text=NULL, $append_text=NULL)
{  
$tid = db_result(db_query(db_rewrite_sql("SELECT tid FROM {term_node} tn INNER JOIN {node} n ON tn.nid = n.nid WHERE tn.nid =

$current_nid")));
  switch ($button_type)
  {
     case 'next': 
        $sort= 'DESC';
        $case = '< ';
        break;
     case 'prev': 
        $sort = 'ASC';
        $case = '> ';
        break;
     default:
        return NULL;
        break;
   }
   $sql = "SELECT n.nid, n.title FROM {node} n INNER JOIN {term_node} t ON n.nid = t.nid ";
   $sql .= "INNER JOIN {term_data} rON t.tid = r.tid WHERE n.type = '". $type ."' AND n.nid ". $case;
   $sql .= $current_nid ." AND r.tid = ". $tid ." AND n.status = 1 ORDER BY nid ". $sort;
   $result = db_fetch_array(db_query(db_rewrite_sql($sql)));
   if (!$result) {            
         return NULL;
   }
   else {
       return $prepend_text.l($label, 'node/'. $result['nid'], array('title' => $result['title'])).$append_text;  
   }
}
在node.tpl.php中适当位置添加:
<?php
    if($page!=0 && $node->type=='story')
    {
        $previous_node_link = next_prev($node->nid, $node->type, 'prev', t('Previous'), '&lt;&lt; ', NULL);
        $next_node_link = next_prev($node->nid, $node->type, 'next', t('Next'), NULL, ' &gt;&gt;');
        print '<div class="entry-meta">';
        if($previous_node_link && $next_node_link)
        {
            print $previous_node_link.' | '.$next_node_link;
        }
        else if($previous_node_link)
        {
            print $previous_node_link;
        }
        else if($next_node_link)
        {
            print $next_node_link;
        }
        print '</div>';
    }
?>

转载请注明:自由的风 » Drupal使用指南

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址