Drupal主题花园网站建设实践

上次介绍了 http://themegarden.org 网站以后,我就打算把它改造成中文版的.我看到drupalmodules网站的时候,也想把它改造成中文版的,但是限于后者需要将大量的模块汉化成中文,这个计划还没有实施。但是主题花园的汉化,相对比较容易一些,而且工作量要下一些,涉及到的功能也不多。

 

       然后就决心,自己也实现一个功能一样的网站。要实现什么样的功能呢?我就跑到http://themegarden.org上不断地点鼠标了,看看人家是怎么做的。首先,看到的就是主题切换,然后看到的是前一个主题,后一个主题这样的导航,以及随机主题,当前主题,另外就是前10个主题,后10个主题的导航。

 

   主题切换,以前从来没有遇到过。因为在项目中,一个网站通常只有一个主题,用不到之间的切换,语言切换我倒是做过,主题的切换不行。我看到http://themegarden.org上面使用了&theme进行主题切换,我直接在自己的网站上,也加了这个后缀,但是不管用。

 

   我在drupal的后台,看了半天,把核心主题全都启用了,但是还是看不到用户的主题切换功能。我查看自己的用户帐号,甚至专门为此建立了一个测试帐号,用来查看在用户的帐号之下,是不是可以选择主题。还是不行。

 

       应该有相关的扩展模块吧? 在google.com上搜索,drupal,theme,发现里面的内容,都是讲如何制作主题的,国内的这方面的内容,也没有。我重新来到了http://themegarden.org网站,使用firefox,firebug查看里面的源代码,但是还是没有发现相关的模块,他们是不是对此保密了。自己终于有点泄气了。

 

       为什么别人可以实现,自己就不能呢?喝了一口水,继续使用google,主题切换,主题切换,主题切换,切换用英文怎么说?“switch”,虽然自己英文不咋地,但是单词量还是比较丰富的。drupal,theme,switch, google.com,终于发现了目标。虽然没有找到相应的模块,但是我看到有人在drupal.org上询问相同的问题,theme switch help,进入这个页面,看有没有人回答他的问题,果然,在问题的下面,有人推荐使用Theme Switch Module 。谢天谢地,drupal的强大就在于此,你想要实现的功能,大多数时候,别人也遇到过了,而且有了相应的模块可用,这些模块是经过很多人的摔打铸造而成的,所以质量上比请人开发的通常还要好一些。接下来,介绍switchtheme模块。

相关链接:  Think in Drupal

Drupal版本:

drupal建站

难点解决了,程序写好了,模块也独立出来了,但是并不意味着网站搭起来了.其实要做的东西还有很多,比如说,开始的时候,只有5个核心主题用来测试.而且只有两个节点,节点中的内容基本上是空的.

 

第一个问题,就是把模块中英文的地方,全都换成了汉语,另外把测试时候的2个主题换成了10个主题.这个后来遇到了一点点小问题,已解决.另外就是编辑了节点,在里面添加了内容,就是现在大家看到的.最后要解决的就是,RSS,和搜索了.

 

不过这两个用的都是默认的功能,首先是启用RSS模块,也就是模块列表页面排在最前面的Aggregator.接着对它进行配置.首先是权限的配置,授予匿名用户登录用户”阅读新闻feed”的权利.接下来到内容管理下面的Feed 聚合器中添加feed(种子).这里添加了两个Drupal主题新闻,对应url为http://drupal.org/taxonomy/term/15/0/feed, 设置其更新周期为1天.另一个就是Drupal新闻,对应的url为http://zhupou.cn/rss.xml, 更新周期为1天.这样就添加了两个RSS页面.注意这里的url,不是网站上一级导航的url,一级导航中的为, aggregator/sources/1,也就是网站内部的路径.添加好以后,并不能立即看到内容.

 

在Feed 聚合器的管理页面,在每个feed的项目中,有个更新条目的选项,点击这个可以手工的更新RSS的内容,当然,你也不能永远的手工更新,这就需要配置cron任务了,我介绍过懒人的cron模块,也就是poormanscron,当然你也可以配置linux下面的cron任务。这个我就不讲了,我开始作drupal的时候,cron都不知道干什么的,也不会配置。所以对于那些刚刚接触的人来说,要了解这一点,这样系统将会自动地为你更新。

 

接下来就是启用search模块。启用后,需要到站点设置〉〉搜索设置页面(admin/settings/search)对其进行配置,当然这里我用的都是默认值,简单CJK(中日韩字符)处理,这一项我选择了,我知道有中文分词模块可用,但是还是使用了自带的,毕竟是演示么。当然这里可以配置的还有每次索引的条目数量,最小字数,以及权重。默认的就可以了。启用搜索以后,就出现了搜索框了,我用的是garland,默认主题就是这一个。搜索框是一个变量,可以直接输出到主题下面的,我也看到在区块的列表页面,多了一个搜索的区块,但是没有启用这个区块。是不是支持搜索变量,这个是主题决定的。当然这个时候,我看到了一件事,我还没有对网站进行汉化。因为搜索框中的字符是英文的,本来打算只汉化这几个字,但是不知道怎么弄,就直接把整个中文包都导了进来。汉化我以前讲过,这里就不多说了。

 

最后解决的问题就是,在左边的导航中,多了一个Feed 聚合器 链接,匿名用户访问网站时,是看不到管理的导航菜单的,但是能够看到这个菜单,想把它去掉,因为themegarden上没有这一项。怎么办?导航到“admin/build/menu-customize/navigation”,在菜单列表中,找到这个菜单,将它和它的子菜单禁用掉。就可以了。也就是将启用这个复选框中的勾号去掉。

 

现在整个网站,在我的本地就跑起来了,看样子还不错。

相关链接: Think in Drupal

Drupal版本:

使用Switchtheme模块切换drupal主题

     先简单的介绍一下这个模块,模块的下载地址为: http://drupal.org/project/switchtheme

模块用途,就是为你添加一个主题切换区块,在这里面,你可以选择主题,进行切换.而且你可以为主题设置更加友好的可读性更强的名字,并且可以根据用户的角色,来控制哪些用户可以切换主题,哪些不可以切换.另外,从6.x开始,这个模块开始支持了Browscap模块,以根据用户的浏览器来切换drupal主题。

 

       另外在Readme文件中,介绍了更详细的信息,你可以把主题实现大、中、小,3个版本,然后让用户在3着之间进行切换。

   接下来,要做的就是安装这个drupal模块,以及阅读里面的说明。它的配置是很简单的,比如为theme设置用户友好的名称,admin/settings/switchtheme,不过这里我没有配置。直接按照说明,进入区块列表页面,这就看到了这个模块创建的两个区块Switch theme form,Random theme,启用这两个区块,同时在其它的主题也启用它们,这里仅仅涉及到了核心主题。呵呵,终于看到效果了。很好,很强大。

 

   这里的随机主题模块基本上就是我想要的了。而且启用了这个模块以后,就可以使用&theme=这种方式切换主题了。不过遗憾的是,这个模块只实现了两个区块,前一个主题,后一个主题,当前主题,这些都没有实现,如果是现成的,那就最好不过了。

  

     既然没有完全实现我想要的,那么就看看这个随机模块是怎么实现的吧。我就打开了这个模块的源代码,察看随机主题区块对应的函数:

function switchtheme_display_random_block() {

  $themes = list_themes();

  shuffle($themes);

  foreach ($themes as $key => $theme) {

    $theme->screenshot = dirname($theme->filename) .'/screenshot.png';

    if (file_exists($theme->screenshot)) {

      // Return the first theme with a screenshot.

      $output = l("<img src=\"". base_path() ."$theme->screenshot\" alt=\"preview of $theme->name\"/>", $_GET['q'], array('query' => 'theme='. $theme->name, 'html' => TRUE));

      return $output;

    }

  }

}

 

    看完这个函数,当然这个drupal模块的源代码,我都读了一遍,顿时觉悟了,又到api.drupal.org上查看了函数list_themes,整个网站的难点,就这样被我攻克了。下面给大家讲解,怎么具体实现的。

相关链接: Think in Drupal

Drupal版本:

天下代码一大抄

我常给人说,自己不会php,确实不怎么会,仅有的一点知识,还是学习drupal的时候顺便学习的.但是这并不妨碍使用drupal.其实很多熟悉drupal的人并不大懂php.

 

下面将一下,我是怎么实现这个自定义的模块的.我批判过直接修改模块的代码.实际上,自己也常常直接修改.当我看到了switchtheme,看完它的代码以后。我首先阅读了list_themes这个函数,通过这个函数的定义,我了解到了,drupal的theme是存放在system表中的。打开数据库,浏览了一下这个表的内容。如果实在不行,自己还可以直接读取数据库。我是这么想的。

 

  $result = db_query("SELECT * FROM {system} WHERE type = '%s'", 'theme');

读完代码了,类似的功能也找到了。那么就开始动工了,直接修改switchtheme.module. 不过需要现有一个思路,比如动态的显示前一个主题这样一个区块。首先想到的,显示一个静态的主题区块。然后再将它改造成动态的。

 

在switchtheme_block函数中,添加以下内容:

$blocks[2]['info'] = t('Previous theme');

elseif ($delta == 2 && $op == 'view' && user_access('switch theme')) {

    $block['subject'] = t('Previous theme');

    $block['content'] = switchtheme_display_previous_block();

    return $block;

  }

 

然后再创建一个switchtheme_display_previous_block()函数。让这个函数返回一个静态的$output;这样,就可以启用这个区块了,而且在上面可以看到这个区块中的内容了。由于开始的时候,这里是静态的,所以接下来需要向switchtheme_display_previous_block(函数中添加逻辑代码。list_themes()函数返回来的是一个数组。这里需要对php的数组进行处理,我对这方面不熟,以前有一本很好的参考书,后来留到了原公司了。所以只好google一下。很快就找到了关于数组的php函数,里面有相关的介绍。

 

边找函数,也在边思考具体的逻辑,首先在程序中,我需要找到当前的主题,根据当前的主题,我让指针向前移动一位,就可以找到前一个主题。既然list_themes()把所有的主题都读了进来,直接进行数组操作就可以了。

 

当前的主题比较好找到,代码有现成的:

$current_theme = !empty($custom_theme) ? $custom_theme : $user->theme;

 

不过注意这里,$custom_theme是个全局变量,使用以前需要global一下。这个是我在调试的时候发现的,其实拷贝的时候,就带上了,后来又用到的时候,忘记了global,所就出了错误。很快就定位到这里了。所以提醒一下,这里的当前主题是存在session里面的。找到了两个函数,ksort(),prev()这两个就够用了。我现在有了当前的主题,有了主题数组,如何让数组的指针直接指到当前的主题之上,我觉得应该有现成的方法,但是我不会,没有用过,所以只好使用foreach()来一个一个的判断了。最初的代码如下:

 

global $custom_theme;

          $themes = list_themes();

          ksort($themes);

          $current_theme = !empty($custom_theme) ? $custom_theme : $user->theme;

     foreach ($themes as $key => $theme) {

       if($key==$current_theme){

         break;

       }

     }

          $previous_theme = prev($themes);

 

        后来debug,发现指向了当前的主题,原来php的数组找到了当前的主题以后,会把指针向下移动一位,所以我又加了一句$previous_theme = prev($themes);

 

这样就找到了前一个主题,然后对其进行输出:

          if($previous_theme){

                 $previous_theme->screenshot = dirname($previous_theme->filename) .'/screenshot.png';

                 $output = l($previous_theme->name, $_GET['q'], array('query' => 'theme='. $previous_theme->name, 'html' => TRUE));

                 $output .="</br>";

                      $output .= l("<img src=\"". base_path() ."$previous_theme->screenshot\" alt=\"preview of $previous_theme->name\"/>", $_GET['q'], array('query' => 'theme='. $previous_theme->name, 'html' => TRUE));

          }else{

            $output =t('这个主题是第一个,前面没有主题了^_^,你可以选择下一个主题');

          }

      return $output;

 

最初这里也是没有if判断的,只有前面的逻辑代码,后来发现,当跑到边界的时候会出乱子,所以加了一个if语句用来判断边界条件。简单的if语句我还是会的。

 

再后来,在边界附近有发现了问题,把前面的两个prev改为了:

$previous_theme = prev($themes);

          if(!$previous_theme ){

            end($themes);

          }

  $previous_theme = prev($themes);

这里面又加了一个判断,终于搞定了。

 

上面的这些代码都是从这里,还有从那里拷贝过来的。包括拼凑的字符串。

 

接下来,一口气,把这里的逻辑写完了,花了4个小时,就把这个网站的难点给搞定了。当然这样的代码,没有注释,效率也不是很高,不过这个网站,这些代码,对于他人也没有什么大用,仅仅用于教学,以及方便大家预览drupal主题使用。

 

我是把逻辑直接放到了switchtheme模块中,后来功能实现以后,自己就把它独立了出来。当然,里面的字符串也都直接替换成了中文的。令我惊讶的是,拷贝出来以后,改了改名字以后,就可以正常工作了。

 

当然,能够这样的解决这个问题,我还是有些基础的,比如两年的时间自己读过各种各样的代码,就拿drupal来说,内核的代码,我是读过一遍的,还有项目中的各种php代码,虽然自己遇到问题,不能将函数直接写书来,但是,知道类似的函数,在那里可以找到。也知道如何修改一个函数。

 

在项目中,大多数时候,都是在抄袭别人的代码,自己仅仅是一个IT民工,谈不上任何的创造性

相关链接: Think in Drupal

Drupal版本:

脏活

一个网站建好以后,要有好的内容,我这个网站是关于主题的,所以要从drupal.org上下载相应的主题,以展示给大家。当然,drupal6.x的主题很多的,光点鼠标就费很大的劲,下载以后对其进行解压缩,放到本地网站的themes目录下面,最主要的一点是解压后的文件,有两层,你需要复制里面的一层。因为上级目录是“themename6.x.1.2”这样的形式。最后需要将它们上传到虚拟主机上,每次不能启用太多的主题,一次20个,每次主机都要费很大的劲才能替我完成使命。112个第3方主题就这样被我放到了线上,当然,个别的地方还需要配置一下区块在区域中的位置。而且个别主题存在这样或者那样的问题。第3方的嘛,也就是供大家参考使用。如果想更加专业的话,那么还是自己订制比较好。

 

这里顺便讲到两点,一个就是子域名的设立,这个以前从来没有用过,就是建立一个theme.zhupou.cn这样的域名,首先是在域名的下面添加这样的子域名,并将其IP指向到虚拟主机,在虚拟主机上,也添加一个子域名,这样在subdomains目录下面,就多了一个theme目录,要上传的网站就放到这里。

 

还有一点,就是theme.zhupou.cn,访问这个网址,需要将其重定向到theme.zhupou.cn/drupal-6.6,这个就是在theme.zhupou.cn对应的目录下面,添加一个index.php,在php代码中,包含一句重定向的语句。

 

到此整个网站就建立起来了,drupal5.x的主题网站,什么时候,有时间了再搭吧,估计现在大家都在用6,所以5的可以缓一缓,最主要的是,或真的太脏了。拷贝,粘贴。拷贝粘贴。体力劳工。

 

相关链接: Think in Drupal

Drupal版本: