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、页面布局安排