最佳实践指南

这一部分列出一些关于站点设置、管理的实用指南,可以帮助你更好更有效地管理你的站点。这些只是一般推荐,并非必须照做不可,你可以根据自己的需要,选择适合自己的的方案。

Case Study:一个新手的首次Drupal建站经历(不断更新中)

以前一直用joomla和xoops做了几个网站,虽然感觉不错,但总觉得灵活性不够。最近在恰逢Drupal推出5.0新版本之际挤进了Drupal用户群,真切感受了传说中的“Drupal灵活强大”,获得了全新的CMS使用感觉。在测试网站玩了两周Drupal RC版本之后,正好赶上5.0正式版推出,于是迫不及待地开始搭建网站FEA-Tips(原打算用Xoops搭建的)。

写这个Case study的目的,主要是给象我一样的新手一个抛砖引玉、快速入门的作用,因为相对于其它CMS来说,Drupal的学习周期要长一点,了解Drupal的工作方式需要一点时间和实践操作经验。如果您是Drupal高手,就别看本文了,免得见笑,呵呵。

我的网站FEA-Tips刚刚建立,内容还很少。前段时间一直等待我想要用的模块升级到与5.0匹配。现在,想要的5.0模块基本有了,也完成了网站基本框架的搭建,剩下的就是添加内容和细节完善了。这个网站是个技术交流平台(对象主要是我的QQ群和Yahoo group里面的人),网站内容的组织和安排重要性高于网站页面形式。,因此目前我还没有对主题花时间修改,仅用Drupal自带的主题。内容组织和浏览方面的要求也决定了我选择模块的原则。

因此,我在这个Case study里面仅描述如何组合某些模块快速建立一个注重文字内容的网站。如果您想做其它类网站,或者想获得更高级的Drupal建站知识,这个Case Study可能会让您失望。我写本文的目的只是让新手从无到有快速建立起Drupal建站理念,减少必要的自我探索时间。另外,我也想给自己学习Drupal和建站做个记录。

1、使用的模块列表

除了安装了Drupal V5.0以外,我还安装和使用了以下模块:

  • CCK
  • CCK Field Permissions
  • Content Templates (Contemplate)
  • Link Field for CCK
  • Node (key)words
  • Views
  • Front Page
  • Panels
  • User Points
  • Subscriptions
  • taxonomy breadcrumb
  • Captcha
  • textimage
  • 由于网站将正式运行,所以我一直等到以上模块与Drupal V5.0匹配的正式版全部推出、并测试没有明显bug后才正式开始建站。因此,以上模块都已经具备5.0的正式版,而且测试基本没问题。

    以上每个模块的功能和使用方法,将结合本站的建立逐个加以说明。

    2、Drupal V5.0的安装

    Drupal V5.0的安装非常简单,只要填写三个Mysql数据库的链接参数(是我接触到的CMS安装中最简洁的,真是从先前最繁琐的极端走到另一个极端),因此无须多写,是个地球人应该就会安装。

    值得一提的是,在以上三个选项下面,点击会展开“高级选项”,一般不需要填写,保持默认即可。我由于沿袭以前使用其它CMS时候的习惯,给数据库加了一个前缀“drupal_”,结果运行某些模块以及模块升级时候出了问题。至于这些问题的根本原因俺难以知道,反正取消这个前缀以后就再也没有那些问题了。因此,个人强烈建议不要给数据库加前缀

    3、网站内容分类组织及其按类浏览方法

    建立了四个内容类型(Content Type):FEA Tips, Textbooks, Tech Notes, Downloads,用CCK模块为这些内容类型添加内容设定(Field)。

    有一些CCK辅助模块,可以帮助用户添加特定的CCK Field,如Link, image,date,email等等. 本站目前只安装了Link(因为目前只有这个辅助模块是非测试版本的。)

    CCK默认的节点内容显示比较难看,为此我安装了Contempt (CCK template)模块,用以设定CCK内容的显示模版,详细介绍见后。

    一个个人经验:
    在创建内容类型时候,在Body(正文)部分如果跳过不填写,这样发表内容页面就不会有Body部分了。我曾经用CCK模块的多行Text Field来替代默认的Body,目的是想在body下面加一些帮助提示文字,以及用contempt控制Body的显示。后来发现这么做的问题是,Drupal的teaser(摘要显示)是针对默认的Body来操作,而不会针对CCK创建的Body,因此teaser display就实现不了了。因此,如果需要正文部分,推荐使用默认的Body,而不要手工创建CCK Body Field.

    如果使用了默认的Body,而且针对某个内容类型激活了CCK contempt模块的话,必须在contempt模块的代码里面加上下面一行代码才能显示出正文(因为contempt给出的默认代码不包含默认的正文部分):
    <?php print $node->content['body']['#value'] ?>

    =============================================

    为了便于分类组织和浏览内容,为每个内容类型设定了Category(包括Vocabulary及其下属各级term)。为便于按照树状分类结构浏览同类节点,安装了Taxonomy Breadcrumb模块。该模块的作用是在每个节点显示页面顶部按照该节点所属的分类层次显示相应的分类链接,以便于访客清楚自己当前的浏览位置。与该模块配合,在设定每个vocabulary和term时候要给出(相对)链接URL.

    测试了多个与Taxonomy浏览相关的模块,包括taxonomy lineage, taxonomy context等模块,以及custom breadcrumb模块,感觉Taxonomy breadcrumb用起来最爽!

    =====================================

    作为便于按类浏览的另外一个措施,是在每个节点显示页面底部加上“上一篇”、“下一篇”等浏览链接,用以链接到同一分类(vocabulary)下的相邻节点(要是能具体到vocabulary下某个term里面的相邻节点就好了)。虽然有个模块叫做Custom Pager专门做此功能,但在我的网站却不work(郁闷!)。因此,只能采用手工添加PHP代码的方式。

    英文官方网站有很多相关代码(snippet),经过反复测试,大多要么有bug,要么显示效果不理想。最后采用以下方法实现了基本满意的效果:

    Step #1: 在风格(theme)目录下的template.tpl.php文件最后添加如下代码:

    function get_nav_node_path($current_nid, $type, $direction)
    {
        // Performing SQL query
        $query = 'select nid from node where type=\''.$type.'\' order by nid desc';
        $result = mysql_query($query) or die('Query failed: ' . mysql_error());

        //setup variables
        $counter = 0;
        $ary = array();
        $node_location = 0;
       
        //parse database and put into PHP array
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
        {
             foreach ($line as $col_value)
             {
                     $ary[$counter] = $col_value;
                     $counter ++;
             }
        }
       
       
        //search PHP array for the current node's location
        for($i=0; $i < $counter; $i++)
        {
            if($ary[$i] == $current_nid)
            {
                $node_location = $i;
            }
        }
       
        //return the relative path of the last node
        if($direction == 'last'){
            $print_nid = $ary[0];
            return drupal_get_path_alias("node/$print_nid");
        }
       
        //return the relative path of the first node
        if($direction == 'first')
        {
            $print_nid = $ary[$counter - 1];
            return drupal_get_path_alias("node/$print_nid");
        }
       
        //return the relative path of the next node
        if($direction == 'next')
        {
            if($node_location > 0 && $node_location < $counter)
            {
                $print_nid = $ary[$node_location - 1];
                return drupal_get_path_alias("node/$print_nid");
            }
        }
       
        //return the relative path of the previous node
        if($direction == 'previous')
        {
            if($node_location >= 0 && $node_location < $counter - 1)
            {
                $print_nid = $ary[$node_location + 1];
                return drupal_get_path_alias("node/$print_nid");
            }
        }
    }

    Step#2: 针对每个需要添加前后节点浏览的内容类型,修改其CCK contempt代码(注意,不是修改node.tpl.php文件),在最后添加如下代码:

    <?php
    //begin navigation links code
    print '<div id="nav-links">';
       
    //set node type you want here
       
    $type = '内容类型名称';
       
    //set your website address here
       
    $website = 'http://你的网址.com/';
       
       
    //get the paths of the nodes
       
    $next = get_nav_node_path($node->nid, $type, 'next');
       
    $previous = get_nav_node_path($node->nid, $type, 'previous');
       
    $last = get_nav_node_path($node->nid, $type, 'last');
       
    $first = get_nav_node_path($node->nid, $type, 'first');
       
       
    //setup links and give them CSS ID's for styling
       
    $first_link = '<a href="'.$website.$first.'" id="first"><< First</a>';
       
    $last_link = '<a href="'.$website.$last.'" id="last">Last >></a>';
       
    $next_link = '<a href="'.$website.$next.'" id="next">Next ></a>';
       
    $previous_link = '<a href="'.$website.$previous.'" id="previous">< Previous</a>';
       
       
    //print the links
       
    print $first_link.' | ';
        if (
    $previous != null) { print $previous_link; }
        if (
    $previous != null && $next !=null) { print ' | '; }
        if (
    $next != null) { print $next_link;}
        print
    ' | '.$last_link;
    print
    '</div>';
    //end navigation code
    ?>

    具体效果,可以从FEA-Tips直接看到。

    4、页面布局安排

     

    使用 /sites 目录使你的Drupal安装井井有条

    Drupal的多站点(multi-site)功能对只有一个账号或Drupal安装,而需要支持多个Drupal站点的用户是个大好消息。其实对于只有一个站点的用户,巧妙地运用这一功能也能帮助你更方便地管理维护你的Drupal站点。
    在Drupal的安装目录下,/site/default 这个目录存放的是一些重要设置(比如settings.php),用户设定数据库帐号密码等信息。如果你需要用同一套代码支持多个站点,你可以为每一个站点建立一个相应的目录,用于存放该站点特定的模块、主题以及其它文件。(多站点设置的具体介绍请参看相关手册部分。)即便你只有一个站点,合理使用 site/ 目录也能够帮助你集中存放并更方便地管理站点自定义的模块、主题等文件。

    4.7及更老版本

    首先,在 sites/ 目录下建立一个与你的站点域名相同的目录,例如:/sites/www.mysite.com 。把 /sites/default 目录下的 settings.php 文件复制到这里。然后在此目录下你可以新建 /modules 和 /themes 和 /files 目录来存放此站点特定的模块、主题及上载文件等。在这些目录下的模块和主题,都可以被Drupal正确地找到并加载,就像把它们放在Drupal自带的 /modules 和 /themes 目录下一样。但这样做的好处就是你自行安装的模块、主题都集中在这个新目录下,而不是和Drupal自带的模块、主题混在一起,方便以后更新升级。你的目录结构应该像这样:

    drupal
    |-sites
      |-default
        |-settings.php
      |-www.mysite.com
        |-settings.php
        |-modules
        |-themes
        |-files

    如果你是重头开始建立一个新站,那么如上面所讲的建立了 /files 目录后,你还需要到Drupal的站点设置里面,把“文件系统目录”这个设置(缺省的是指向Drupal下的 files 目录)改为你的新路径:sites/www.mysite.com/files 。对于已经使用缺省 files 路径的站点,虽然你也可以这样改动,但这一移动可能会带来一些问题,特别是原有的一些URL路径可能就会出现错误。

    5.x的新改进

    Drupal5.x版本提供了一个更简单的选择即使用 sites/all ,你可以把所有非Drual自带的模块、主题以及上载文件目录都放到 sites/all 这个目录下。对于一般的单站点安装,你仍旧可以把 settings.php 像原来一样放在 sites/default 目录下。这样的安排使得Drupal核心下载与用户自定义的部分分开放置,可以简化站点迁移的过程,也可以帮助你更方便地复制某一特定的安装。
    对多站点安装,每个站点都可以使用在 sites/all 目录下的模块与主题。sites/all 这一目录在你下载Drupal后就已经自动生成,所以你只需在下面直接建立 /modules 和 /themes 等目录就行了。整个目录结构应该像这样:

    drupal
    |-sites
      |-default
        |-settings.php
      |-all
        |-modules
        |-themes
        |-files

    当你完成了以上设置后,就相当于为你的后台站点文件提供了一个更有条理的管理。Drupal目录包含所有标准的核心文件,而所有你自行安装或定制的模块、主题、设置等都另行存放在 /sites/www.mysite.com 或 /sites/all 目录下。你只需备份数据库以及特定站点目录下的文件就可以很方便地复制你的安装了。此外,任何时候你想要添加站点时(比如在同一个安装上再建立一个单独的测试站点),只需建立相应的站点目录就可以了。

    合理利用帐号与用户角色

    下面是一些合理使用用户帐号与角色的建议:

    1. 不要使用超级用户帐号(也就是第一个用户帐号uid=1)进行日常活动。这个账户应该主要用于站点设置、升级等管理性操作。
    2. 根据你的站点的需要为你的站点建立适当的用户角色,例如“站点管理员”、“论坛版主”、“手册编辑”等,这样能够帮助你更好的细分管理用户权限。注意“管理用户”这一权限,拥有这一权限的用户将可以给自己添加其它任何权限。
    3. 新模块经常会带来新的权限设定。记住添加新模块后检查一下用户权限页面,有没有需要添加或更改的地方。