Drupal简明教程

原文:http://drupal.org/handbook/customization/tutorials

译者:葛红儒, http://www.thinkindrupal.com

 

Drupal简明教程,是由一系列的非常详细的一步一步的文章构成的.它们为你指明了方向,帮你成功了理解、掌握Drupal。构建一个摄影网站,允许许多用户提交图片,这属于简明教程的例子。而向你解释如何利用assetmanager模块的功能,来为某一节点插入图片,这应该是一个HowTo(如何做)的例子。理解了吗?

好的!

提出和分享您的知识

 

现在你理解了两者直接的差异,是时候写篇自己的文章了。如果你所写的,是这里现有文章没有覆盖到的,你可以点击本页底部的链接“add a child page”(添加子页面),成为Drupal简明教程的贡献者。相信我们,写篇你如何使用Y & Z完成X的文章,当其他用户阅读你的文章时,你会有种成就感的!

 

Drupal版本:

适用于初学者的Drupal菜谱

原文:http://drupal.org/handbook/customization/tutorials/beginners-cookbook

译者:葛红儒, Think in Drupal Drupal 5.x 德文版

目的

帮助新手学习Drupal, 新手在Drupal.org上占据着大多数.

背景

本书中所讲的技巧,都是基于一个Windows PC(针对Windows的指南)上的一个测试站点。这里面的大部分内容,都能直接应用到在web服务器上构建站点。尽管这里所讲的是针对Drupal 5,但是大部分流程都适用于Drupal 6,当然有一小部分的导航按钮可能有些出入,被改名了或者被删除了。 奇迹 使用Drupal,你不必懂得编程(即便是不懂PHP也没关系)。懂得PHP, HTML, 和CSS的基本知识,有助于你对Drupal的理解,但这不是必须的。 一些非常好的资源:

• W3 Schools - 涉及到与互联网相关的方方面面

• PHP官方网站-PHP的完全实现

• PHP Builder –一些简明教程和快速上手的代码

本简明教程会用到HTML和少量的CSS,但是没有涉及一行PHP代码。我们把所有东西都封装到了Drupal下面。 一些人可能认为学习Drupal学要花费很长的时间,它可能花费你几个月或者几年的时间,来建设一个网站?这种观点是错误的。也是完全荒谬的!一个包含36个页面的静态网站,如果你是初次使用Drupal的话,你只需要花费不到一周的时间就可以将其建立起来。接着,你就可以考虑寻找主机和购买域名了,这可以由主机提供商帮你完成。 你可以做到!是的,你。 使用Drupal.org 在你向Drupal.org提交文章之前,你需要了解的一些东西:

• 先搜索一下,看看你所考虑的问题是不是已经存在了。这样可以避免重复发文。

• 每篇文章仅包含一个问题,这样可以缩短时间,也使得你更容易得到答案。

• 如果你没有理解你问题的回复,一定要再问一遍,不要不懂装懂,比如你可以说“我是个新手,你能不能用更简单的方式给我再讲一下?”

• 当你需要帮助时,请阅读在Drupal论坛提问的技巧。试着完整的描述你的情况。给出你已经做得,还有就是需要准确的给出你想要做什么。

• 例如,如果一个页面不能正常显示,它可以是: 1. 浏览器问题,那么你需要告诉读者你使用的是什么浏览器(名称,版本,..插件…) 2. 给出你所用Drupal的版本号(4.7.x, 5.x, 6.x 等等) 3. 可能与之相关的你用到的第3方模块(注明版本) 4. 还有,最好加上你所用的PHP 和MySQL的版本号(或者你的主机提供商)

• 下面是一些基本资源: 1. 术语(专有名词) 2. Drupal Jargon.

o 节点(Node):用简单的话来讲,就是一个内容单元。例如,它可以是一个"page," "story," "book page," 或者"blog entry."。这些不同的内容类型通常称为“Content types”。

o 主题(Theme):这是你的网站显示给终端用户的方式。在Drupal站点中,主题定义了图形化外观,布局和颜色。

o 区块(Block):这是一个容器,在你的页面上展示一小片内容。比如说“最新文章”,“赞助商链接”,或者“在线会员”。

o 菜单(Menu):一个菜单用来展示一列链接。Drupal菜单通常位于左栏中。例如,你的导航菜单就在这里。 排版习惯 在本站,以及其它Drupal站点,你将会经常看到这样的东西: Administer >> Access control >> User management >> Roles.这意味着,点击导航菜单上的"Administer",接着“Access control”,接着“User management,”,接着“Roles.”。 偶尔你也会遇到"production"(生产) 或者"live"(活得)站点。这些术语通常可以互换。后者---"live"站点----更正式并且更易于被接受,它的意思为“你的终端用户可以交互的网站”。前者,基本上和后者同义,但它是一个更“传统的”数据处理术语。

Drupal版本:

一些初步建议

原文:http://drupal.org/handbook/customization/tutorials/beginners-cookbook

译者:葛红儒, Think in Drupal

下面是在你开始学习Drupal以前给你的建议:

  •  

    • 如果你有什么新的功能,一定要先在测试站点(相同的模块和数据,不同的数据库)上试验过以后,才能放到线上,千万不要直接放到线上。
    • 不要一开始就尝试建立一个“完美的站点”。在你还没有更好理解以前,应该容忍瑕疵的存在。一味的追求完美,会让你不能按照预期达到目标。
    • 刚开始时,尝试着学习和使用Drupal的基本功能。首先看看Drupal能做什么,然后再尝试让它帮你做什么。如果你对核心特性已经非常熟悉了,你可以尝试着学习使用一些比较复杂的第3方模块:Views, Category, CCK, 和Organic Groups模块(modules)。
    • 在你创建自己的主题以前,你可以先尝试对默认主题进行定制,Drupal手册中的主题开发指南,对此很有帮助。
    • 当你使用模块时,遇到了问题以后,首先阅读模块自带的"readme"文件,然后使用搜索引擎进行搜索。通常情况下,我所遇到的问题都已经在论坛中或者问题列表中有了答案。
    • 更有效的使用google搜索:关键字 site:drupal.org。通常可以快速的找到你的问题和答案,一般有人已经问过这样的问题了。
    • 为了让站点成功的话,要让它迎合用户,而不是与用户作对。但你的站点初步建立以后,邀请你的朋友,家人,或者其它你熟悉的人,来访问你的站点并给出真诚的建议,或者采用更正式的用户测试(我运行一个公司内部网站,每隔几个月我都做一次用户测试)。
    • 有时间的话多逛逛论坛。帮助他人,就是帮助你自己。
    • 不要在你的站点上放置太多花哨的东西,比如无用的区块,图片等等。我喜欢简单,只有在需要的时候才放上去。当然这依赖于你的应用。

好运!

Drupal版本:

Drupal应该很容易吗?

Drupal很强大,很灵活。这意味着,它也很复杂。你觉得Myspace的工作人员没有自己的术语吗,或者他们是一天就把网站给建出来的吗?我不知道有谁在讲Drupal很简单,但是有很多人由于想一下子掌握所有的东西,反倒把事情搞复杂了。

为了在Drupal社区中,人们更好的相互交流,使用相同的术语是必须的。如果你说“在我屏幕右边的盒子一样的东西”,语意就不明确,别人也不好理解。你将其改为“右栏中的作者信息区块”----现在语意就非常准确了,每个人都能理解你的意思了。你告诉了他们它是什么,在哪里,甚至如何找到它以及相关部分的样式。

开始时,尝试着理解Drupal的简单部分,不要想着一下子都掌握了。例如,首先你需要理解什么是节点(可参看在我书中的定义)。接着你才能理解什么是节点类型。学习页面的基本构成部分(页首,页脚,左栏和右栏,以及中间或者内容区域)。多点点,多看看后台的管理页面,这样,即便是你现在不知道它们能干什么,你也能大概的知道它们在哪里。

如果你的目标是拥有一个"MySpace"一样的网站,愿望总是美好的,但你要记住,只有你一个人,而你所用的工具你也不太熟悉。很多人都能搭建一个"MySpace"一样的网站,这是因为它们对所用的工具,模块非常熟悉(顺便说一句,我觉得MySpace相当不符合逻辑)

首先,先把东西搭起来,这样看得见摸得着。然后你再为此庆祝,不要在那里做思想的巨人,行动的矮子。有了一个开始以后,你就可以实现更精彩的东西了,但你需要一步一步的去做。不要一下子就添加无数个模块,这样会把你的服务器累死的;你要跟着感觉走。一次添加一个模块,熟悉了以后,可以再添加新的。

为了让Drupal更易于使用,也更加符合逻辑,我们欢迎你提交反馈信息,比如说新的特性需求,或者你觉得一些地方不太符合逻辑。如果你没有看到你的方式出现在Drupal中,你也不能命令我们给你实现,或者威胁以后再也不用Drupal了。当然,也不要做出诬蔑性的评论,毕竟Drupal是免费的。

 原文:http://drupal.org/handbook/customization/tutorials/beginners-cookbook

译者:葛红儒, Think in Drupal

 

Drupal版本:

A.drupal入门

     有多种方式,可以在你的本地计算机上建立测试环境.在Drupal手册的建立开发环境一节中,包含了不同操作系统下面的许多应用和指南. 

建立本地开发环境的原因:

  • 本地开发允许你在不能上网的情况下也能进行开发.
  • 建立一个本地开发环境,即便是非常简单的比如WAMP,也能帮助你更好的理解服务器进程和数据库系统.随着你对Drupal理解的加深,你将会越来越得心应手.
  • 任何你放到网上的东西,都将被搜索,归档,一般都会放置很长时间.如果你的内容中包含错误的, Google将会把它搜索到,并保存起来,全世界的人们都有机会看到你的错误,难道你想这样吗?

在这本drupal简明教程中,我们采用来自DeveloperSide.net的集成安装包,测试环境为 Windows PC

这个安装包已经集成了以下东西:

  • Apache 2.2 HTTP服务器
  • MySQL 5.0数据库
  • PHP 5.2 Perl 5.8 脚本语言
  • WAMP图形控制器
  • 动态DNS客户端
  • Tomcat Servlet/JSP容器
  • mod_aspdotnet ASP.NET主机接口
  • OpenSSL加密工具集
  • mod_security网络应用防火墙
  • phpMyAdmin MySQL管理
  • Joomla
  • Drupal
  • WordPress
  • MediaWiki
  • phpBB

注意,对于任何包含了Drupal的安装包,比如DeveloperSide的,它们的Drupal可能不是最新的版本。因此,如果你使用这种安装包的话,我们建议你安装后,立即检查Drupal的版本,如果不是最新版本的话,立即对Drupal进行升级。

 

我按照他们的指导,构建了自己的开发环境!更多指导可参看开发环境一节中的Web.Developer。最好将"Web-Developer Controller"的快捷方式放到你的桌面上,这个非常方便,我不知道是不是安装过程中自动放上去的,如果不是的话,你可以手动的拖过来。

 

美中不足的是,当我访问Drupal的官方网站,想下载一些需要的模块和主题时,发现在drupal.org首页有个很显眼的通告,一个更新的Drupal版本发布了,而且官方推荐使用最新的版本。

我下载了最新的Drupal稳定版本。接着使用WinZip对其解压缩。

 

当然,现在创建的目录名为"Drupal-5.1,"(编写本文时的最新版本),而安装包里面需要的目录名为"Drupal." 现在我们关闭Apache的服务,将"Drupal"改为其它的名字,将"Drupal-5.1"改为"Drupal"。这样就可以了!现在我的Drupal升级到了5.1版!

 

如果你没有使用自带Drupal的集成安装包的话,安装过程也是非常简单的,只需要几分钟就可以了。根据你的Drupal版本,你可以在手册的入门一节中,找到相应的安装指导。这里是Druapl 5的,这里是Drupal 6的。

 

原文:http://drupal.org/node/120613

译者:葛红儒, Think in Drupal,

 

 

 

Drupal版本:

B.drupal基本配置

无论你的Drupal是单站点还是多站点,现在你都需要做些基本的设置.下面这些是我做的,你可能会有所不同;这里数据库的权限为"root",这样做的好处是,比较方便,干什么都比较省事,你不用担心权限的问题.对于一些东西,我将给出Drupal.org上的相关链接,但是还没有发现与本文相近的相关内容。

  1. 导航到Administer>>User management>>Roles,创建一个角色"administrator"
  2. 导航到Administer>>User management>>Users,为你自己创建一个用户。这将使得在你需要的时候,你可以通过切换用户,来测试你的Drupal站点。
  3. 导航到Administer>>User management>>Access control,将所有的权限授予角色"administrator"
  4. 现在,你可以设置登陆用户和匿名用户的权限了,比如说,使用联系表单。这种设置,在需要的时候,随时能对其进行更改。
  5. 导航到Administer>>Site configuration>>Site information页面,在靠近底部的地方,将"Default front page"设置为"node." 在该页面上,你还可以为其它字段设置基本的默认值。我不了解这里的所有的字段,但是我不喜欢,当我访问一个drupal站点时,被称为“匿名的”("Anonymous"),所以我将其改为了“访问者”。
  6. 对于那些在所有站点上都用得到的Drupal模块(核心的或者第3方的),现在就可以启用它们了(Administer>>Site building>>Modules)。例如,可能在所有的Drupal站点上,你都会用到"Page"或者"Story." 我现在发现越来越多的用户使用"Book."了。

我强烈建议你启用Drupal的核心模块"Path"模块,这样你就可以为你的页面使用“普通的”名字了。

如果你想使用联系表单,通过站点为用户发送电子邮件的话,一定要启用"Contact"模块。

  1. 对于drupal主题的设置,和模块的做法一样。

 

有些东西我推荐你在你的所有Drupal站点中都采用,现在就是最好的时候来做这些事:

  • 启用"CLEAN URLS"(简洁URL),这样你的站点对用户更加友好。导航到Administer>>Site configuration>>Clean URLs。在那段描述的底部,有一个链接,用来测试简洁URL。如果通过测试的话,那么"Enable"单选按钮,现在就可用了。点击这个单选按钮。(如果由于某种原因,不能正常工作的话,可参看取消简洁URL的指示
  • 为了让我创建各种类型的内容,当我的站点准备好上线时,我来到Administer>>Site configuration>>Input formats,将"Full HTML"设为默认选项。接着我仍然允许管理员们(和我的其他ID一样)能够使用这种格式。现在你就这样做,这样在构建站点时,你就能够避免一些常见问题
  • 我不喜欢将"Promoted to front page"(发布到首页)作为发布内容的默认选项,导航到Administer>>Content management>>Content types,在每种格式下都关闭它。
  • 现在你该决定你默认的评论模式了。导航到Administer>>Content management>>Comments>>Settings,对于一个单独页面,允许用户对其评论,确保将"Preview comment"(评论预览)设为"Required."
  • 现在,让我们启用联系表单,这样你的用户就可以给你发消息了。导航到Administer>>Site building>>Menus,找到"Contact"一项。点击"enable"链接。记住,接下来,你需要导航到Administer>>Site building>>Contact form,以完成相应的设置。

相关链接:http://drupal.org/node/120614

         Think in Drupal 

 

 

Drupal版本:

C.在一个本地计算机上建立多个drupal站点

需要第2drupal测试站点?下面是如何简单的实现它。[提示:如果你已经想好了要创建多个站点,你首先需要将要创建的站点列出来,接着阅读本文给出的这些指示。有些步骤可以批量进行,从而节省你的时间。]

为什么还要创建其它站点呢?除了我的已经运行的几个站点以外,我还想起了一些新的玩意,还没有完全成型,而在现有的测试站点中,又很难将这种想法加进去。我可能还有一些关于将来自己要建立的站点的想法。总之,人总是会有这样或者那样的想法的,对于程序员来讲,想法就意味着网站的原型。所以,在你完全放弃自己的想法以前,你可以花上几分钟仔细考虑一下。过一段时间,你很可能会改变自己的主意;现在它看起来还有点凌乱。

 

最终,我决定为我的新想法创建一个测试站点。因为是测试用得,即便是将来它完全失去了控制,你也能将其推倒重来。

 

这个过程看起来很长,其实不然,我只是在这里对其进行了详细的描述。扩展阅读材料,可参看“在本地的Windows PClocalhost)上,使用一个Drupal,运行多个站点”。更多关于站点目录的官方细节,可参看为多站点设置站点目录

如果你想了解这方面的更深的知识,你可以在drupal.org上对论坛进行搜索,输入"multi-site",最好使用google, drupal.org自带的搜索功能经常被关闭,而且速度也很慢;在http://groups.drupal.org/multisite上,有专门的一个小组来讨论这个问题。而在手册内部,有很好的一节:Drupal多站点安装和设置

相关联接:http://drupal.org/node/120647

               Think in Drupal(勿删)

Drupal版本:

步骤

  • 打开phpMyAdmin(使用Web-Developer控制器中的“其它”(other))

开始批量循环1

  • 在左边,选择数据库Drupal51。这个数据库是在前面安装时创建的,数据库名可能会有所不同。
  • 点击"Operations"(操作)
  • 向下滚动到“Copy Database to:”(复制数据库到:)
  • 输入新的数据库名。
  • 验证是否点击了单选按钮:

    • 结构和数据
    • 在拷贝以前首先创建数据库
    • 切换到要拷贝的数据库
  • 点击这个区域下面的Go(开始)按钮。
  • 拷贝完成以后,点击"SQL"
  • "Run SQL query/queries on database"输入框中,输入:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON databasename.* TO 'admin'@'localhost' IDENTIFIED BY 'superpw';
FLUSH PRIVILEGES;

admin是我的管理角色(它是用户1的用户名)
 
superpw
是该用户的密码(我为我的所有的数据库也使用这同一密码,这样更方便一些)。
 

提示:我将这段文本创建并保存在了c:/www/drupal/grant.txt,这样将来我可以重复利用它。

  • databasename改为新的数据库名。

结束批量循环1

  • 关闭phpMyAdmin
  • 导航到www/Drupal/sites目录。

开始批量循环2

  • 拷贝一个站点文件夹(例如:default),将其改名为你的新站点。
  • 打开该目录,使用记事本打开settings.php文件。
  • 修改$db_url $base_url$db_url应为你刚刚创建的数据库名。$base_url应为你访问站点时用到的URL
  • 关闭settings.php文件。
  • 如果你需要为该站点使用特定的模块或者主题,你可以在该站点的目录下面创建两个子目录"modules" "themes"

结束批量循环2

  • 导航到/www/Apache22/conf文件夹下。
  • 找到并打开"httpd.conf"文件(提示:如果我要向修改一些东西的话,我首先对其进行备份,以防万一。)

我注意到我的Apacheindex.html放到index.php前面,所以在你的目录下面删除index.html,如果存在的话。

  • 找到"# Virtual hosts."一行。删除下面一行前面的注释符"#"。这使得你可以创建一个单独的文件来放置你的其它改动,这样会更安全一些。
  • 保存。
  • 导航到/www/Apache22/conf/extra文件夹。
  • 打开httpd-vhosts.conf文件。
  • 在已存在列表的底部,将例子注释掉("#")。

结束批量循环3

  • 在已存在列表的底部,输入:

<VirtualHost *:80>
    DocumentRoot /www/drupal/
    ServerName databasename
</VirtualHost>

  • databasename改为新的数据库名。

结束批量循环3

  • 关闭该文件。
  • 导航到/windows/system32/drivers/etc文件夹下面。
  • 使用记事本打开Hosts文件。提示:这两步也可以使用Web-Developer控制器重的"other"选项完成。

开始批量循环4

  • 添加一行:

    127.0.0.1   databasename

  • databasename改为新的数据库名。

结束批量循环4

  • 关闭该文件。
  • 返回到Web-Developer控制器。
  • 点击Apache2(左上)
  • 点击Stop Service(停止服务)按钮
  • 等待,直到状态改为"stopped."
  • 点击Start Service按钮。
  • 等待,直到状态改为" running."

继续。现在你可以打开浏览器,并输入http://databasename了。

多站点目录的更多细节,可参看为多站点设置站点目录

相关链接:http://drupal.org/node/120647

 

Think in Drupal(勿删)

 

Drupal版本:

D.drupal错误页面

偶尔,用户可能会做出一些让Drupal头疼的事情,比如说键入了一个错误页面或者试图访问他们无权访问的内容.这些将分别生成404 403错误.

在最近的一篇SEO文章中提到,Drupal处理这些错误的好处:

你的404错误页面应该和你站点的其它页面一样.它应该包括站点的页首,页脚和导航条,这样用户可以方便的点击你站点的其它区域.这个404错误页面的内容应该包括解释信息,向用户解释所访问的页面现在不可用,还有就是联系信息,这样用户可以联系你,发邮件或者给你打电话.

 

当用户看到一个错误页面时,总会有些沮丧的.而现在,很明显,最好的做法是让用户方便的回到你的站点上去.

对于“拒绝访问”("access denied" (403))错误消息页面,道理也基本上是一样的。让用户知道他们不能这样做,并给他们解释为什么这样。

 

导航到"Create content",选择"Page."。我使用的标题为"Access Denied" "Page Not Found",你可根据你的实际情况采用自己的标题。当你提交以后,记住节点的id。接着,导航到Administer >> Site Configuration >> Error,在相应的字段中输入"node/nnn"

 

Page Not Found(未找到相应页面)

下面是我的404页面的HTML

<p>Sorry! The page you were looking for no longer exists. We redesigned our site and many of the pages have changed.</p>
<p>&nbsp;</p>
<p>If you are unable to find something on our new site or have a question about our site or services feel free to <a href="/contact">contact us</a>.</p>
<p>&nbsp;</p>
<p>--Webmistress</p>

 

Access Denied(拒绝访问)

下面是我的403页面的HTML

<p>We're sorry, but you must have permission to view the page you requested.</p>
<p>&nbsp;</p>
<p>If you are already a registered member of this site, please try <a href="user">logging in</a>.</p>
<p>&nbsp;</p>
<p>If you are not a member, you need to <a href="/join_us">join us</a>.</p>
<p>&nbsp;</p>
<p>If you have any questions about our site or group, please feel free to <a href="/contact">contact us</a>.</p>
<p>&nbsp;</p>
<p>--Webmistress</p>

不要担心,你尚未创建"join_us"页面。这就是启用URL别名(Path module 路径模块)的好处。将创建该页面放在你的待做任务列表中,在本书后面的章节中将会讲到相关的内容。

相关联接:http://drupal.org/node/120646

                  Think in Drupal(转载时请勿删)

 

Drupal版本:

E. 访问你的drupal测试站点

现在该装的软件都装好了.但是我们该如何使用它呢?

首先, 通过点击桌面上的快捷方式,打开"Web-Developer Controller",.看左上角.你应该检查一下Apache MySQL是否在运行.如果是的话,那一切都准备好了.如果没有的话,选择Apache,接着点击"Start Service"按钮.等待,直到状态改变为"Running.".现在选择"MySQL"并启动它.

 

是不是很好玩阿,我们把所有的软件都搞定了.现在,让我们开始我们的Drupal之旅吧.

打开你的浏览器.在地址栏中键入http://localhost/drupal/,来访问你的测试站点.由于前期工作都已经准备妥当了,你现在就能看到你的Drupal测试站点了.恭喜你!现在你就可以正式开工了.

 

 

Drupal版本:

F.安装drupal模块和主题

我首先要讲的是,对于一个新手来说,在开始的时候,不要去考虑添加什么drupal模块和主题.首先先使用站点自带的基本功能,等熟悉了以后,如果需要的话,再添加附加的功能.

主题更多的是一个口味问题,众口难调.例如,我不明白为什么有些人会使用“固定宽度”("fixed width")的主题,但是很多人都喜欢这样。关于主题的很好的一点是,主题更多的是依赖于你的内容的(接下来,你将看到许多主题的东西都依赖于内容)。

3方模块,是用来为你的drupal站点添加或者扩展功能的。我个人认为现在唯一需要添加的模块是Nodewords(又叫Meta Tags)模块;在我看来,你应该成为drupal核心模块。这个模块允许你为你的页面添加元标签,比如"content," "keywords," "robots"等等。如果你对搜索引擎排名感兴趣的话,这将对你很有帮助。你也将会发现,许多第3方模块(contributed module)都依赖于Views模块;继续前进,让我们将主题和模块的添加过程标准化。

现在,如果你使用过不同的主题和模块的话,我建议你试试Update Status(升级状态,drupal6核心模块)和Site Documentation(站点文档)模块,这样既可以确保你能够跟上Drupal发展的脚步,同时又可以为你的站点生成相关文档。下面是选择版本时的一些建议:Strong stomach?(好胃口?)

 

安装

模块或者主题的安装,基本上是同一个个模式。现在记住,我使用的环境为Windows PC(开发)和Linux服务器(我的在线站点)。

  1. 访问Drupal.org,点击"Downloads"标签。然后根据你的需要选择"Modules"或者"Themes"
  2. 找到你想要的模块或主题所在的位置。
  3. 确保模块的版本与drupal的版本相匹配。D5的模块和主题不能用在D6上的.
  4. 我经常点击"Find out more"链接,并阅读里面的材料.这样你就可以了解到,现在这个模块是不是还有开发者在支持它,因为有些模块,用的人少,原作者就停止了对它的维护.你也可以查看bug列表和请求特性列表----如果bug比较多的话,或者你需要的功能还没有实现的话,你就有可能放弃使用这个模块。
  5. 下载合适的版本(我将它们放在了"My Downloads"下面的一个Drupal文件夹下)
  6. 解压缩你下载的文件(我用的是WinZip)。它可能会告诉你压缩文件中仅包含一个文件;点击"" 或者"同意"
  7. 将代码拷贝到你的/sites/sitename/modules或者/sites/sitename/ themes文件夹中。如果你用的不是多站点的话,它将是/sites/all/modules 或者/sites/all/themes
  8. 这样就可以了!现在你需要启用它了。

drupal主题

相关链接:http://drupal.org/node/120641

                 Think in Drupal(转载时请勿删除)

Drupal版本:

drupal模块

导航到Administer>>Site building>>Modules,在这里,你可以启用一个drupal模块.非核心模块一般都位于靠下面的部分.drupal5.x中,现在drupal模块之间可以存在依赖关系了。由于依赖关系的存在,我需要不断的启用并保存它们。例如,"Views UI"依赖于"Views",所以我先选择"Views",保存设置后,接着选择"Views UI.",然后再保存。

大多数模块都会引入一些菜单项。当模块启用后,这些菜单项一般会自动出现。一些菜单项,需要设置相应的权限后(接下来的一步),才能显示出来。还有一小部分甚至需要你手动的添加菜单项,但这些模块已给出了相应的说明,以帮你完成这些步骤。

 

好的,现在真正的工作开始了。导航到Administer>>User management>>Access control,为新模块设置权限。

 

如果drupal模块引入了一个新的内容类型,导航到Administer>>Content management>>Content types,来配置这些内容类型。不要忘了,这也将影响到你的"Input formats"(输入格式)(Administer>>Site configuration>>Input formats)"Categories"(分类)(或者taxonomy, Administer>>Content management>>Categories);你也需要对这些进行检查一下。

 

好的,现在你就可以使用新装的drupal模块了。

 

本站

我的文档站点是一个相对普通的Drupal站点

启用的核心模块

使用的第3方模块

  • Blog
  • Book
  • Comment
  • Contact
  • Help
  • Menu
  • Path
  • Codefilter – 提供相应的标签,用于代码的格式化。
  • Meta Tags (Nodewords) –允许用户添加元标签,比如关键字或者描述。
  • Site Documentation –将你的配置生成干净的文档

想要了解有哪些drupal模块可用,你可以访问:drupal模块手册3方模块手册

相关链接:http://drupal.org/node/120642

http://nanwich.infoThink in Drupal(转载时请勿删除)

Drupal版本:

drupal主题

如果要启用一个drupal主题的话,可以导航到Administer>>Site building>>Themes.

 

如果在这个站点从来没有启用过这个drupal主题的话,你需要选中"enable"复选框,接着点击底部的"Save configuration"(保存设置)按钮.

 

为了设置主题如何工作,点击"Configure"链接(不是顶部的标签)

 

输入相应的字段.

 

保存设置.

 

现在先别离开这个页面.

 

 

Logo Favorite Icon

现在使用那个"Configure"标签

我喜欢在"Global Settings"下面完成这一设置,如果你喜欢的话,你也可以一个主题一个主题的分别进行设置.

默认的Logo就是位于页面左上角处的一个小图片。例如,在"Bluemarine"主题上,它用的是Drupal logo

如果你想修改它的话,你可以这样:

  1. 首先,需要检查一下它的大小,因为你自己的logo要使用同样的大小(如果你熟悉HTMLCSS的话,你也可以编辑主题的代码让其适应你的logo,而不是调整图片的大小。在这个新手指南中,我们就不涉及如何编辑主题的代码了)。

主题名

Bluemarine

48

55

Chameleon

49

57

Garland

64

73

Minelli

64

73

Pushbutton

144

63

Fancy

80

80

  1. "Logo image settings"下面,你需要输入你logo所在的路径,或者你需要将其上传上来。
  2. 注意:这些选项都没有取消"Use default logo"复选框。你必须自己选择合适的复选框。
  3. 对于"Shortcut icon"(又叫做favorite icon或者"favicon.ico"),做法也完全一样。如果你要修改它,你需要专门的告诉Drupal,“嘿, drupal ,我要改变这个”。

 

 

现在点击"Save configuration"按钮。如果你是在"Global settings"设置的话,她敬爱那个影响到所有的主题(假定一切正常的话);如果你是在单个主题下面设置的话,那么仅仅影响到这个主题。

可用的主题列表,参看主题

提示:想对一个标准的主题作出一些(或者很多)的修改吗?你可以考虑,将其拷贝到你的/sites/sitename/themes/文件夹下,然后对其重新命名。现在你就可以随心所欲的进行修改了,如果不顺眼的话,你再拷贝一遍就可以了。如果改动比较多的话,而且质量比较好的话,你可以考虑将其贡献给整个社区(当然,注明你的名字)。

Drupal版本:

G.创建内容

“哇,我已经做了很多了,但是在我的站点上,现在还没有任何内容!”那么,现在就让我们添加内容.

 

首先,让我解释一下,你的用户访问你的站点首先看到的一页通常称为首页.在Drupal中称为"front"页面,很像一家报纸.这个页面在Drupal中非常特殊.我知道,你现在已经急不可待了,但在你决定使用哪种内容类型来创建你的首页以前,首先让我们讲一下Drupal中的内容类型.

 

内容类型

Page

Drupal,“如果你想添加一个静态页面的话,比如说“联系”页面或者“关于我们”页面,使用page”。如果你熟悉使用HTML构建网站的话,过去人们通常都这样做。概括一点来讲,一个"page"通常是独立的,而且一般有一个菜单项。将来你也可以将它添加到一本书(book)中。我最初创建的两个站点,基于以前的静态HTML站点,我的首页使用的是"page;"从那以后,我开始改用"story"了。

 

Story(故事)

Drupal说,“Stories是最简单的文章:拥有一个标题,一个摘要(teaser),和一个主体(body)。其它模块可以扩展这一类型。摘要也是主体的一部分。通常可用于个人博客或者新闻”。

 

好了,你一定访问过drupal.org吧,在首页上,除了上面的导航,和右栏里面的区块以外,其中的正文中,包含的就是"stories."通常为6个,最上面的为当前最稳定的Drupal版本消息。现在我的站点也改用了这种形式。“欢迎”消息就是一个story。我使用的是一个用于通知的story节点,站点上的每个管理员都可以编辑它。如果你的站点是关于天气或者卡通的,最好使用story。另一种用途是,如果你用的是net ring的话,你也可以将ring的链接放到story中。

 

Book Page(书)

Drupal说,“一个book()是协作编写的结果:用户一起努力编写图书中的页面,为页面进行排序,复审或者修改以前编写的页面。所以当你有东西拿出来分享时,或者你看到其中一个页面,你不怎么喜欢它,或者你觉得某个页面应该编写的更好一些,这时候你就可以使用book了”。

 

Book的另一种用法是用来收集相关信息。一个book拥有自己的导航,所以它也可以用来做导航用。

 

Blog Entry(博客条目)

你可能已经知道什么是博客了,但是在这里:一个blog是一个日常的想法的总结,或者其它按时间排序的内容。博客条目内容类型是由blog模块添加的。Blog模块允许你有一个多用户博客,这意味着每个人都可以拥有自己的个人博客。它添加了标题和面包屑,用来指示博客作者的名字。一帮情况下,如果你仅仅需要单用户博客的话,最好使用Story节点。

 

现在,决定了要采用的内容了没有?没有,好吧,让我们从page开始;它比较简单。当你决定创建内容时,同时也要考虑一下菜单项。

 

注意:如果你想将你的首页设为"node"Administer >> Site configuration >> Site information),那么你至少需要创建一点内容,并将其“推到首页”(promoted to front page)。如果没有的话,你看到的应该还是"Welcome to your new Drupal site"。手册的另一节创建新的内容可能会对你有所帮助。

 相关链接:http://drupal.org/node/120635

                  Think in Drupal(转载时请勿删除)

 

Drupal版本:

向你的文本中添加图片

有多种方式,可用来向文本中添加图片,每种方式都有自己的优点和缺点。

1.       使用图片模块Image module),以及相关特性。这种方式下,每个图片都是一个节点,这增加了许多能力。

· Image_Attach,为目标节点添加一个独立的图片字段,指向该图片节点。它提供了简单的图片上传功能,但是其它功能有限。

· Image_Assist,它使得能够在文本字段中嵌入图片。提供了可视化的工具,可以选择图片,上传图片,以及控制图片的大小和左右浮动。需要向文本字段中添加必要的HTML。

· drupalimage,TinyMCE编辑器的插件,它使得Image Assist作为TinyMCE的一个字段来使用,将其展示为一个所见即所得(WYSIWYG)的图片(虽然风格不完全与你的主题相一致)。

还有一些未测试的高级特性,包括:

· 批量上传能力。

·可与drupal的相册模块(Gallery module)相集成。
·可与Acidfree模块相集成。

 

2.CCK ImageField。与Image Attach非常相似,但它仅仅能够将图片上传到一个文件夹下,而其它功能有限,比如大小或者样式的控制都有所欠缺。一般都与Imagecache一起使用,从而很好的控制图片的大小。

 

3. IMCE(演示http://ufku.com/drupal/imce/demo).提供了在服务器上,上传和搜索图片的能力。它的功能类似于Image_Assist+drupalimage的集成,但它可以与TinyMCE相集成,从而能够很方便的插入图片,它还可以对插入图片的属性进行更多的控制。但是它的图形操作界面非常丑陋---影响了易用性,而且它相关的相册功能也很不好用,有人专门对此提出了批评。

 

4.或者可以考虑使用FCK Editor。从演示可以看出,它是一个功能强大的编辑器,可与TinyMCE相媲美,而且还拥有自己的图片上传和插入机制。但是:

·它没有自动生成缩略图的功能。(cf Drupal Image)

· 图片就是普通的独立的文件,都放在一个files目录下面-----根据个人需求的不同,这可能也是优点。

 

我犹豫了很久,觉得这个好,那个也可以,但是最终选择使用Image模块:

 

· 安装Image模块,和通常的步骤一样。

· 按照http://mybesinformatik.com/tinymce-and-drupal5的指示,向TinyMCE中添加drupalimage插件。

·TinyMCE Profile中调整设置,从而显示需要的特性。

· 创建一个分类,允许为图片添加标签,这样更易于检索。

 

相关链接:http://drupal.org/node/163346

                    Think in Drupal(转载时请勿删除)

 

 

 

 

Drupal版本:

drupal首页

使用下面的几步,你在将来的任何时候,都能够方便的添加/修改你的首页.

1.       创建你的首页

用管理员登陆以后,从左栏选择

Create content > Page

来创建你自己的内容.完成了以后,点击提交,查看结果.注意,当前的URL(你当前新建页面的路径)应该这个样子:

http://www.example.com/?q=node/# (普通)
http://www.example.com/node/# (使用了简洁URL)

在这里, #代表着节点ID.我们需要这个id,将它拷贝到一个地方,或者记住它.

 

2.       首页

现在你有多种选择:

  • 2.1.将一个单独的页面设为你的首页。
  • 2.2.将你的页面推到首页,它将位于首页页面列表的最上方(这里只展示一个简短的摘要(作为一个预览),你需要点击它才能看到整个页面)。
  • 2.3. 使用Front模块来充分的自定义你的首页(主题化,不同用户角色

 

2.1.将你的页面设为首页

创建完你的自定义页面以后,选择

Administer > Site Configuration > Site Information

在该页面的底部,你将看到“Default front page”(默认的首页),以及下面的这些东西:

http://www.example.com/?q=(普通)
http://www.example.com/(使用简洁URL

紧跟着是一个文本输入字段。在这里你需要输入

node/#

其中#就是前面你拷贝下来的节点id。点击“Save configuration”(保存设置),你的首页自动变为了前面创建的页面。你可以随时对其进行重置,只需要通过仅仅输入node(这个是默认值),就可以了。

 

2.2.将你的页面推到首页去

如果你想把你的页面推到首页的话,你应该返回到步骤1,现在你不点击“提交”,或者编辑你刚才创建的页面(导航到这个地址)

http://www.example.com/?q=node/#/edit (normal)(普通)
http://www.example.com/node/#/edit (using clean URLs)(使用简洁URL

其中#是节点id
无论采取哪种方式,在页面的底部,你将看到一个下拉菜单,叫做“Publishing options”(发布选项),在这里,你需要选中“Promoted to front page”复选框,要做的就这么多。点击提交按钮。

 

 

2.3.使用Front Module

如果你需要对你的首页进行更多控制的话,你可以使用Front模块来

  1. Set a different theme to your front page
  2. 为你的首页设一个不同的主题
  3. Set different front pages depending on user roles (admin, anonymous, authenticated)
  4. 根据用户角色(管理员,匿名用户,登录用户)设置不同的首页
  5. Insert custom php snippets into the front page
  6. 在首页中插入php代码片断

http://drupal.org/project/front你可以找到Front模块



 

安装完Front模块以后,选择

Administer > Site configuration > Advanced front page settings

这里面的下拉菜单都有很好的解释。如果你点击了其中的任何一个,你都会看到:

  • Body:你可以输入你想展示的文本,html,甚至php代码。
  • Select Type:你可以设置,其它用户角色也使用这个首页,对其使用默认的或者自定义的主题,等等。
  • Redirect to(重定向到):你可以设置一个用户要重定向到的地点。

当你设置完以后,点击“Save configuration”,这样就可以了。

 

 相关链接:http://drupal.org/node/265172

                   Think in Drupal(转载时请勿删除)

Drupal版本:

G1.创建一个Page

点击drupal菜单中的"Create content",然后选择要创建的内容类型。

 

标题和主体都自带了很好的说明。在下面有一些可伸缩的字段。"Input format"用于控制你可以向页面中输入什么的;我们假定你是超级用户(user/1),所以你有权使用"Full HTML."

 

如果你安装了Nodewords的话,接下来的部分就是"Meta Tags."它的解释也很详细。

 

使用日志消息来提供相应的信息,这对其他想要编辑你的文档的作者非常有用,当你想编辑自己的或者他人的内容时,日志消息也为你提供了参考。而对于不具有相应的内容编辑权限的用户,他们是看不到日志消息的。

 

日志的记录是基于每次修订(per-revision)的,每当你修订了你的内容时,就会创建一个日志,日志消息的内容是关于该文章的这次修订的信息。如果你对一个页面拥有编辑权限的话,你可以看到一列修订信息(如果你每次编辑内容时都选择创建一个修订的话),通过点击修订标签你可以看到它们相关的日志消息。

 

如果你启用了drupal的核心模块"Path"的话,接下来你将看到URL路径设置。在这里你可以为其输入一个普通的名字,这样在将来你需要引用它的话,你就不需要再使用“node/#”了。提示:如果你是从一个静态网站转为drupal网站的话,你可能需要在名字后面添加".htm" 或者".html",这样搜索引擎仍然可以访问到原来的这个页面。

 

接下来是"Menu settings"(菜单设置),"Title"是菜单项的名字。"Description"是,当用户的鼠标移到该菜单项时所显示的内容。"Parent item"允许你创建可伸缩的多层级菜单。"Weight"允许你设置菜单项在菜单中的相对位置;非常不幸的是,许多Drupal内核中的菜单项都将其硬编码为0了。

 

一般你不需要使用"Authoring information",除非你想将这个页面归功于他人。这一部分的另一个用途是用来控制页面(page)或者故事(story)的顺序,当排序是按照节点的创建时间来进行时。

 

最后是"Publishing options," 在前面你将其设为了默认值,对吧?选择"Published",将会发布节点。选择"Promoted to front page.",能将其推到首页去。

 

提交。

恭喜你,现在你已经为你的drupal站点添加了一些内容了。

相关联接:http://drupal.org/node/120637

                    Think in Drupal

Drupal版本:

G2.创建一个Story页面

对于在前面所讲的创建一个page页面,里面的东西同样也适用于story页面。许多时候,你都可以认为,这两种类型是可以互换的,至少使用两种内容类型是有好处的,这样可以避免潜在的内容类型冲突(例如,分类“冲突”)。

 

Stories包含一个“teaser”(摘要),或者是一段开场白,用来获取读者的注意。摘要的长度可通过两种方式进行设置:

  • 在Administer>>Content management>>Post settings里面。默认为600个字符。你可以修改它。
  • 通过在内容中使用标签< !--break-->(没有空格),将前面的部分设为摘要,而这里摘要的长度不能超过默认限制。

注意:你可能会在一些地方看到使用<break>标签来设置摘要的结束点。这一改变最初是在drupal5.0中,而它带来了很大的争议,所以现在继续使用< !--break-->

 

一个story页面一般没有菜单项的。如果你遵循一般的习惯的话,那么一个"page"适用于静态的独立的内容的,而"story"则用于相关内容的集合(例如,RSS种子,通讯文章,新闻稿等),那么一个story通常是与其它stories放到一块的,那么应该为哪一个story添加一个菜单项呢?一般来讲,用于一组story页面的菜单,应该是一个描述页面,指出如何展示这些story

 

你可能想将story页面推到首页。对于你的“欢迎”消息,你可能想将它放在最上面。不幸的是,这里没有“weight”(重量)属性可用,所以你需要使用"Authoring"里面的日期来控制顺序(或者你也可以使用Weight module(重量模块))。

 

什么是Teaser

下面的内容来自于zoon_unit2007110日发布的一篇帖子。

 

"teaser"实质上是一个文本片断,在用户未读全文的前提下,告诉用户帖子的内容。由于大部分作者通常在文章的首段来对文章做出解释,所以teasers适用于大多数文章。

下面是都发生了哪些东西:

  1. 一个节点包含了整篇文章。
  2. Drupal"teaser"函数,"node_teaser,"从文章中截取了前面的x个字符,作为teaser,它和内容一样可用。这里的x是由drupalAdminister » Content management >> Post settings里面的设置决定的。
  3. 所以,如果你在一个页面列出一列文章的话。如果你想让这些文章每个都展示整篇文章的部分文本,这样就没有必要将所有的内容都显示给用户了,假如你把所有的内容都列出来的话,页面会很长很长,用户会觉得很反感。如果用户读完"teaser"后,觉得该文章不错的话,他就会点击标题进入文章的正文页面了。实际上,teaser的功能就像文章的摘要一样,不同之处在于在这里teaser是由软件截取出来的。如果你想teaser的具体结束位置的话,你可以插入一个注释标签,明确地告诉drupal从哪里截取teaser
  4. 相关联接:http://drupal.org/node/120638

                     http://zhupou.cn 

Drupal版本:

G3.创建一个书页(Book Page)

一般来说,我为每本书仅创建一个书页。也就是第一页,通常介绍这本书的用途。而其它页面,则作为子页面添加上去(准确一点来说,子页面的节点类型仍然为"book page")

 

与page页面大部分都一样,不同的是,书页(book page)有一个父节点选项("Parent")。对于第一个页面,它的父节点为"<top-level>."如果你使用“Add child page”(添加子页面),在父节点选项中(Parent)已经自动为你设置了书的名称。如果你要创建另一个书页的话,你需要弄清楚这个页面应该放在哪本书或者哪个页面下面。

 

书的首页一般应该有一个菜单项。而剩余的页面则不需要,除非它们非常特殊。记住,在drupal中,书是有自己的导航的。

      

你现在阅读的就是一本书("book")。

Drupal版本:

G4. 创建一个博客条目(Blog entry)

在drupal中,博客条目与其它节点类型有一点点不同.假定你启用了"Blog"模块,你应该能够在你的导航菜单中看到"My blog"一项.当你点击它时,在该页面就会有一个“Post new blog entry”(发布新的博客)链接。

 

如果博客是日常的,你可以使用日期作为标题。

 

如果它是一些想法的集合,你可以给它起个有意义的标题。

输入博客内容。

 

当用户访问你的博客时,看到的总是最近发布的博客。

相关联接:http://drupal.org/node/120640

           Think in Drupal

 

 

Drupal版本:

H.自定义区块(Blocks)

下面是一个自定义区块的简单例子.关于drupal区块的更多信息,可参看drupal手册的Blocks页面.

 

添加一个“联系信息”区块

一个组织一般都应该让人们知道如何去联系他们。一个方便的做法是,在你的页面中放上你的邮件地址。这应该是最简单的区块了。

 

  1. 导航到Administer>>Site building>>Blocks
  2. 点击"Add block"(添加区块)标签
  3. "Description" "Body"中填充内容,下面是一个body例子:

Example Organization<br>
123 Main St.
<br>
Mytown, State Zip<br>
USA
<br>
(123) 456-7890

  1. 保存区块。
  2. 现在你可以配置(“Configure”)区块了,添加区块的标题和定义它的可见性。
  3. 点击Configure链接后,进入区块配置页面,输入"Contact Information"(“联系信息”)作为区块的标题。
  4. 现在你应该是否允许用户打开或者关闭这个区块,如果允许的话,哪些角色具有这种能力。你也可以不管它,这样所有人都能够看到这个drupa区块。然后选择这个区块所在的页面;如果不添的话,这个区块将展示在所有的页面上。
  5. 保存区块。
  6. 现在你又回到了区块列表页面。找到你刚创建的区块,为它选一个“Region”(区域)。你可以使用"Weight"参数来设置它在区域中的位置;在这里,我想把地址放到最下面,所以我选了一个比较大的重量值。
  7. 点击“Save blocks”按钮。

 

 

 

添加最近更新声明

 

这是一个相当普遍的做法,特别是对于一个组织的站点,让访问者知道站点的最近更新日期,就更普遍了。这个例子需要你,网管或者站点管理员(有时称为超级用户)来维护这个区块。有办法可以实现自动化,但是现在我们将手动的实现它。

  • 和前面的“联系信息”区块的创建流程一样,把这个区块的重量设置的再稍微大一点,这样就将它放在了底部。

<em>Site Late Updated on Feb. 12, 2007</em>

  • 对于这个区块,我们让它显示在除首页外的所有页面上。所以,在"Page specific visibility settings,"下面,我选择了"Show on every page except the listed pages."单选按钮,并在下面的输入框中输入<front>

附件

大小

block_add_1.png

118.39 KB

block_add_2.png

110.19 KB

相关链接:http://drupal.org/node/120634, Think in Drupal

Drupal版本:

在drupal中使用views创建一个最新文章列表区块

使用drupal的Views模块,可以非常容易的创建一个最新文章列表区块。略加变通,你就可以创建最新评论列表区块,如果安装了评价模块(rating module)的话,你也可以按照分数高低来对节点排序。这里所讲的是用于Drupal5.X。在Drupal 6.X可能会有所不同。

 

步骤1 – 安装Views

下载Views模块。按照指示来安装它。

 

步骤2 – 区块标题

决定这个区块的名称。

 

步骤3 – 节点数目

决定你想在区块中放置几个节点。你也可能需要决定要放置哪些信息。在我们这个drupal简明教程中,我们将仅仅列出节点标题,当然你也可以把teaser(摘要)也列列出来。要展示的单个信息的总量将会影响到你的节点数目,如果只列出标题的话,展示的节点数目就会多一些。

 

步骤4 – 开始使用Views

登录到你drupal站点的后台管理界面,导航到Site Building > Views

 

步骤5 – 区块基本信息

当你来到Views的管理页面以互,点击添加。然后输入基本信息-名称,描述,和访问权限。名称必须是字母数字字符,外加下划线可用,不能包含其它特殊字符。

 

步骤5 – 基本的区块设置

创建区块是非常容易的。在当前页面,你往下拉,直到你看到带有超链接的"Block"。点击它就会显示出区块部分。

在区块部分的顶部,你会看到一个复选框"Provide Block",选中它。这意味着Views将为你创建一个区块。

现在,我们得告诉Views如何展示我们的输出。你有多个选项,但是在这里,我们选用"list View"。这是由于我们仅仅想列出节点标题。如果你想列出更多信息的话,你可以使用"Teaser List"来给出标题和teaser.所以,在"List Type"上我们将选择"List View"

最后,你需要指出列表中节点的数目。在"Nodes per Block"中填入你想要的数字。如果你使用的是"Denver"主题的话,要将列表放在顶部区域的话,你可能选择5个。如果想放在左栏或者右栏的话,你是以使用10个或者更多。这也依赖于你内容的更新速度。

 

步骤7 – 选择字段

完成了上面的步骤以后,你需要告诉views你想展示哪些字段。在"Block"部分下面就是"Fields"部分。点击"Fields"来打开它。然后选择你要添加的字段。然后点击"Fields"按钮。在我们的这个例子中,我们想选择节点的标题。所以我们选择"Node : Title"。如果你愿意的话,你可以为它加个标签,比如"Newest Posts" 或者"Latest News"

 

步骤8 – 过滤

你可能不想在最近发布中展示所有的东西。你可以对它进行限制。为此,你需要找到页面的"Filters"部分。点击"Filters"打开它,这样就显示出来了过滤选项。在这里,你可以选择在区块中展示的节点类型。在"Add Filer"中选择"Node : Type",然后点击"Add Filter"按钮。操作符你需要选择"Is One Of",接下来,你需要在"Value"下拉列表中选出要用的节点类型。

 

步骤9 – 保存View

做完以后,保存你的View

 

步骤10 – 展示区块

导航到Site Building > Blocks。在这里你将看到所有的区块。找到你最新创建的,并为它选择要放置的区域。根据你主题的不同,你的区域可多可少。

指定了区域以后,设置重量(weight)。重量越大,区块在区域中所处的位置越往后。

设置完重量以后,配置区块。你可以决定哪些人可以看到区块,以及区块展示在哪些页面.一个放置最新文章列表的最好的地方是首页.为了实现这一点,你需要找出要这些页面,选择"Show only on selected pages"选项,然后把你的页面输入到文本框中.

当你为这个区块完成了所有的配置以后,保存区块.

 

注意

你可以使用这种方法以其它的方式展示你的内容.你可以展示评价最高的内容或者最近的评论.

你也可能像使用一个特定的页面,来列出你的评价最高的或者最新的25篇文章.有专门的模块能帮你实现这一点.你可以使用"Insert View" 或者"Viewfield"views放到页面中.

 

Views相关的模块位于http://drupal.org/project/Modules/category/89.

相关链接: http://drupal.org/node/234370 ,  Think in Drupal

 

Drupal版本:

I. 使用drupal菜单

介绍

 

在这里,我并没有打算对菜单进行深入详细的讲解.我的出发点是帮你构建一个自己的菜单,让你了解drupal的菜单是如何工作的.关于drupal菜单的一个更完整的指南可参看创建一个菜单结构一文.

我们都知道菜单或者说导航系统,可以成就一个网站,也可以毁掉一个网站.它必须方便人们使用,也就是通常所说的直观性.它必须完整,并且紧凑.

在Drupal官方网站上,有大量讨论菜单的内容.大多数新手刚开始都很难理解drupal的菜单.我使用Drupal已经有一个多月了,而且我还在编写这本简明教程,但是我仍然没有完全理解Drupal的菜单.

对于初学者来说,最容易混淆的莫过于菜单和分类这两个概念.菜单是一个导航系统,而分类是一个用来组织内容的系统.所以说,菜单是通过内容的路径,而分类则用来维持内容的秩序.为了更好的理解Drupal,你必须将这两者区分开来.

使用菜单,你可以直接将其指向一个节点,比如page或者story页面,但是你也可以指向taxonomy/term/id,它将为你展示一个节点列表.比如在http://zhupou.cn/taxonomy/term/3,你可以看到所有关于Drupal 5.x的节点.

 

 

如何创建菜单

Drupal提供了3种主要的方式,3种方式可以联合使用,来为你的用户提供站点导航.

  1. 文本菜单这是标准形式的菜单,就像你在大多数网站上看到的,包括我的在内,都是这种形式.有多种方式,可对其进行改进,比如使用CSS或者单独的book导航(就像我这里用的)。
  2. 标签式菜单因为在外观上更时髦一些的原因,现在这种标签越来越流行了。对于用户来讲,它是否更加有效,这一点还有待商榷。在drupal中,它被分为“一级”(总能看到的标签)和“二级”(下拉出来的菜单)。并不是所有的主题都支持二级链接的。
  3. 书(Books - 书有着自己的独立的组织方式,它们有自己的导航,你在本站就能够看到这种形式。参看创建一个Book页面

 

文本菜单

文本导航是最容易理解的。事实上 ,我现在还不能理解标签式导航中的“二级”菜单的工作方式,而许多人都觉得它应该那样的(下拉)。

在许多帖子中,你都会看到“一级链接”和“二级链接”这样的术语。我觉得,在这个地方是Drupal文档最混乱的一个地方。尽管它们说的非常好,而且我也在使用它们,但对于初学者来讲,它们未必是最好的选择。首先,先使用标准的导航菜单,直到你熟悉了以后,你随时可以对菜单作出修改。

在大多数的时候,当你创建内容时,这种标准的菜单是最好用的,但是有时候你会觉得外观不够美观,需要稍微的调整一下。

当你创建一个page, story, blog,或者book页面时,在提交以前,一个你可能需要输入的字段就是菜单项(如果节点需要的话)。这里有一个“标题”(人们所看到的菜单项)和“描述”(当鼠标移到菜单项时所看到的东西)。

我通常不考虑菜单项的重量,直到我觉看起来有点不顺眼时,再去调整。此时,你可以可以通过编辑你的内容,也可以导航到Administer >> Site building >> Menus,在这里进行编辑。

好的,前面的都比较简单。现在让我们考虑一下子菜单的使用,把一个页面作为另一个页面的子页面。假如你已经有了某个主题的介绍页面,它已经列在了菜单中,比如说“家族历史”。而你当前创建的页面时"1860-1899." 当你构建菜单项时,你会注意到有一个标记为Parent Item."的下拉列表。展开这个列表,找出"Family History."现在你提交当前页面以后,它就成为"Family History"的一个子页面了,使得这个菜单项具有了可伸缩的能力。你已经创建了一个多层级的菜单了!

 

标签式菜单

在支持这一技术的主题中,在你构建导航菜单时,“一级菜单”看起来就是自动完成的,除非你声明一个不同的菜单集。到目前为止,我还不知道二级菜单是怎么显示出来的---我觉得可能需要一个单独的模块吧。我知道,在一个区块中,如果二级链接存在的话,如何显示它们。我觉得这种方式很好,但是开始时它有点难以理解,可能并不适用于所有的人。

 

Books(书)

book菜单是自动为你构建的。你需要管的是菜单项的顺序(提示:重量)。

比较难的一点是,启用book导航区块,它位于Administer >> Site building >> Blocks。你所需要做的是告诉Drupal,将这个区块放到哪个区域中,以及它的相对重量。如果你想要的话,使用样式表,你可以得到更漂亮的外观。

 

更多

将来,你可能会使用taxonomy_menu module(模块)。它有点复杂,但是当你的词汇表不断修改时,它非常好用。它将菜单和分类的不同之处完全抹掉了,因为它允许你把分类当作菜单使用。在这种方式下,菜单时自动生成的。

如果你需要多层级的下拉菜单的话,你可以考虑使用nice_menus module(模块)。

相关链接:http://drupal.org/node/120632 , Think in Drupal

 

 

Drupal版本:

I2.drupal联系表单(Contact Form)

联系表单用起来很简单,但是它的设立和操作却是一件非常复杂的事情.

设立

首先,必须启用contact(联系)模块.导航到Administer >> Site building >> Modules,从核心模块列表中找到contact模块.选中复选框,然后保存设置.导航到Administer >> Site building >> Contact form,在这里你需要设置分类—或者收件人名称[不要将这个与分类模块中的分类混淆了].

例如,销售部门的email应该使用分类"Sales."这样,收件人的地址可能为sales@mycompany.com。如果你需要自动回复发件人的话,你可以在这里声明。如果你不明白所有功能的话,你也不用担心,你随时都可以回到这个页面作出修改。点击提交按钮。

接着点击"Settings"标签。在这里,你可以对个人一小时内发送的email数量进行限制---这将帮助你限制垃圾邮件。你也可以在这里启用个人联系表单,从而允许用户相互联系。点击"Save configuration"按钮。

 

控制对它的访问

对于我来说,这一步完全没有必要,但我觉得有些人可能会用到它。

导航到Administer >> User management >> Access control,找到"Contact module",为角色分配相应的权限。保存修改。这样,对于没有权限的用户,就不会看到这个菜单链接(下一步)了。

 

"Contact"添加到菜单

导航到Administer >> Site building >> Menus。在"Navigation"下面,按照指示启用"Contact"。保存你的修改。

 

在内容中使用它

使用<a href="/contact">Contact Us</a>可以在一个内容页面中添加一个链接。不幸的是,你不能在这里声明你要发给谁。所幸的是,这有帮助。看看Contact Forms module更多信息看这里

需要对联系表单进行定制?可以考虑使用WebForm 或者CCK模块。对Contact_Forms模块的一个最新修改就是允许你结合使用这两个模块。

 

联系表单的垃圾邮件

如果你发现有人通过你的联系表单发送垃圾邮件的话,可以考虑使用Gotcha模块(module)。

 

 

相关链接:http://drupal.org/node/124129Think in Drupal

 

 

 

 

Drupal版本:

J. drupal URL别名

"URL"是"Uniform Resource Locater"(统一资源定位器)的简称.大家都喜欢说“我网页在网络上的网址”。它是浏览器标识一个要展示页面的名字。我们都看到过这样的广告,“详情请登陆我们的网站abcxyz.com.”在这里,abcxyz.com就是他们网站首页的网址(当然,在这里隐含的包括了index.html,也就是省略了这个)

而在默认情况下,Drupal将你的内容称为节点,并通过它们在数据库中的位置来标识它们。所以你关于“澳洲坚果的历史-第一部分”一页,在drupal中应该是这样的"node/167."对于Drupal来说,这是正确的,因为Drupal可以理解这种形式。但是你的用户实际上并不关心页面在数据库中的位置;他们想要的怎么才能再次找到这个页面,或者直到这个页面在他们书签中的位置。

 

所以Drupal提供了对URL别名("URL Alias")的支持,从而允许你为内容提供一个人们更易理解的名字。对于浏览器,服务器,和搜索引擎来讲,这是完全没有必要的。但是对于普通用户来说,它就是必须的。这就是我经常的告诉那些Drupal新手们,一定要启用支持URL别名的Path模块(我也将简单的提到另一个模块Pathauto)。

 

现在,有些人可能会认为,把".htm"放在后面是多余的。这完全正确。确实也没有必要去在后面添加".htm"。我的观点是,如果你想让你的用户看到一个普通的名字的话,像其它的静态网站一样,这时我们就应该为它加上网页的类型,比如".htm"。不过这个是个人喜好,觉得好就加,觉得不好就不加。

 

糟糕,提交页面以前忘记设置别名了?不要担心-Drupal中有补救的方法!首先,访问你所创建的页面。在你的浏览器地址栏中,你将看到它的URL。在最后面的部分,它应该是"node/xxx",其中xxx是一个数字。记下这个数字。现在导航到Administer>>Site building>>URL Aliases。在顶部有一个"Add Alias"(添加别名)标签。在第一个输入框中输入"node/xxx",在第2个输入框中输入"MacadamiaHistory.htm"

 

现在返回,并再次访问这一页面,检查你浏览器地址栏中的URL

 

 如果你的Drupal站点将要包含大量的内容,特别是用户提交的内容,你可能需要使用PathAuto module。这个模块不但能够自动为新内容(根据你设定的规则)生成URL别名,它还可以批量的修改已有内容的URL别名。

 

 

相关链接: http://drupal.org/node/120631, Think in Drupal

 

 

 

 

Drupal版本:

K. 迁移整个Drupal站点与数据库

可以先看看迁移整个Drupal站点与数据库

这个对你可能也有帮助:备份你的数据库

我知道“官方的”的流程是,向主机上上传"tar"文件并解压它。另一种选择是,可以直接从你的PC测试站点上将代码拷贝过去。我试了两次,从我的机子上上传代码,两次都带来了灾难性的影响。(好吧,难道这和我的人品有关!)。所以,我摸索出来了自己的流程。[顺便说一句,这种方式也能够减少带宽的使用,这对于那些带宽受限的人来说是有些帮助的。]

 

我一般都使用cPanel/Fantastico来安装Drupal,(我知道可能有人会对Fantastico不满,但对我来说,它还是不错的)。现在,为了公平起见,我先告诉你Fantastico能做什么,不能做什么。

 

Fantastico仅支持核心功能。她不支持自定义主体,第3方模块,或者定制代码(超出了本书讨论的范围)。Fantastico也没有使用"update.php"(事实上,根本就没有加载它),所以最好不要使用它来升级你的站点。当你了解到这些限制以后,你可能就不再抱怨了。

 

确保在你的测试站点上,模块和主题的版本都正确,并且都能正常工作。

 

下面是我的流程:(顺便讲一句,对于大多数主机,这一流程也基本能够适用)

1.       找一支笔和一张纸,记下你都做了哪些修改。好记性不如烂笔头的,如果你需要重做,或者考虑哪些修改阻碍了向新版本的升级时,这对你会很有帮助。

2.       使用phpMyAdmin(在一些主机上,它隐藏在MySql后面),来备份你的在线数据库。如果你的drupal站点,有大量用户正在创建新的内容的话,那你需要将站点改为维护模式,从而阻止丢失内容。

3.       最好也备份你的测试数据库,以防万一

4.       将你的数据库导入到测试站点中。

5.       下载你上传的所有图片,以及上传的所有模块。

6.       如果你的在线站点和测试站点的drupal版本不一样的话,你需要运行"update.php."

o        打开浏览器,访问你的测试站点。如果看到有地方不对劲或者整个站点一片空白的话,不必惊慌。

o        在地址栏中的URL后面,追加"update.php",然后点击Enter键。如果它告诉你没有相应的访问权限的话,也不用担心。

§         使用记事本或者类似的文本编辑器,打开"update.php".

§         在顶部附近,你将看到:

// Enforce access checking?
$access_check = TRUE;

§         将它改为FALSE并保存。

§         再试一遍。

§         如果仍然有错误的话,你可以搜索Drupal官方网站来寻求解决方案。一般情况下,应该有人也遇到过同样的问题。如果还是找不到的话,你可以发个帖子寻求帮助。将你的站点退出维护模式,当这个问题解决以后,再重新开始。

§         $access_check改回TRUE

o        如果你有一个自定义主题的话,为了正常工作,你可能需要重新启用它。

o        现在查看一下你的模块设置。它们应该一切正常。

o        检查你的内容,特别是首页。确保菜单是正确的。

o        检查任何用到了自定义代码的内容,特别是当你升级Drupal版本时,尤其需要注意这一点。

o        所有的都检查完了吗?好的,现在所有的困难都已经解决。现在开始容易的部分。

7.       好的,现在来做剩余的工作。对我来说,剩余的部分花了不到15分钟,所余对于大家来说,所需要做的工作也非常容易。

8.       如果你当前的站点是安装在Fantastico,那么删除当前站点的文件夹。如果没有的话,你需要手工的删除所有的文件夹。

9.       现在让Fantastico来安装当前的版本。目录字段不要填写,这样就可以装在你的根目录下面了(可能是"public_html")。你提供的用户名和密码应该是超级用户的(user/1.

10.   当完成以后,我一般都让它给我发封关于安装总结的电子邮件。

11.   如果你的用到了自定义主题,第3方模块,或者图片等等的话,使用FTP将它们上传到服务器上的合适位置。

12.   如果有图片或者模块相关的文件夹的话,现在上传它们。

13.   完成以后,在你的测试站点上使用phpMyAdmin创建一个备份。

14.   接着,再次访问你的cPanel,打开phpMyAdmin。选择你的Drupal数据库,接着点击"Import."通过一个文件浏览窗口找到你本地的备份sql,然后点击"Go"按钮。

15.   如果你有一个自定义主题的话,导航到Administer>>Site Configuration>>Themes,启用这个主题。[提示:如果你的站点开始看起来有点怪怪的话,不必惊慌。记住你可以试用http://www.mywebsite.com/?q=user登陆后台管理界面的。]

16.   如果你的测试站点和在线站点目录不一样的话,你可能需要更新IMG链接等等。特别是对于一些硬编码的链接,你一定要记号哪些硬编码的链接需要修改。

17.   现在一切都搞定了。

18.   如果你使用的是Fantastico的话,你还需要多做一点:进入你本地的主Drupal目录,将update.php脚本拷贝到你的服务器上。我不知道他们为什么删掉了这个文件,即便是他们不使用它。你将来可能会用到这个文件。

 

相关联接:http://drupal.org/node/120627Think in Drupal,

 

Drupal版本:

使用phpMyAdmin的drupal备份流程

使用phpMyAdmin的备份流程

截图中使用是phpMyAdmin 2.9.2,这是我本地安装的phpMyAdmin版本.我的网站主机上装的是2.9.0.2,看起来基本上一样.两者生成的结果可相互交换.

  • 接下来的截图为你展示了你的Drupal数据库中的表。不要管这些,点击顶部标签集中的"Export"标签。

  1. 查看Export部分顶部左侧的方块。所有的数据库表都在这里。

  •  

    • 如果在这个数据库中你还安装了其它程序,那么你需要选中你Drupal中所用到的数据库表。
    • 如果你只安装了Drupal的话,在左栏中,点击“Select All.
  • 选中左栏中的SQL单选按钮。
  • Structure(结构)部分,选中下面的复选框:"Add DROP TABLE," "Add AUTO_INCREMENT," "Enclose table and field names with backquotes."如图所示。
  • "DATA"部分,只选择顶部的复选框,其它都不选。如果有预先就选中的,取消对它的选中。
  • 选中"Save as file"选项,不用修改模板名称。
  • 现在,对于压缩,选择"None"
  • 现在点击"Go",将会弹出一个提示,告诉你下载文件。将文件保存到你的数据库中。根据数据库大小的不同,花费的时间也会有所不同。





现在你就备份了你的数据库!(还行吧,是不是?)

下载完成后,你也可以选择"zipped"选项,点击"Go",然后再下载一个文件。如果想要的话,你可以为每种压缩格式都下载一个备份。你可以试试。

 相关链接:http://drupal.org/node/120630Think in Drupal

Drupal版本:

L. 向你的drupal网站加点东西

偶尔,除了内容以外,你还需要更新一些其它东西,比如样式表,或者新的代码.

FTP是File Transfer Protocol(文件传输协议)的缩写.这是一个相当标准的方式,来向你的站点添加文件,代码,样式表等等这样的东西.此时你创建的不是站点的内容,内容都是保存到Drupal的数据库中的.

现在,Drupal官方站点中的帖子会告诉你有哪些好用的FTP程序。如果你用的还是Windows 2000的话,你根本不需要FTP软件。你可以使用Windows,它看起来就像一个文件夹一样,你可以进行拖拽。如果你使用的浏览器是IE的话,这一过程非常方便。

在你IE浏览器的地址栏中,输入ftp:username:password@ftp.domain.com,其中username是你的站点的用户名(不是Drupal里的)password是该用户的密码,domain.com是你站点的域名(不带www)。

这样你就可以看到你站点上的文件了。在Linux中,你可能需要点击"public_html"文件夹,来找到相应的Drupal文件。接下来,找到对应的文件夹,将更新后的文件上传上去就可以了。

 

Drupal版本:

M. 设定drupal Cron

在Drupal.org上,我不能找到一个关于“设定cron”的像样的答案,大家都在抱怨。而我的主机提供商的技术支持人员也不能帮我搞定(“这是一个用户问题,不归我们管…”)

 

我的主机提供商不允许我使用Shell命令(可能是个明智之举)。但是他们多多少少提供了一些标准的cPanel功能。在我的版本中,"Cron"项位于左下边。

 

在我的一个站点中,我还安装了WebCalendar。当我访问cPanel时,我注意到WebCalendar有个命令已经设立。对其做些简单的修改,下面是我使用的命令:
cd '/home/<i>username</i>/public_html/' ; php -q 'cron.php';

注意,这里的username是我主机的用于域名管理的用户ID,而我的Drupal装在根目录下面(实际的"public_html")。

这样Cron就运行了,但是它生成了一些错误信息。

 

Cron终于运行了,但是我还是对这些错误信息有所担心。所以,我就在Drupal站点上进行搜索,的确搜到相关的帖子,但是没有答案。所以我又发了一个帖子。这时有人看到了我的帖子。

他们建议我使用WGET,但是我没有shell权限。由于一些原因,我又检查了一遍cPanel"Advanced"模式。我注意到这里有个帮助提示(当然字体很小,不然以前不会注意不到它)。它说,可以使用GET http://nanwich.info/cron.php(很明显,使用你自己的URL)。我照着做了,错误信息没了,Cron完全正常工作了。

 

对于Cron任务,另一个可选的是http://drupal.org/project/poormanscron里的poormanscron模块。

每当一个页面被访问时,这个模块都回检查Cron的最近运行时间,如果超过了1小时的话(这个时间可以配置),将会调用Cron钩子,这样Drupal就高兴了。只有当所有的HTML返回给浏览器以后,才会触发这些钩子,所以对于用户来讲,不会有任何延迟。

相关链接:http://drupal.org/node/120625Think in Drupal

Drupal版本:

在Hostmonster上使用cPanel接口设立drupal Cron

使用你的hostmonster帐号登录到cPanel接口界面,将页面下拉到底部,查看高级选项部分.

  1. 选择"Cron Jobs".它显示为一个日历图标.
  2. 选择"Standard"(标准)

    • 不要使用email地址,否则的话, cron任务每执行一次都会给你发送一封email.
  3. 输入下面的命令: php /home/+++Your hostmonster login username+++/public_html/cron.php

    • 这个仅用于你的主域名,子域名位于不同的文件夹下.
  4. 选择cron任务多长时间运行一次.
  5. 检查它是否工作 --- 可以在Drupal菜单中的Logs中查看一个Cron任务的运行情况.

 

相关联接: http://drupal.org/node/208579Think in Drupal

 

 

 

 

 

 

 

Drupal版本:

N. drupal分类(Taxonomy)

 

在Drupal.org上,你将看到许多帖子都是关于如何创建和使用分类的(或者“词汇表”("vocabulary")和“术语集”("terms"))。大部分帖子你可能都看不懂---许多我也看不懂。

事实上,如果一个站点的内容越多,那么越就需要使用使用分类,但是这并不意味着,小站点,就不能使用分类了。

为了帮你更好的理解如何使用分类,我将通过一个实例来为你讲解Drupal中的分类。

 

Recipe(食谱)模块应该是一个很好的例子。在我的一个网站上,为了形成更好的社区氛围,为了鼓励大家经常访问我的站点,我决定添加一组菜谱(一个真正的,而不是像本书这样)。食谱模块就用到了分类。

我很快就认识到,如果没有任何组织的话,输入一堆食谱以后,很快就会变得混乱起来。那么,食谱可分成多个类别:Appetizers(开胃),Entrées,Desserts(甜点)等等。所以让我们根据这些东西来建立一个“词汇表”(vocabulary),这样我们就可以管理食谱了。

 

  1.            1,导航到Administer>>Content management>>Categories,点击"Add vocabulary"标签。[在Drupal 6 中,菜单路径改为了Administer>>Content management>>Taxonomy]
  2.            2,输入名字,例如"Recipes"。在“描述”(Description)中输入“Our community cookbook”(我们社区的菜谱)。
  3.             3,选择适用的内容类型。Recipe引入了一个"recipe"类型。
  4.             4,我选择了单一层次。在将来,如果数量越来越大的话,我可以添加更多的子类别(比如“牛肉”,“鸡肉”和“猪肉”),并将其修改为多层级结构。
  5.             5,接着我选择"Required",这样当用户输入一个食谱时,必须为其选择一个类别。

 

填完以后,我们就可以点击提交按钮了。这样你又回到了类别列表页面。此时你应该可以看到你新加的词汇表了。

在它的右边,你将看到一个链接“add terms”。点击这个链接。

 

    1.            1,由于它是单层次结构,所以"Parent"应该为"<root>."
    2.            2,在"Term name"中输入你的第一个术语,比如"Appetizers."
    3.            3,在"Description"中输入"Things for before the meal."(饭前的开胃菜)
    4.            4,其它现在都不用管,点击提交就可以了
    5.            5,添加其它的术语("Salads,"(沙拉) "Soups,"(汤) "Side dishes,"(拼盘)等等)
  1.       
  2. 现在,当一个用户要创建一个"Recipe"时,他需要为其从中选择一个分类。如果他们访问"Cookbook"菜单项(Recipes模块创建的菜单项)时,他们将看到一列分类,他们可以使用这个分类进行浏览。

 

这也不像那些帖子中所说的那么复杂吧,是不是?

 

又例如,我为一个组织建过这样的网站,在网站上,会员可以为每月通讯提交文章。他们希望能用一种方式来管理这些文章,让他们可以根据日期或者话题来评审这些文章。所以我创建了两个词汇表,一个用于发行日期,一个用于话题。现在,当他们点击其中的一个时,就可以看到所有相关的读书报告,电影评论,或者幽默文章。而且,当每个月他们提交新文章时,这些文章将被自动归类到里面去。[这里使用了一个定定义的内容模块,稍加修改就可用作他用。你可以联系我,来得到这个模块。]

 

我在另一个站点上,对FAQs的归类时,也曾用到过drupal的分类。在原始的网站上,在我用Drupal为其改造以前,他们用3个静态页面放置了3种类型的FAQs。没有人想管理这些。我安装了FAQ module(非常好用),为其建立了一个词汇表(vocabulary),带有3个术语(terms)。他们后来又让我添加了3个术语(terms),他们觉得太麻烦,不愿自己去维护站点。

 

 

 

 

 

 

相关联接:http://drupal.org/node/120624Think in Drupal

 

 

 

 

 

 

O. 常见问题

一些问题我们大家都见过;在这里,我给出几个这样的问题.[记住,在论坛上发帖以前,县搜索一下.]

 

表格的格式乱了,图片不能显示了,还有其它的一些奇怪的HTML问题---我觉得每个Drupal用户都会遇到过这样的问题. Drupal默认使用的是过虑了的HTML的;也就是说,只有特定的一些标签允许使用.还有,输入格式将一行很长的文本隔断了.解决的方法很容易:改用"Full HTML"输入格式.我将它设为管理员的默认选项.注意,对于这一输入格式,你可能还想加上URL Filter 和Code Filter;它们也不是默认的.

 

帮忙啊,我启用了站点维护模式,而现在我登录不进去了!---70-80%的用户都遇到过这样的问题(包括我).你仍然可以使用http://www.example.com/?q=user进行登录.注意,这里的"user"不能修改,更不要替换为你的用户名.

 

我不想让匿名用户看到"Create content"菜单---"Create content"通常是"Content"的子菜单项,"Content"通常被禁用的.访问你的菜单管理页面,然后启用"Create Content"上面的"Content".这样你就可以看到一个"Reset"(重置)链接了.点击这个链接.这样, "Content"又被禁止了,这次,对于那些没有访问权限的人(特别是匿名用户)来说,他们就看不到"Create content"菜单项了.

 

我启用了Contact模块,但是当我作为一个匿名用户点击它的时候,我得到一个拒绝访问页面--- 你忘了一步.导航到Administer >> User management >> Access control页面,找到contact module部分,现在你可以为匿名用户赋予合适的权限了,(当然,登录用户也得设置).

 

其它问题可参看手册部分Troubleshooting FAQ.

 

 

Drupal版本:

P. drupal中的链接和图片

是的,在Drupal中,页面之间可以有链接的.这一点和不使用Drupal一样,唯一不同的是,如果你没有使用Path模块的话(URL别名),你会觉得名字有点怪怪的.

 

人们最常犯的错误就是,不知道在前面加一个斜线"/".忽略它,将会导致"404:Page not found"错误,而且,根据你浏览器的不同,可能会附带其它的一些问题,比如莫名其妙的退出登录了.

 

我这个站点的首页是node #4,所以到首页的链接应该为这样: <a href="/node/4">Home</a>.如果启用了URL别名的话,我也可以这样: <a href="/home">Home</a>.

 

"访问你的站点"页面的图片是通过下面的标签创建的: <img src="/files/pictures/Docs/WDP.jpg" align="right" hspace=1>.

相关链接:http://drupal.org/node/120621Think in Drupal

Drupal版本:

Q. 额外的Drupal技巧

这部分给你讲一些技巧,帮你改进你的Drupal站点或者让你的生活更轻松.

 

Drupal版本:

Q1. 追踪drupal模块状态

你可以在你本地建立一个专门的“包罗万象”的站点,里面放上你用到的所有的drupal模块和主题,以及Update Status(状态更新)模块,用来监测模块和主题的状态。

 

状态更新模块将检查Drupal官方站点,并告诉你,你的模块是否有更新的版本可用。

      

你可能觉得这样做有点荒唐,不过在你拒绝这一想法以前,让我给你一些额外的提示:很多人最后发现,他们需要修补,调整或者说是修改模块以及主题。如果你创建了一个“包罗万象”的站点的话,你可以把未被修改的模块和主题都放在这里,这样你就有了一个干净的拷贝,当你的修改到了不能控制时,你可以重新使用这个干净的拷贝。现在,你不仅仅有了一个很好的备份计划,还有一个好处,就是知道了是不是需要升级模块。

相关联接:http://drupal.org/node/124933, Think in Drupal

 

 

Q2. 让多个drupal站点的维护更容易一点

很多人都觉得,浏览器的首页,要么是空白页,要么是网络上的某个页面,但是从没想过这个页面可以是你本地的.

这个是我首页的一部分.你可以看到,我对所有的维护任务(cPanel, FTP,等等)都加了链接,这样我就不用到处查找它们了.

 

我也把drupal测试站点的相应链接也加了进来,这样便也能很容易的找到它们了.

相关链接:http://drupal.org/node/120620Think in Drupal

 

Drupal版本:

Q3. 控制drupal用户登录

我怎么才能禁用“创建一个新帐号”呢?

导航到drupal的后台管理页面Administer » User management >> User settings。点击单选按钮“Only site administrators can create new user accounts”(只有站点管理员才能创建新的用户帐号)。

 

怎么才能完全禁止用户登录呢,禁用以后,当我使用时,又该怎么登录进去呢?

首先,你可以导航到Administer » Site building >> Blocks,将"User Login"(用户登录)区块的"Region"(区域)设为<none>。现在你的用户登录区块就消失了。

 

为了让你能够登录,我提供两种技术:

  • 输入http://www.myexample.com/user(如果你没有使用简洁URL的话,那么为http://www.myexample.com/?q=user)。注意,在这里,是单词"user",而不是你的用户ID
  • 访问你的站点信息设置页面(Site information settings),在页脚(footer)里加入一个"login"链接。<a href="/user">login</a>,我在几个drupal站点上都这么用。

 相关链接:http://drupal.org/node/127454Think in Drupal

Drupal版本:

R. 同步你的本地和远程drupal站点

测试站点,就是用来试验或者开发新内容的地方,它不影响当前的用户,只有当新内容可用时,才迁移到在线站点上去.但是确保你测试站点与在线(live)站点版本的一致性,也是非常重要的.

让我们忽略这一点,就目前来讲,假定我们处于一个理想的状态中,你的测试站点(staging site)总是与在线站点保持一致的,所有新加的东西都要经过测试站点的检验以后才能正式上线.

 

有两种基本的技术,可用于站点的同步:

  • 通过手工的拷贝粘贴,来保持两个站点的内容同步.
  • 周期性的上传或者下载数据库备份.

第一种技术非常耗费时间,如果用户评论很多的话,它很难保证不丢失数据.你还需要记好,都有哪些地方做了改动,除非你是同时更新两个站点的.如果内容之间存在依赖关系的话,你需要小心的按照顺序来对他们进行更新,这样你的随机访问者就不会打乱它了.

 

2种技术,允许将用户评论下载到你的测试站点.在这里,可以将其纳入到内容中去,或者将其删除,或者保持原样.你要小心一些,这样在没有正式上线以前,你不会丢失新的,试验的或者未完成的内容.

 

哪一个更好呢?这个问题我回答不了.你需要权衡利弊,自己做出决定.就我个人来说,以我现在的年龄和记忆力,我觉得第2中技术可能更好一些,当然,也可能会丢掉一些未上传的东西.我还有一个坏习惯,就是在在线站点上更新了内容以后,忘记将修改同步到测试站点中去.

 

这个专题的更多讨论,可参看drupal开发者邮件列表中的这个线程一文,作者Larry Garfield (Crell)

 

 相关链接:http://drupal.org/node/120617Think in Drupal

Drupal版本:

S. 更多drupal阅读资料

现在你已成为了一名Drupal专家了,下面的这些资料,你应该觉得非常有用:

Drupal版本:

T. drupal词汇表

一个节点(node)就是一个容器,用来装东西的.节点中的部分东西是你创建的,还有部分东西是Drupal自己创建的.

一个模块(module)就是扩展Drupal功能的一种方式。它通常包含许多代码(一般为PHP)以及一个样式表(CSS)。例如,如果你想包含元标签来描述你的内容的话。你可以添加"Nodewords"模块(也称为"Meta Tags"模块)。

一个摘要(Teaser)就是关于页面的一段介绍性文字,用来吸引用户访问整个页面。默认情况下,通常为页面内容的第1段,或者前两段,通常在后面还加上一个"read more..."链接。

 

主题,就是用来将你的内容展示给访问者的,怎么展示,使用什么样的样式,布局,等等都归主题负责。它包括的元素有,你的页首,图标(icon),区块布局等等。它也包含代码和样式表。

一个服务器通常是一个能够提供上网服务的计算机。这些服务可能是运行数据库,或者管理信息的收集和传播。

一个浏览器就是用来展示网页内容的程序。实际上,它通常是一组程序集,而不是单个程序;它还使用了一组表格集(例如,设置)用来控制它的展示。例如,IENetscape,和Firefox。它用在客户端,做展示用。

 

URL(统一资源定位器),是网上资源(比如网页)的地址。它是浏览器定位你的内容或者站点的方式。你在浏览器的地址栏中,通常会看到一个URL列表。

路径,通常是特定于某个站点的,用来标识一个资源的位置。它可以是一个完整的URL(参看前面),或者是一个相对位置(比如"files/xyz/image.jpg"-其中"files/xyz"是通往文件"image.jpg"的路径)。

 

HTML是网络的标准语言.它有自己的一套“词汇表”(vocabulary,包括标签,元素,和描述。一个标签就是一个基本组件,它就是告诉浏览器,“下面的内容要根据这些规则进行展示”。举个例子来说,一级标题标签<H1>。大多数标签都带有一些其它的信息,以进一步告诉浏览器下面的内容应该怎么展示。这个声明就称为元素。标签还需要更多的信息来协助它们工作,这就是描述,准确一点来说就是“值”。例如,如果你想要标题居中显示的话,你可以使用"align"元素,并给它一个描述(值)“center”。所以它完整的结构应该是这样的:<H1 ALIGN="CENTER">

 

分类就是对东西的一种划分。可用于对东西的分组,选择和保护。许多Drupal新手可能会认为这是一个非常难的概念(事实上,可以这么认为),然而,我们每个人在学校都学过分类:生物分类,即林奈的分类。在这种分类下,先分为“界”(植物,动物),在“界”之下划分为“纲”,“纲”划分成“目”,“目”划分成“属”,最后是“种”。事实上,在“种”下面还有更细一些的划分,“子种”,或者“变种”,通常所说的“杂种”。大概就是这样,这就是一个分类。

Drupal中,分类的最高层次,被称为“词汇表”(vocabulary),它用来定义“术语集”(terms),或者“标签集”(tags),它可以用于各种情况下。在前面的例子中,我们可以把“生物”作为一个词汇表。而每个词汇表下面都有一个或者多个“术语集”用来描述你的东西。而“术语集”可以是多层级的,也就是说它们存在着等级之分。“属”和“种”就是多层级术语。词汇表用于输入类型(Pagesstories等等。)而“术语集”则指定给特定的节点(对澳洲坚果产量的开创性的研究)。注意,我说的是“术语集”,因为一个节点可以有一个或者多个术语与之相连;例如,那上面的“坚果研究”这篇文章为例,可以为其指定“坚果”,“树木”,“丰收”。通过任何一个术语(或者说关键字)都可以找到这篇文章。

 

面包屑是从HanselGretel借来的术语,在这个故事中,主人公为了走出大森林,在他们走过的路上撒下面包屑作为记号。在目前的计算机用于中,它通常指的是页面顶部附近的一小部分,用来说明到达当前页面所走过的路径。例如,浏览这篇文章时,你会看到顶部附近有HomeDrupal简明教程适用于初学者的Drupal菜谱,它意味着,你首先来到了Home,接着点击了“Drupal简明教程”,最后选择了“适用于初学者的Drupal菜谱”,最终你看到了这篇文章。

 

数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务;数据的存储独立于使用它的程序;对数据库插入新数据,修改和检索原有数据均能按一种公用的和可控制的方式进行。当某个系统中存在结构上完全分开的若干个数据库时,则该系统包含一个“数据库集合”。

 

SQL是数据库的查询语言。例如:SELECT country FROM user_profile WHERE username = "Nancy";它将得到用户"Nancy"所在的国家。

See also:

  • 术语表给出了更完整的Drupal术语。

 相关链接: http://drupal.org/node/122018Think in Drupal 

 

Drupal版本:

通往drupal地狱之门

    在drupal的世界里,有天堂,也有地狱,天堂我没去过,地狱我却经历过多次,地狱之中有冰山,有火海,有毒蛇,有各种各样的刑具.有句话说得很好,天堂有路你不走,地狱无门你却找过来,尽管地狱不好走,但是还是有很多人想去见识见识.

 

   所以,在这里,我给大家指条明路,让你一步步踏入到druapal的地狱之中.你可以这样:

1,在实际的项目中,不管三七二十一,装上个百八十个Drupal模块,并同时启用它们.

2,自定义drupal模块,却不会Drupal表单API,也不愿意学

3,使用php的数据库层的函数,而不是drupal封装好的数据库层的函数.

4,不了解也不愿意去学习drupal的主题机制

5,直接修改drupal核心代码,以及修改第3方模块中的代码

6,大量的使用php代码输入格式

7,使用自己独创的代码编写习惯

8,现在还是使用drupal5.2,没有向drupal5.12升级,并且没有打算向drupal6.x迁移。

9,不愿学习drupal的钩子机制

10,不愿与人分享自己的drupal机能

…..

     当然,还有很多,如果你觉得一条不够用的话,你可以多试几条,当然这是说与drupal开发者听的。

 

事实上,在drupal的项目开发中,出来开发者以外,还有客户,还有老板。有时候,客户的天堂,就意味着开发者的地狱,而开发者的天堂,则意味着客户的地狱。

 

比如说,客户有个项目,资金有限,需求很多,恨不得把程序员给累死,如果真的实现了这个目标,对于客户来说,就是天堂,对于程序员来说就是地狱。同样的项目,程序员可以选择多种方式,为了赶时间,顺利地交活,总会选择这样或者那样的“捷径”,这些所谓的捷径,对于程序员来说,就是天堂,对于客户来说就是地狱。

 

对于老板来说,有了drupal项目,找几个啥都不会的新手,现学现卖,项目过关,无疑是老板的天堂,客户的地狱。这些都是项目管理方面的了。就不再所说了。

 

      有篇英文的文章,我看过,那时好久以前的事了,按照原文的思路,自己写了几句,当作中文版的“通往drupal地狱之门”

相关链接: Think in Drupal

Drupal版本:

Drupal 7 用户体验工程

令人期待的Drupal即将问世了,正式版可能还需要3,4个月的时间。具体的时间就等待Drupal.org上的信息吧。不过代码已经冻结了,测试版的功能已经成型。从测试版里面,以及相关的发布信息里面,我们可以看到Drupal7有很多不同于Drupal6的地方。在这么多改进之处当中,有3个方面是最主要的,一个就是数据库层完全进行了重写,采用了PDO。二就是CCK核心化,Drupal中所有的东西都是基于字段的,有了比节点还基本的一个概念,假如节点是一个分子,那么字段就是原子了。第三个就是Drupal的用户体验的改进。

 
       我们在这里介绍一下Drupal7用户体验工程的用户界面设计原理,总的原理为:
1, 让最常见的任务用起来方便,不常见的任务也能做成。
2, 针对最主要的80%进行设计。
3, 方便内容创建者。
4, 默认配置更优雅,尽量做到开箱即用。
 
Drupal7的设计原理为:
1, 让Drupal去适应用户,而不是让用户去适应Drupal。我们应该去了解用户使用软件的习惯,让Drupal去适应用户的习惯,而不是用户从头学习Drupal。
2, 第一印象非常重要,让Drupal能够给人眼前一亮的感觉。
3, 管理界面应该是管理界面的样子,网站应该是网站的样子。我们应该让用户能够方便的将管理页面和网站普通页面分别开来,在以前,对于初学Drupal的人来说,总会为Drupal的前后台所困惑。
4, 允许自定义,同时也要提供优雅方便的默认配置。
5, 帮助普通用户更好的去改进他们网站的外观,给他们以指导。
6, 尽可能的让Drupal能够开箱即用,安装好了以后,就能够直接去完成内容的创建,而不需要访问config/settings/tools类似的路径
 
   Drupal7的用户界面,尤其是后台的管理界面,通过这个用户体验项目(工程),应该说已经达到了顶尖的水平了,以前这一方面总是受到普通管理员的抱怨的

Drupal与Moodle的集成

Drupal是一个CMS系统;Moodle是一个课程管理系统,也具有基本的CMS功能。在一个项目中,主要使用Moodle,不过最终我还是说服的需求人员,使用Drupal+ moodle,因为对于Moodle我确实不大熟悉。

如果使用Drupal作为一个框架,来调取Moodle里面的资源的话,很多问题解决起来就容易了很多。两者之间,整合到一起,可以发挥两者在各自领域的优势。Moodle专门做课件、课程管理,Drupal负责CMS功能的扩充。

两者之间的集成,并不是件简单的事情,我把能够找到的资源罗列一下,希望能够给后来人以参考。

http://drupal.org/project/moodle

这个只有Drupal6的版本,目前还不支持Drupal7

https://moodle.org/mod/data/view.php?d=13&rid=4240&filter=1

SSO, 实现同步登陆,支持Drupal6

https://moodle.org/mod/data/view.php?d=13&rid=2941&filter=1

SSO, 实现同步登陆,支持Drupal6

http://drupal.org/node/1829924

有人在这里实现了Drupal7下面的同步登陆,

http://drupal.org/project/moodle_courselist

在Drupal中获取Moodle的课程列表

 

http://drupal.org/project/moodle_connector

链接Moodle的数据库

Drupal版本:

Drupal与Moodle的集成2

      我们在前面,介绍的Drupal与Moodle的集成模块,这个资料比较少。我说一下,我们实际的解决办法。实际的用户集成是以http://drupal.org/node/1829924里面介绍的方案为基础的。

     shahdarsh写了两篇文档,介绍的很详细,一个是Drupal端的安装配置过程:

https://github.com/cannod/moodle-drupalservices/wiki/Installation-Drupal-Side

    一个是Moodle端的配置过程:

 https://github.com/cannod/moodle-drupalservices/wiki/Installation-Moodle-Side

    这里面介绍的用户同步方案比较2,使用的是周期性的调用/yourpathtomoodle/auth/drupalservices/auth_drupalservices_sync_users.php
   来实现同步的。

   我在安装的过程中,把Drupal的用户1和Moodle的管理员,都设置成为了admin,导致同步出错。后来我修改了Moodle段的集成代码,使得可以跳过Drupal的用户1。这样就不报错了。

    我在windows下面,使用命令行,直接调用执行auth_drupalservices_sync_users.php,最后是可以正常工作的。但是这不是一个好的解决办法。

    后来又在Drupal端专门写了一个Drupal模块,负责用户的同步,大致的代码如下:

/**
 * 实现钩子hook_user_insert().
 */
function syncuser_user_insert(&$edit, $account, $category) {
  $realname = field_get_items('user', $account, 'field_realname');
  $phone = field_get_items('user', $account, 'field_phone');
  //$zone = field_get_items('user', $account, 'field_zone');
  db_set_active('moodle');
  /*
  db_insert('user')
  ->fields(array(
    'auth' => 'drupalservices',
    'confirmed' => 1,
    'mnethostid' => 1,
    'username' => $account->name,
    'password' => '',
    'idnumber' => $account->uid,
    'firstname' => isset($realname[0]['value']) ? $realname[0]['value'] : '',
    'lastname' => '',
    'email' => $account->mail,
    'phone1' => isset($phone[0]['value']) ? $phone[0]['value'] : '',
    //'city' => isset($phone[0]['value']) ? $phone[0]['value'] : '',
    'country' => 'CN',
  ))
  ->execute();
  */
  db_merge('user')
  ->key(array('idnumber' => $account->uid))
  ->fields(array(
    'auth' => 'drupalservices',
    'confirmed' => 1,
    'mnethostid' => 1,
    'username' => $account->name,
    'password' => '',
    //'idnumber' => $account->uid,
    'firstname' => isset($realname[0]['value']) ? $realname[0]['value'] : '',
    'lastname' => '',
    'email' => $account->mail,
    'phone1' => isset($phone[0]['value']) ? $phone[0]['value'] : '',
    //'city' => isset($phone[0]['value']) ? $phone[0]['value'] : '',
    'country' => 'CN',
  ))
  ->execute();
 
  db_set_active();
 
}

首先是在Drupal的settings.php配置Moodle的数据库连接,这个应该大多数人都懂得。不懂得可以参看相关资料。

开始我使用的是db_insert,后来改为了db_merge,这样插入和更新都可以使用同样的代码了,这是一个小技巧。

更新的代码,就不用多写了,和上面的一样,数据同步是没有问题。Moodle的数据库里面,只存储用户名,没有存储密码。此外,Moodle里面,是必须设置first name, last name的,不然,当你访问课件的时候,总会重定向个人资料的编辑页面,我开始以为这是权限问题,后来在别人的提示,发现是这两个字段没有设置的问题。

 

看了Moodle的代码,就知道Drupal代码质量的优良,不过每个系统都有自己的优点,比如Moodle,他解决了课件管理问题,在教学管理方面有优势,这是Drupal所不能比的。

    就像一个朋友说了,有个免费的用就可以了,就不要抱怨易用性了。

 

     

Drupal版本:

Drupal主题: 此版本与Drupal 7.x不兼容应当予以替换。

新建了一个Drupal主题,拿drupal6的稍微做了一些修改,没有想到出现这样的提示: 此版本与Drupal 7.x不兼容应当予以替换。

 
This version is not compatible with Drupal 7.x and should be replaced.
 
把info文件中的 设置为7.x core = 7.x
去掉了engine = phptemplate
清空缓存还是不行.
 
后来通过搜索找到了一篇文章: http://drupal.org/node/785714,同样的问题.
原因是因为在Drupal7中,content区域是必须声明的.
regions[content] = Content
 
加上这一句后,主题就可以启用了.Drupal7的主题info文件,才发现里面也有不少的变更.
 

Drupal版本:

Notice:undefined variable: title in include(....block.tpl.php)

Notice:undefined variable: title in include(....block.tpl.php)

从一个第3方主题里面拷贝过来的代码,它的里面有title变量,而Drupal自己没有提供这个变量.把这个变量替换为$block->subject.
代码如下:
 
<?php print render($title_prefix); ?>
 
<?php if ($block->subject): ?>
   
<h2<?php print $title_attributes; ?>>
<?php print $block->subject; ?></h2>
 
<?php endif; ?>
 
<?php print render($title_suffix); ?>

错误提示消失,新的区块模板,首先是地位降低了,核心主题里面没有了自己的block模板,其次显示一个变量的时候,需要使用render函数,后在在其它地方也是如此。

Drupal导航教程

这个Drupal教程分为4部分,如何设定一个基本的导航, 如何设定一个多层次导航,如何将导航分别放到不同的Drupal区块中,如何使用Drupal 6.1创建一个Blogroll.这里面使用的主题为Garland.

 

我想为我的Drupal站点设立一个基本的,多层级的站点导航,但是我发现,我读过的所有这方面的帖子,文档都非常混乱,口水连篇,以致于让我准备放弃.实际上,对于一个站点的大部分基本功能来说, 它没有像那些帖子中所说的那么难的.实际上一点也不难,但我找到答案时,我觉得真的太简单了,我差点没有放弃,如果那样就太遗憾了.

 

下面所写的,就是关于我是如何一步一步的创建导航的.在你开始以前,我先说一下,你需要一步一步的来实践.你要边做做学,当你看到你这一步的结果时,然后你再考虑下一步,或者考虑如何修改它,如何完善它.但是首先你需要学会基本的使用,然后再去慢慢的理解它.

 

还有,你必须在开始以前,为你的链接,创建一些实际的内容.这样当你创建导航时,就有东西可用了.

 

设立基本的一级导航

来到后台管理界面Admin > Menu

选择Primary Links

一级链接及可以显示在Garland主题顶部的蓝色旗帜里,也可以放在一个单独的区块中,你可以到管理界面的BLOCKS部分里面,为其选择所在的区域.如果你想放在蓝色的旗帜里面,你可以在菜单管理界面中,选择Add Menu.这个教程假定你想在这里展示一些东西,比如首页,关于我们,等等.

返回上面的步骤.在一级链接页面:

选择Add Item.

这样就进入了admin/build/menu-customize/primary-links/add页面,这里你需要输入路径(Path), Menu Link Title(菜单链接标题)等等.对于路径,你可以输入node/add.对于菜单链接标题,输入为链接展示的名称,比如“首页”,或者“关于我们”,或者其它你想要的.

 

*注意 考虑路径URL
     我刚刚认识到,当你输入node/add作为路径URL时,所有你在一级链接下面创建的链接都将展示在Garland主题的蓝色旗帜里面,但是对于“node/add”的这个链接,只展示给拥有“创建内容”权限的用户,如果没有权限的话,就看不到这个链接了。这是一个权限的问题,如果你不需要这样的话,你可以根据教程下面的指示,将路径URL改为node/id。你也可以通过编辑功能随时修改这个路径URL

你也可以添加一个描述,这样当鼠标移动到这个链接上时,就会显示这个描述。你也可以先留着,等将来你需要的时候,通过编辑,再来修改描述信息。

 

向下滚动页面。

选中Enabled,这将让你的链接显示在菜单中。现在先忽略Expanded选项。如果选中这个的话,那么你的导航永远都处于展开状态,当取消选中时,只有当点击菜单项时,才展开子菜单项。

Parent Item(父菜单项):选择Primary Links(一级链接)。这样就将这个链接展示在了一级链接区块中,也就是Garland主题的蓝色旗帜里面。

保存。

继续在一级链接菜单中添加菜单项,直到添加完成为止。保存它们,你将看到这些链接也展示在了Garland主题的蓝色旗帜里。

 

现在:来到区块管理界面。

找到Primary Links区块,你可以为它选择任意一个你想放置的区域。你把它放在哪里,它就展示在哪里,不过这样就和Garland主题蓝色旗帜里的重复了。如果你不想有两个重复的一级导航的话,你可以跳过这一步。同样,如果你想将你的一级导航分成不同的部分放到单独的区块中的话,你也可以跳过这一步,按照本教程下面的指示,来完成你的设置。

 

设立二级导航:

导航到Admin > Menus > Primary Links页面。

选择Add Item(添加菜单项)。

和前面的一样,输入菜单路径,菜单链接标题。输入描述,选中Enabled。现在该你选择父菜单项了,你从菜单项列表中,选择一个想要的一级链接菜单项。这样你就有了第2级的导航了。

例如:比如你的一个一级链接叫做“关于我们”。现在如果你想在“关于我们”设立一些子链接的话,你就可以选中“关于我们”,这样你的子菜单项就会显示在它的下面。然而你仅仅想把一些单独的页面列在“关于我们”下面的话,你可能就不需要使用二级导航了,只需要多创建几个页面,使用views或者其它方法就可以了。

 

Drupal导航的层级,最多有9级。这就有点像windows里面的文件夹一样,可以文件夹下面再创建子文件夹。

 相关链接: http://drupal.org/node/241980, Think in Drupal

Drupal版本:

Drupal导航教程(1)

如何将你的drupal导航放到不同的区块中

 

并不是所有的人,想在所有的页面展示一个完全一样的导航的。有些人可能想将导航放分成不同的部分,分别放在不同的页面,特别是当你使用像Garland这样的多栏主题时。有不少人在论坛里询问,如何将其分成不同的区块,然后再放到特定的页面中。本部分就为你介绍如何实现这一点。

 

导航到Admin > Menus > Add Menu

选择Add Menu

在这个页面,你将会看到Menu Name(菜单名称),Title(标题),description(描述),和一个保存按钮。

菜单名称将是一个内部ID名称,所有字符都小写,不能有空格,只能为数字子母和下划线。标题为菜单的标题。这个标题将展示在你的区块管理界面里面。同样它还将是所在页面的导航区块的标题。

 

如果你想要的话,可以添加一个描述。这个说明可根据你的需要添加,它将展示在你的admin/build/menu页面。保存。

现在回到菜单管理主界面admin/build/menu,你新添的菜单应该会位于列表中,如果你添加了描述的话,你也会在这里看到它。

选择你刚创建的菜单,你将来到这样的一个页面admin/build/menu-customize/menu-test

选择Add Item

流程和前面所讲的一样。向这个菜单添加你想要的菜单项。然后保存。

来到区块管理界面admin/build/block

找到你刚创建的菜单区块,将它指定到某一个区域中,比如左栏,或者右栏。保存。那么这个区块将会展示所有页面的特定区域中。

 

想将该区块仅显示在特定的页面中?

在区块管理界面,找到你刚激活的区块,然后点击Configure链接。

你就来到了这个区块的配置页面:

Block Title(区块标题),这个默认就是菜单的标题。如果你想覆写它的话,你可以在这里输入你想要的。如果你不想展示标题的话,你可以输入<none>。这里的覆写并不改变菜单的标题,它仅仅用于菜单所在的区块中。

根据你的需要选择其它的配置选项。

现在你应该看到了:“Page specific visibility settings”。

在这里你选择区块所在的页面,有3种选择,1,展示在除下列页面以外的所有页面,2,仅展示在下列页面,3使用php代码控制区块所在的页面。如果你想让一个Blogroll区块进展示在blog页面的话,你可以选中第2个选项,并在下面输入blog/*。其中*是一个通配符,表示选择所有的blog页面。

如果你只想把区块展示在某个页面的话,你只需要在里面加入这个页面就可以了。首先,你需要找出来这个页面的内部路径,比如说node/3,你只需要把它输入到下面的输入框中就可以了。那么这个区块只展示在node/3页面中。如果你还想将其展示在node/4页面的话,你只需要在输入框中另起一行,把node/4也输入进去就可以了。依次类推。

 

保存你的设置,这样就可以了。

现在你就可以创建内容页面了,这样你就可以检查区块的展示效果了。当你看到它们时,你就开始明白它是怎么工作的了,这样,你就可以根据你的口味来调整你的导航了。

 

注意,不要使用'NAVIGATION'菜单来建立你自己的链接。这个是drupal自带的导航,主要用于后台的管理界面。你可以将这个区块展示在任何一个区域中,当然你也可以完全不展示它。

 

对于菜单项的顺序,在Drupal 6.1及以后的版本中,你可以使用拖拽的方式,而在Drupal 5.7及以后的版本中,你可以使用'weight'

 

如果你想添加二级链接(Secondary Links)的话,那么你照着上面的指示做既可以了,它也将会显示在Garland主题下面的蓝色旗帜里。它们不是必须显示在一级链接下面的,它们也不是下拉出来的。如果你想建立一个基本的多层级链接的话,这样的二级菜单满足不了你的目的。你还可以怎么使用它,我不知道。使用一级链接已经很好的解决了导航和链接的问题。

 

 相关链接:http://drupal.org/node/241980 ,Think in Drupal

Drupal版本:

Drupal导航教程(2)

如何创建一个外部链接的BLOGROLL区块。(仍然使用Garland主题

导航到drupal后台Admin > Menus > Add Menu。

菜单名就是菜单的内部ID,应该为小写的子母数字字符外加下划线,不能有空格。

标题名称就是你给你的blogroll起的名称。

如果需要的话,可以输入一个简短的描述,然后保存。这样你就回到了菜单的管理界面。你刚才创建的菜单应该会显示在这个页面。

选择你新创建的菜单。

选择添加菜单项。

这样你就看到一个页面,让你输入路径,和菜单链接标题等等。

在路径里面,输入你的blogroll链接的完整URL

在菜单链接标题中,输入你想在你的blogroll区块中出现的名字。

    例如,路经可以是#http://www.abcdefg.com#(加上#,这样它就不会显示为链接了),而菜单链接标题可以是“Tiny Tots”,当点击这个标题时,就会将你带到abcdefg.com去。

 

为站点链接添加一个描述。简单的一句就可以了。

选中Enable

忽略Expanded,除非你想要一个多层级的链接(可能有些人有多个站点)

Parent Item(父菜单项):选择你新菜单的名字。如果你的Blogroll是多层级的,你可以像前面介绍的那样,选择相应的菜单项,以显示在它的下面。

Weight(重量)的设置是可选的,或者你也可以使用拖拽的方式来设置你链接的顺序。

保存。

 

这就可以了!不需要编码,也不需要额外的模块或者插件,所有的都很简单直接。你可以边创建菜单,边添加内容,并根据你的内容来调整菜单项(比如,添加CSSJavaScript等等)

相关链接:http://drupal.org/node/241980 , Think in Drupal

Drupal版本:

Drupal的论坛

      Drupal自带的论坛,只有论坛的基本功能,就是发帖,回帖,还有回复数.功能简陋到了极点.以前在项目中启用过这个模块,没有用到过更高级的功能.如果你觉得Drupal这个核心的论坛模块不能满足需求的话,可以考虑使用论坛的扩展模块,比如advanced forum, quote, subscription, bbcode, 和comment mover.以及privatemsg 模块 .如果这样还不能满足你的需要的话,你可以与其它专门的bbs软件进行集成.对于drupal5.x,有一个模块可以实现与discuz的集成,但是到目前为止,还没有升级到6.x。

       下面讲一下,我在zhupou.cn上是怎么设置论坛的,首先自己想到的两个论坛栏目,一个是“drupal培训”,一个是“有问必答”,这样的两个栏目,在drupal中就是两个forum(论坛)。首先,启用forum模块,然后在网上找到了几篇文章,大概看了看。到航道admin/content/forum,点击“add container”链接,添加一个容器,在drupal中,一个容器就是放置论坛以及子容器的。这里面不能放帖子。而论坛里面放置的是帖子。

 

     这里添加的容器为“drupal论坛”,然后再添加论坛(forum)“drupal培训”,这个需要点击“add forum”链接。

 

    

     “有问必答”的添加和“drupal培训”一样。保存设置,这样就可以了。我试了一下,可以了,不过有个问题,我自己可以,换个用户就不可以了。这个时候还需要配置以下权限问题,导航到admin/user/permissions,授予登陆用户发帖和编辑自己帖子的权利。

      这样,在一级链接中,加个链接“技术支持”,就可以了。我分别用管理员和测试账号发了一个帖子。另外考虑到大家的习惯,我又跑到了admin/content/forum/settings,将帖子的默认顺序设置为了“Posts - most active first”,最近回复的,最活跃的帖子放到前面。

      此外,我还在admin/content/node-type/forum,对论坛节点的配置选项进行了调整,比如禁用了附件上传,评论按照顺序平铺下来,而不是使用嵌套的形式,而且评论也按照时间顺序进行排列,最新的评论放到最上面。还有就是将评论的预览置为了可选。等等,具体的你可以根据实际需要进行设置。

相关资源:

讓forum module更像討論區

阿舍的Forum 模組,里面有很详细的安装说明

以及官方手册:Forum: create threaded discussions

相关链接: Think in Drupal

 

Drupal版本:

db_add_field db_change_field, drupal 6, drupal 7下的异同

6 db_change_field(&$ret, $table, $field, $field_new, $spec, $keys_new = array())
7 db_change_field($table, $field, $field_new, $spec, $keys_new = array())

 

6 db_add_field(&$ret, $table, $field, $spec, $keys_new = array())
7 db_add_field($table, $field, $spec, $keys_new = array())

我们在升级站点是,flag模块,升级时报错,

 

flag_actions module
Update #6200
  • Failed: DatabaseSchemaObjectDoesNotExistException: Cannot add field <em class="placeholder"></em>.<em class="placeholder">flag_actions</em>: table doesn't exist. in DatabaseSchema_mysql->addField() (line 321 of F:\xampp\htdocs\zuowen\includes\database\mysql\schema.inc).

 

我仔细的检查了这个模块的

•6200 - Add a "repeat_threshold" value to all existing Flag actions.

通过对比数据库,发现这段代码:

db_add_field($ret, 'flag_actions', 'repeat_threshold', $column);

没有起作用,查了一下API,发现Drupal6,drupal7的API变了,我的代码里还是6的,把它改为Drupal7的,重新运行update.php。正常了。

Drupal版本:

drupal 6模块开发教程

可能你先用drupal搭建了一个网站,最初的时候,大部分都是使用的默认功能,也很好用,随着业务的增加,你开始对网站作出修改.最初定制的是主题,同时还可以将一些简单的业务逻辑放到template.php中。随着业务逻辑的不断增加,以及特定的需求,使得drupal默认的功能,不再能满足你的网站的需要了。

这个时候,就需要添加功能。很多人会这样,选择一个功能比较接近的模块,直接修改其中的代码,让它满足自己的需要。这种方法在drupal中,是应该被禁止的,但是还是有很多的人使用这种方法,出于项目周期的考虑,出于开发技能的考虑。不管出于什么样的原因,这种方式在开始的一段时间内,是很方便,很快捷的,但是随着时间的推移,这种方式将会为你带来恶梦,你的网站无法升级,安全漏洞一个接一个,原有的开发人员离职了,后续人员不知道他在哪里动了手脚?

想要避免这种恶梦吗?那么你就需要了解,drupal的模块,你应该学习,和掌握模块的编写,以及drupal中各种钩子的使用。Drupal的模块,就是一个功能。你所看到的drupal核心的,里面有了简单的功能,但是这种功能,通常是比较简陋,朴素的。通过安装模块,就可以扩展这种功能。Drupal的模块放置在两个位置,一个是安装根目录的子目录modules下面,一个是sites/all/modules下面。前者放置的是drupal的核心模块,后者放置的是drupal的第3方模块以及自定义的模块。

      在本部分,我们将从头开发一个模块。通过这个模块,你可以学会开发模块的规范,以及一些常用的钩子函数。为了让本文更有意义,我们决定选用一个实际的例子。在每篇文章的下面,向添加一个咨询的功能。匿名用户,提出咨询,管理员对问题进行解答。这个和drupal自带的评论模块多少有点出入,也就是说,现有的评论模块,不能满足需求了。我们要开发一个专门为自己订做的模块,实现自己的功能。

   相关链接: Think in Drupal

Drupal版本:

1. drupal模块的需求

这的确是一个实际的例子,lonlife的站长提出了,他想在文章下面提供一个咨询功能,我首先 想到了使用drupal的评论模块,我觉得这个就够用了,但是他觉得评论模块不是他想要的,我让他给我一个例子,也就是他想要一个什么样的咨询功能.它给了我一个链接,京东商城里面的.我截一个图,来说明这个咨询功能.

 

网友的咨询信息,和管理员的答复,是放到一起的,一个咨询仅有一个答复.这种方式,是非常适合中国的情况的,我看到很多网站上,都是采用这种模式.我想,评论模块是不是改造改造也可以实现这样的样式,我觉得是可以的,但是修改起来也比较麻烦,这样可能还不如自己写段代码管用.

       另外,自己一直也没有编写过drupal6下面的模块,通过实践,也可以增加自己的经验,另外就是还可以以此写点东西,让更多的朋友学习使用drupal6。何乐而不为呢?

Drupal版本:

2.编写info文件

    要编写自己的模块了,首先要做的就是在sites/all/modules下面创建一个子目录来放置模块的内容。创建文件夹,首先就要为它取个名字,我们就使用咨询的汉语拼音”zixun”吧,这样符合大家的习惯。在目录sites/all/modules/zixun下面,我们可以放置模块的各种文件,比如module文件,安装文件,js,css,还有模块的模板文件,后者是drupal6所特有的,当然还有info文件。我们首先要创建的就是info文件。

   创建一个名为zixun.info的文件,由于我们的功能和评论模块相近,不妨就直接拷贝comment.info中的内容,comment.info的文件内容如下:

; $Id: comment.info,v 1.4 2007/06/08 05:50:54 dries Exp $

name = Comment

description = Allows users to comment on and discuss published content.

package = Core - optional

version = VERSION

core = 6.x

 

; Information added by drupal.org packaging script on 2008-10-08

version = "6.5"

project = "drupal"

datestamp = "1223497210"

 

对其进行修改,结果如下:

; $Id: zixun.info,v 1.4 2007/06/08 05:50:54 zhupou.cn Exp $

name = 咨询

description = 允许匿名用户向站长咨询。

package = 其它

version = VERSION

core = 6.x

 

; Information added by drupal.org packaging script on 2008-10-08

version = "6.5"

project = "drupal"

datestamp = "1223497210"

 

    后面的那4行信息,以及第一行的注释信息,是将模块提交到CVS时系统所加的,删除的话,也没有影响。

   这个时候导航到”管理 > 站点构建>模块”,发现还是找不到我们的模块,我记得主题中,加个info文件,在主题的列表页面,就会显示出主题的相关说明,及选项。但是加了模块的页面以后,看不到zixun模块,是不是info文件我加了中文的缘故。应该不是,会不会哪里写错了?再后来参考了我翻译的那本drupal专业开发指南,发现需要添加一个module文件,才能显示出来。

好了,让我们再加一个module文件,zixun.module,里面没有内容,仅仅是个架子,

<?php

// $Id: zixun.module,v 1.617.2.3 2008/10/22 06:22:38 zhupou.cn Exp $

 

/**

 * @file

 * 让匿名用户可以向站长进行咨询

 *

 * 当启用后,就会在每个节点后面添加一个咨询链接

 * 匿名用户不用登陆就可以咨询

 * 管理员可以对咨询进行管理,包括编辑,删除,答复等等

 */

   最前面是php的开始标签,第2行为CVS标记,是自动生成的,这里是根据评论模块的内容修改而成。再往下就是注释了,用来生成文档,实际中,很少用到,仅仅用来注明模块的功能,用途。

   为什么不把info文件和module文件合在一起呢?就如同本周六我给大家讲解drupal主题的Info文件时提到了,info文件通常都比较短小,用来存放模块,主题的原数据,这些数据可以缓存起来,当系统调用这一模块,主题时,只用调用info文件中的内容就可以了,这样可以提升效率。

    现在在模块列表页面,就可以看到我们的模块了。

Drupal版本:

drupal_get_path_alias 获取当前路径的别名

 Given an internal Drupal path, return the alias set by the administrator.

对于给定的内部Drupal路径,访问管理员设置的别名.
If no path is provided, the function will return the alias of the current page.
如果没有提供路径,这个函数则会返回当前路径的别名.
Parameters
$path An internal Drupal path.
$path 一个内部Drupal路径
$path_language An optional language code to look up the path in.
可选的语言代码,用于限定路径的范围所在
Return value
返回值
An aliased path if one was found, or the original path if no alias was found.
如果找到了别名,就会返回别名,如果没有找到,就会返回原始路径.
 
<?php
functiondrupal_get_path_alias($path = NULL, $path_language = NULL) {
 // If no path is specified, use the current page's path.
 if ($path == NULL) {
    $path = $_GET['q'];
 }
 $result = $path;
 if ($alias = drupal_lookup_path('alias', $path, $path_language)) {
    $result = $alias;
 }
 return$result;
}
?>

Drupal版本:

drupal_write_record

Drupal提供了很多API函数,学习这些API函数,需要比较多的时间,但是,一旦学会了,使用Drupal自己的API函数,就会给我们带来很多的方便。drupal_write_record就是这样的一个Drupal API函数。

drupal_write_record($table, &$record, $primary_keys = array())

这个函数包含三个参数:

$table、数据库表的名字,必须定义在schema中。

$record,一个要被插入的对象或数组,这里使用的是引用传递。

$primary_keys,如果没有设置主键,表示新建;如果设置了主键,则表示更新。

 

drupal_write_record的优势,就是将Drupal数据库的插入、更新操作合并成一个。统一了起来。我们来看一下drupal_write_record的源代码:

function drupal_write_record($table, &$record, $primary_keys = array()) {

  // Standardize $primary_keys to an array.

  if (is_string($primary_keys)) {

    $primary_keys = array($primary_keys);

  }

 

  $schema = drupal_get_schema($table);

  if (empty($schema)) {

    return FALSE;

  }

 

  $object = (object) $record;

  $fields = array();

 

  // Go through the schema to determine fields to write.

  foreach ($schema['fields'] as $field => $info) {

    if ($info['type'] == 'serial') {

      // Skip serial types if we are updating.

      if (!empty($primary_keys)) {

        continue;

      }

      // Track serial field so we can helpfully populate them after the query.

      // NOTE: Each table should come with one serial field only.

      $serial = $field;

    }

 

    // Skip field if it is in $primary_keys as it is unnecessary to update a

    // field to the value it is already set to.

    if (in_array($field, $primary_keys)) {

      continue;

    }

 

    if (!property_exists($object, $field)) {

      // Skip fields that are not provided, default values are already known

      // by the database.

      continue;

    }

 

    // Build array of fields to update or insert.

    if (empty($info['serialize'])) {

      $fields[$field] = $object->$field;

    }

    else {

      $fields[$field] = serialize($object->$field);

    }

 

    // Type cast to proper datatype, except when the value is NULL and the

    // column allows this.

    //

    // MySQL PDO silently casts e.g. FALSE and '' to 0 when inserting the value

    // into an integer column, but PostgreSQL PDO does not. Also type cast NULL

    // when the column does not allow this.

    if (isset($object->$field) || !empty($info['not null'])) {

      if ($info['type'] == 'int' || $info['type'] == 'serial') {

        $fields[$field] = (int) $fields[$field];

      }

      elseif ($info['type'] == 'float') {

        $fields[$field] = (float) $fields[$field];

      }

      else {

        $fields[$field] = (string) $fields[$field];

      }

    }

  }

 

  if (empty($fields)) {

    return;

  }

 

  // Build the SQL.

  if (empty($primary_keys)) {

    // We are doing an insert.

    $options = array('return' => Database::RETURN_INSERT_ID);

    if (isset($serial) && isset($fields[$serial])) {

      // If the serial column has been explicitly set with an ID, then we don't

      // require the database to return the last insert id.

      if ($fields[$serial]) {

        $options['return'] = Database::RETURN_AFFECTED;

      }

      // If a serial column does exist with no value (i.e. 0) then remove it as

      // the database will insert the correct value for us.

      else {

        unset($fields[$serial]);

      }

    }

    $query = db_insert($table, $options)->fields($fields);

    $return = SAVED_NEW;

  }

  else {

    $query = db_update($table)->fields($fields);

    foreach ($primary_keys as $key) {

      $query->condition($key, $object->$key);

    }

    $return = SAVED_UPDATED;

  }

 

  // Execute the SQL.

  if ($query_return = $query->execute()) {

    if (isset($serial)) {

      // If the database was not told to return the last insert id, it will be

      // because we already know it.

      if (isset($options) && $options['return'] != Database::RETURN_INSERT_ID) {

        $object->$serial = $fields[$serial];

      }

      else {

        $object->$serial = $query_return;

      }

    }

  }

  // If we have a single-field primary key but got no insert ID, the

  // query failed. Note that we explicitly check for FALSE, because

  // a valid update query which doesn't change any values will return

  // zero (0) affected rows.

  elseif ($query_return === FALSE && count($primary_keys) == 1) {

    $return = FALSE;

  }

 

  // If we are inserting, populate empty fields with default values.

  if (empty($primary_keys)) {

    foreach ($schema['fields'] as $field => $info) {

      if (isset($info['default']) && !property_exists($object, $field)) {

        $object->$field = $info['default'];

      }

    }

  }

 

  // If we began with an array, convert back.

  if (is_array($record)) {

    $record = (array) $object;

  }

 

  return $return;

}

 

实际的drupal_write_record用例,摘自Field validation Alpha1版:

function field_validation_rule_save($values) {

  // save rules data

  if ($values['action'] == 'add') {

    drupal_write_record('field_validation_rule', $values);

    $ruleid = $values['ruleid'];

    if ($ruleid) {

      module_invoke_all('field_validation', 'rule', 'add', $values);

    }

  }

 

  if ($values['action'] == 'edit') {

    drupal_write_record('field_validation_rule', $values, 'ruleid');

    $ruleid = $values['ruleid'];

    if ($ruleid) {

      module_invoke_all('field_validation', 'rule', 'edit', $values);

    }

  }

}

 

此外,Drupal专业开发指南,对此有介绍:使用drupal_write_record()进行插入和更新

drupal汉化

Drupal界面文本,默认使用的是英文(比如“Log in”按钮,和"Add new comment"文本),但是这些界面文本可以翻译成中文。对于中文,简体和正体(繁体),都已经有了drupal内核的完整的汉化包,而对于第3方模块,部分已经汉化了,但是许多还没有汉化(如何使用这些汉化包,可参看本地化模块(locale module)).

对于drupal汉化,我们还有很多的工作要做。比如在drupal内核的汉化包中,个别地方汉化的不彻底,有些地方不是很贴切,还有很多地方需要改进,drupal的中文化还有很长的路要走。不过与其它语言相比,drupal的中文化算是做得比较不错的了,毕竟到目前为止,没有哪个语言把所有的第3方模块完全翻译完了。

 

如何贡献drupal汉化包

你可以在http://drupal.org/project/Translations页面找到简体和繁体的汉化包,以及对应的工程,简体为http://drupal.org/project/zh-hans,正体(繁体)为http://drupal.org/project/zh-hant

 

更多界面汉化信息,可参看

对于内容的翻译以及国际化,可参看翻译,多语言内容,以及国际化

中文化可参看:http://drupalchina.org/forum/8

为drupal6更新翻译。

 

相关链接:  http://drupal.org/contribute/translations , Think in Drupal

Drupal版本:

Drupal内核的翻译模板

译者首先应该下载翻译模板文件的压缩包,然后将这些文件翻译成他们自己的语言.翻译流程方面的更多信息,可参看译者指南(当然这个页面也是里面的一部分).

翻译后的文件应该存放在contrib-cvs/translations/id下面,其中id为一个RFC 4646语言代码.如果你不知道你的代码,可以在翻译的邮件列表中询问.

你只能把翻译后的文件放到这个目录下面.一个脚本将生成一个合成的id.po文件.注意填写每个文件的头部信息,并将这些文件的后缀从.pot改为.po.还有,首先从general.po文件开始,这里面的字符串出现的次数不止一次,因此你只需要翻译一次,就可以在多个地方重复利用了.它还需要创建可下载的文件.除了一个id.po文件以外,还包含一个installer.pot文件.这个是用于drupal安装器的,不会将其中的内容导入到Drupal数据库中.

如果你没有CVS帐号,你的语言项目已经存在的话,你可以在这个项目下面创建一个问题,并把你的文件作为附件传上去.如果不存在相应的语言项目的话.你可以在翻译模板所在的页面,也就是http://drupal.org/project/drupal-pot,创建一个问题,并将你的文件上传上来.

注意,Drupal内核开发小组不会检查翻译的准确性以及正确性的.

如果你对翻译模板提取器,有什么想法或者疑问的话,你可以访问它的项目页面,以及在上面提交问题. http://drupal.org/project/potx

       原文作者: killes@www.drop.org

 

相关链接: http://drupal.org/project/drupal-pot , Think in Drupal

Drupal版本:

如何编辑.po文件

这个页面是用来简洁的讲述如何编辑.po文件的,从而将一个翻译好的项目贡献给社区.更多背景知识可参看#240243:参与进来:翻译部分的工作.

由于我至少需要25个单词,才能发布这篇文章,所以我在这里引用Havamal的一首诗:

你不能承受其重的
生活的艰辛
比智慧更珍贵.
认识不同的人
胜过收获黄金.
智慧仅仅是懒人的安慰剂.

 相关链接: http://drupal.org/node/314231 , htThink in Drupal

Drupal版本:

drupal翻译的状态

本部分是用来讲解如何显示drupal核心界面翻译的状态的.不幸的是,随着drupal的发展,这种方式已经过时了,google的夏季代码项目本地化服务器,提供了一种新的方式.不过在没有采用这种方式以前,你还可以使用这里讲述的方式.

检查你的翻译的状态

为了查看PO文件中有多少字符串已被翻译好了,你可以试试这行代码:

for i in *.po; do echo -n "$i: " ; msgfmt --statistics $i ; done

许多PO编辑器已经包含了这一特性。

 

相关链接: http://drupal.org/translation-statusThink in Drupal

Drupal版本:

在CVS中,根据多个.po文件创建一个单独的po文件

在一个CVS文件夹中,包含了所有的小的po文件,如果你想把它们合并到一个po文件中的话,那么可以使用下面的命令(仅适用于linux/unix)。你需要在这个CVS文件夹下执行这一命令。

$ msgcat --use-first  general.po [^g]*.po | msgattrib  --no-fuzzy -o nl.po

当然,你需要把nl改成你自己语言的代码。汉语为zh-hans.

 

相关链接: http://drupal.org/node/12890Think in Drupal

Drupal版本:

大家共同翻译drupal

为了方便大家一起翻译,可以将Drupal的POT文件切成多个子部分,每个部分之间都不重复.

在drupal核心中,多次出现的字符串都被放到了general.pot文件中了.这样就保证了,这些字符串将被翻译成同样的字符串.如果模块里面包含的可翻译的字符串少于或者等于10个的话,那么这个模块就不能拥有自己独立的POT文件,而它们的字符串将被添加到general.pot文件中.

当然,项目组成员之间还需要密切配合,这样才能保证翻译的质量.

如果一个语言,对某些语句,存在多种译法的话,那么就可以单独创建一个PO文件,来放置这些可被修改的字符串.比如在汉语中,可以将you翻译成你或者您,这个需要根据你站点具体情况来决定。

相关链接 :http://drupal.org/node/11276Think in Drupal

Drupal版本:

常用的drupal PO文件编辑器

推荐的drupal PO文件编辑器有(没有优先顺序这里):

  • XEmacs(po-mode):运行在X Unices上.
  • GNU Emacs (po-mode):运行在Unices上.
  • KBabel:运行在KDE上.
  • KAider:在KDE4上,用于替代Kbabel的
  • poEdit: Linux, MacOSX, 和Windows
    从1.3版开始, poEdit开始支持复数形式.
  • OmegaT是另一个翻译PO的工具.它底层用的是java,所以具有跨平台特性(包括GNU/Linux 和Windows).下载地址SourceForge.
  • AquaEmacs,用于Mac OS X用户,它是从GNU Emacs迁移过来的.更多使用帮助和技巧可参看Emacs维基.里面没有包含po-mode,但是很容易就可以添加上来.
  • GNU Gettext (Linux/Unix)用于GNU翻译项目. Gettext还提供了一个msgmerge,用于合并翻译成果.
  • Vim(具有Linux/Unix 和Windows版本),有一个PO ftplugin插件,用来编辑GNU gettext PO文件.
  • LocFactory Editor (OS X).
  • gted是一个eclipse插件,用作gettext编辑器.由于Eclipse用的是java,所以这个编辑器也具有跨平台性.

注意,一定要下载最新的版本,复数形式是gettext标准最近新加的.

在Windows配置带有po-mode的XEmacs

相关链接: http://drupal.org/node/11131 ,Think in Drupal

Drupal版本:

如何合并翻译

假如你有一个fr.po文件,里面包含了几个drupal模块的翻译.这些drupal模块更新了,有些字符串被修改了.那么现在更新后的module.pot文件里面就是空的.你需要把这些修改,合并到你的翻译中,从而 充分的利用原有的翻译成果.

首先,检查你使用的PO编辑器,看它是不是有一个合并的功能.

没有的话,你可以试试UNIX CLI工具msgmerge,它和GNU gettext是一起的.

 

更好的方式是,你可以使用merge.sh,这个是KDE小组对msgmerge提供的一个封装好的批量处理函数.下载这个文件,把它放到你的bin/ folder(你的$PATH所在的目录).在你的系统上,至少需要安装一个GNU gettext 0.16版,或者更高版本.然后运行以下命令:

merge.sh fr.po module.pot

其中fr.po是已有的翻译, module.pot为该模块更新后的pot文件.然后,使用PO编辑器打开你的fr.po文件.

参看msgmerge文档.

 

相关链接: http://drupal.org/node/205049 , Think in Drupal

 

Drupal版本:

使用poEdit时出现的问题

poEdit的windows版本1.3.1(原作者写作时的最新版本,现在1.4.2了),看起来需要额外的步骤才能识别复数形式(如果你编辑的一个词语是复数形式的话,即便是你翻译了它,当你移到其它词语时,翻译的结果也不会出现在poedit中,同样即便是你保存了,也不会)

复数解决方案#1

如果你找到了一个复数形式的单词,那么关闭poedit,使用一个普通的文本编辑器比如写字板(不能用word)来打开你正在翻译的文件,然后查找复数形式的单词,比如你可以看到类似下面的形式:

#: modules/comment.module:187 modules/node.module:89
msgid "1 comment"
msgid_plural "%count comments"
msgstr[0] "1 commento"
msgstr[1] "%count commenti"

 

这个时候,我们只需要简单得把msgid文本翻译到msgstr[0],把msgid_plural文本翻译到msgstr[1]中,保存文件,然后关闭编辑器,然后再使用poedit打开.这种方案就是,把复数形式的提前用别的编辑器翻译好后,然后再使用poedit编辑器.

 

复数解决方案#2

为了在poedit中使用复数,你可以先在类目里面将语言设为英语,之后再对其修改.

语法是:

nplurals=2; plural=(n != 1);

这样就解决了我在翻译成瑞典语时的问题:

#: modules/aggregator.module:100;711;722
msgid "1 item"
msgid_plural "items"
msgstr[0] "1 inlägg"
msgstr[1] "%count inlägg"

我在PO Edit 1.3.1中这样用,没有报错,即便是保存时也不出错.

 

复数解决方案#2

你可以在类目设置里看到PO edit用到的复数形式:

nplural=INTEGER; plural=EXPRESSION

 

仅有一种形式的情况:

有些语言,单复数同形,就是没有分别.此时PO edit用到的复数形式就应该为:

Plural-Forms: nplurals=1; plural=0;

此类语言包括:

芬兰乌戈尔语系

匈牙利语

亚洲语系

日语,

韩语

汉语

突厥/阿尔泰语系

土耳其语

译者注:

下面所讲的就是其它类别的语言的设置了,我们用不到,我在poedit1.4.2把复数形式设为nplurals=1; plural=0就搞定了。

 相关链接: http://drupal.org/node/17564 , Think in Drupal

Drupal版本:

在Windows上搭建带有po模式的XEmacs

XEmacs很早就支持Windows,你可以在这里下载它http://www.xemacs.org/Download/win3. XEmacs绑定了po模式(po-mode)(无需GNU gettext).

然而如果要编辑UTF-8编码的PO文件的话,还是会遇到一点麻烦的,我是这样设置的:

 

1,使用Netinstall安装XEmacs 21.4.13. http://www.xemacs.org/Download/win32/setup.exe

2,使用文件http://www.suiyokai.org/tomonori/xemacs/xemacs-i586-pc-win32-21.4.13-mul...里的文件来替换C:\Program Files\XEmacs\XEmacs-21.4.13目录下面的对应文件.

3,将MULE包安装到C:\Program Files\XEmacs\mule-packages目录下(可从http://ftp.xemacs.org/xemacs/packages/xemacs-all-mule-packages.tar.gz下载该文件)

4,将环境变量EMACSPACKAGEPATH的值设为:

C:\Program Files\XEmacs\site-packages;C:\Program Files\XEmacs\mule-packages;C:\Program Files\XEmacs\xemacs-packages

5,为了确保在打开文件时能够自动的探测到Unicode,需在你的初始化文件(init.el)添加以下几行:

(require 'un-define)
(set-coding-priority-list '(utf-8))
(set-coding-category-system 'utf-8 'utf-8)

6,最后添加下面这行,以自动启用po-mode:

(require 'po-mode)

 

这可能有点麻烦…,不过XEmacs还是功能很强大的。如果你以前没有用过XEmacs,那么还需要多花点时间学习一下。

另外,你的安装目录不一定是C:\Program Files\XEmacs。我在这里仅仅用来说明问题。

 相关链接:http://drupal.org/node/25117 , Think in Drupal

 

Drupal版本:

如何使用一个本地化服务器

有好几个翻译小组都开始使用本地化服务器(也称作翻译服务器)进行翻译了.可以在服务器的项目页面可以看到有哪些小组使用服务器了.

在进行翻译以前,先阅读翻译站点上的信息,以及该语言项目页面的相关信息,看是不是有该语言的具体指南,流程,或者术语.

 

注册/登陆到站点上.根据站点的配置,译者可能需要加入到他想要翻译的语言所在的小组中去.

每个字符串都可以作为翻译或者建议添加上去.在一些服务器上,所有的用户都可以添加翻译,而在其它服务器上,大多数用户只能添加建议,而建议只有经过授权用户批准以后才能转变为翻译.

当然,还可以从.po文件中导入翻译。注意:服务器现在还不能检查新的字符串是不是和旧的一样。如果有人导入的翻译中,大量字符串已经存在数据库中的话,那么就会造成大量的建议冗余。

 

服务器使用Unicode字体创建基于文本的图标。如果你的图标不能正确显示的话,你可以检查一下你的浏览器与Unicode 'Dingbats'区块 兼容性。注意:可能你需要安装一个支持Unicode ' Dingbats '区块字符的字体。这些字体名单可参看支持Unicode区块' Dingbats '的字体

更多资源:

 

相关链接: http://drupal.org/node/302194Think in Drupal

Drupal版本:

如何搭建一个本地化服务器

在将来,所有的翻译都将使用本地化服务器,这个适用于所有的语言.更多信息,可参看本地化服务器项目页面.在2008年1月份的状态更新中,项目维护者写道:

这个项目可用于上百个模块的翻译了,已经很好用了 ,但是到目前为止,还未成为drupal.org的主流翻译方式,还没有成为官方使用的方式.

所以,在等待官方主流的服务器的同时,一些翻译社区已经建立了自己的本地化服务器了.在项目页面有这方面的一个列表. DrupalChina简体中文汉化工作站的地址为http://www.drupalchina.org/hanhua/.

注意: 这个模块还有很多地方需要改进.有多个已知的问题尚待解决,并且用户接口和功能也可能发生改变.在决定使用这个服务器以前,先看看里面的问题列表,再作决定.

注意:从通常的编辑.po文件的方式,转为使用本地化服务器,这将影响到整个翻译小组。在作出决定以前,需要征得大家的同意。

预备条件:

  • 你安装的PHP应该带有PEAR Archive_Tar包(这个需要zlib PHP扩展—为了检查你的PHP是否装了zlib扩展,你可以检查phpinfo页面的"zlib"部分)。这个需要提取Tar (在 l10n_localpacks 和l10n_drupalorg 模块中)和生成Tar(在l10n_community 模块中).

1,安装和启用模块

安装以下drupal模块:

阅读模块的README文件,看看里面是不是需要其它的安装指示。

访问admin/build/modules并启用以下drupal模块:

  • Locale (core) (本地化 核心)
  • Localization community(本地化服务器包的一部分)
  • Localization community for local packages(本地化服务器包的一部分)("Localization community for drupal.org"这个是最终用于drupal.org的服务器,不能使用这个)
  • Translation template extractor (翻译模板提取器)
  • 可选的:

    • Views
    • Organic groups
    • Localization groups (part of the Localization server package)
    • Localization group(本地化服务器包的一部分)

2,配置权限

导航到Administer > Users > Access control (admin/user/access),设置以下权限:

  • access localization community:匿名和认证用户
  • administer localization community:仅用于管理角色
  • submit suggestions:认证用户
  • submit translations and approve suggestions:你可以将这个权限授予所有的认证用户,也可以仅授予一小部分核心用户。

3,添加要被翻译的语言文件

在你的服务器上创建一个目录用来保存要被翻译的项目。

导航到Administer > Localization server > Local package connector (admin/l10n_server/l10n_localpacks)。在"Local packages directory"下面添加你要创建的目录的名字。

将你要翻译的Drupal对应版本的tarball拷贝到你刚才创建的目录下面。(tarball就是http://drupal.org/download的.tar.gz文件)。对于你想要翻译的第3方模块和主题,也可以采用同样的方式。

4,收尾

删除不想要的语言。(待完善)

导入当前的翻译。(待完善)你可以选择把它们作为批准了的翻译导入,也可以作为翻译建议导入。



注意:如果你将同一文件导入了两次的话,那么就会在里面得到一份建议,与批准的翻译完全相同。

导航到Administer > Site building > Blocks (admin/build/block).激活区块"Translation help",点击"Configure",在"Custom visibility settings"下面选择"Show this block by default, but let individual users hide it"。不过你也可以选择"Show block for specific roles: authenticated user"。

 

里面还有一个"Bookmarked filters"区块。不过当前这个没什么用,就不用管它了。

这个模块的语言页面的信息是最终用于drupal.org官方的。你可以使用本地化模块对其进行适当的修改(可参看,创建一个自定义语言集来代替drupal术语一文)

每个语言都有一个平台页面。如果你需要向这里添加一点内容的话,你需要为创建一个词汇表vocabulary,每个语言对应一个术语"l10n-server-[language code]"。

本地化服务器的列表,可参看项目页面

 

和其它站点一样,记住经常备份。

更多资源:

 相关链接:  http://drupal.org/node/302196 , Think in Drupal

 

Drupal版本:

drupal界面翻译的技术背景

       对于drupal开发者来说,如果想为模块添加多语言支持的话,可以参看手册的多语言支持部分.

       Drupal核心和第3方模块/主题的界面翻译, 是完全独立于这些项目本身的开发流程的. Drupal核心和第3方模块/主题的开发者为代码中要被翻译的文本专门添加了特殊的标记.需要使用一个提取程序来收集这些字符串,并生成一个翻译模板文件.由于在翻译领域已经有了相关的工业标准,我们选择了一个已有的标准,有很多成熟的工具支持这一标准.

        GNU Gettext工具集提供了大多数翻译所需的解决方案.由于Drupal使用自定义的标记来标明所要翻译的文本,所以我们提供了自己的工具来生成Gettext翻译模板,生成Gettext翻译模板模板以后,就可以使用任何支持Gettext的工具来编辑模块和译文了(通常一个简单的文本编辑器就可以了).Drupal可以导入翻译后的Gettext模板。Drupal.org,根据你翻译的文件的不同,语言的不同,将翻译文件放在了独立的地方。

 

翻译流程

下面是翻译的流程(点击查看大图):

Drupal translation processes

Drupal核心和第3方模块/主题的翻译流程基本相似,但是也有重要的区别。

Drupal核心的翻译

      为了保持工作的一致性,我们为每个发布的drupal版本提供一个Drupal核心模板,所以译者可以下载这些预生成的翻译模板,并使用它们的工具来完成翻译。此时你就不需要自己生成模板了。记住,我们只在一个drupal版本将要发布的最后阶段,才生成模板。否则的话,生成的模板就不稳定,随着Drupal的变更,你需要不断的修改。你可以选择使用任何支持po文件的编辑器。通常,你可以找到Drupal以前版本的翻译文件,使用Gettext工具集你可以重用这些已有成果。最后,你将得到一组翻译好的文件。现在,你需要将模板的后缀名.pot改为.po了。一旦你把翻译提交到我们的版本控制系统中后,那么这个翻译就会被打包发布到了drupal.org上,大家就可以下载它了。

 

       如果你的语言在我们的系统中还不存在,你可以在contrib-cvs/translations下面使用你语言的代码添加一个子目录,从而创建一个新的翻译项目,接着,在drupal.org上添加一个项目。如果你没有CVS帐号的话,你可以在该翻译模板项目页面创建一个问题,并将你的翻译文件上传到那里。有些具有权限的开发者可能会帮你把它们提交到CVS中。这样就会为你的翻译创建一个项目,而你也将成为该项目的维护者。最终,你的翻译将出现在下载页面

 

Drupal第3方模块/主题的翻译

      就如图中所展示的一样,drupal第3方模块/主题(下面成为模块)的翻译稍微有点复杂。有些开发者为他们的模块生成了翻译模板,并将其放到了模块的po/目录下面。这确实不错,不过这些模板很快就过时了。所以建议你,当你开始翻译时,先使用翻译模板提取器生成最新的模板。现在,模板的翻译将放在该模块的po子目录下面。如果你有CVS帐号的话,你可以把文件提交到这里,如果没有的话,你可以在该模块下提交一个问题,然后让模块维护者提交你的翻译。

更多资源:

 相关链接:http://drupal.org/translators ,Think in Drupal

 

Drupal版本:

drupal翻译指南

每个语言都有自己的指南.下面是一些基本的指南,你可以依次为起点将Drupal翻译成自己的语言:

 

 “Linux学校:本地化和翻译”里面的建议很值得参考:

你的任务是…表达内容,所以对于原始文本已可以使用意译(当然,首先所讲的内容要表达出来)。阅读原文,理解它的意思,然后再考虑使用自己的语言表述同样的意思(不需要逐字翻译)。

 

如果译者的前后用语能够具有一致性的话,那么人们就更容易理解Drupal了。如果你把Drupal中的一个字,前后翻译成了多个不同的同义词,那么对于同样的功能,读者可能就不知道你在讲什么了。为了在你的整个Drupal站点上保持这种一致性,推荐你使用一个单词对应表,专门记载Drupal中常用术语。英语-挪威语drupal术语对照表为此提供了一个很好的示例。如果你想创建一个自己的对应表的话,那么需要动员自己语言的Drupal社区人员共同讨论相应的标准和对应译法。最好不要自建一个对应表,而是从已有翻译项目中重用已有的译法。

另外重要的一点是,本地化文件的写作风格。如果你的翻译项目已有了一个正式的风格的话,那么就遵守它。如果风格更口语化,那么就采用这种风格。如果你觉得你的翻译比原有的更好,那么就可对其进行重写,不过此时也要采用同样的写作风格。

 

还有,你还要注意drupal中特定文本在的长度。有时候,比较长,你可以多说一点。如果长度比较短的话,你需要长话短说了。

 

尽可能的把网络和技术术语翻译成自己的语言,尽量避免使用英语术语。如果你不确定这个术语的特定译法的话,你可以向相应的权威部分询问。对于那些尚未标准化的术语,不妨引入新的术语。当年“鼠标”一词开始使用时,大多数人都觉得这个词很荒唐可笑,不过现在也被大家接受了。

其它方面,则会由于语言的不同而不同。你可以联系你的语言的翻译项目的维护者,或者联系你的语言的特定社区。

References:

参考:
Drupal挪威的手册页面的翻译部分
Linux学校:本地化和翻译

自由软件的Danish译者指南

 

相关链接:http://drupal.org/node/13220Think in Drupal

Drupal版本:

drupal第3方模块的翻译

第3方模块中的可翻译字符串是独立的,没有包含到Drupal核心翻译模板中.模块作者可以到翻译模板提取器项目中下载potx-cli.php或者potx.module,用来生成他们自己的POT文件.提取器的使用指南可参看该项目的README.txt文件.生成的POT文件应该根据模块名来命名,不过这里使用.pot后缀,例如event.module的翻译模板为event-module.pot.这个文件应该放到translations(drupal6)子目录下面.而对应的翻译,也应该放在同一个目录下面.例如,现在event.module的translations子目录就包含了下面的文件: de.po, es.po, event-module.pot, he.po, hu.po.

 

译者应该首先翻译general.po文件中的文本.这里面放置的是通用的一些文本,这些字符串通常在Drupal中出现多次,对它们进行统一翻译,可以保持前后的一致性.

 

以前,在drupal5及更早的版本中,用于翻译的.pot和.po文件是放在每个模块或者主题目录下面的./po子目录中.尽管这个是通用的习惯,但是只有Autolocale模块涉及到了这一点.而在Drupal6中,为了用户友好性,将这个子目录重命名为了./translations,并且Drupal6自带了Autolocale模块的大多数功能.模块和主题应该将它们的翻译模板和翻译放到./translations目录下面,这样Drupal6可以自动导入它们.

 

相关链接: http://drupal.org/node/11396 ,   Think in Drupal

 

Drupal版本:

翻译Drupal文档

Drupal文档也可以翻译成其它语言。大多数特定语言的Drupal社区都有自己的文档。

如果你想翻译Drupal文档的话,可以与本地的Drupal社区联系。如果你的语言还没有一个本地社区的话,那么你可以联系Drupal核心翻译项目中你的语言的维护者。他们会为你提供帮助的。

如果还是找不到组织的话,你还可以看看groups.drupal.org上的区域小组中,是不是有本地语言的组织。

下面列出来的是一些特定语言社区的drupal手册页面的链接。(如果链接过时了,你可以在文档问题中通过提交问题来通知我们

Drupal版本:

drupal翻译,多语言,和国际化

翻译用户界面

你可以翻译界面文字 (比如"Log in"按钮和"Add new comment"文字).对于许多语言来说,都已有了完整的或者部分完整的翻译可用.你需要:

·         Locale  (核心模块)

·         翻译下载

更多可参看:

·         译者指南(如何贡献翻译)

·         本地化客户端(Localization client)(3方模块,使得界面翻译更加容易).

·         概念文章:翻译-Drupal 5

 

对从右到左语言的支持

如果你的网站的文字是从右向左展示的,那么你需要一个支持RTL的主题,比如Drupal 6.x 的核心主题Garland,或者Drupal 5.x Garland BIDI. 更多RTL主题,可参看主题下载页面.

 

drupal多语言内容

如果你站点的内容需要使用多个语言的话,你有多种选择.主要的有:

·         Content translation (core module, verson 6.x only) (核心模块,仅用于Drupal6.x)

·         #translatable (contributed module) (第3方模块)

·         Internationalization(第3方模块)(手册

·         Localizer(第3方模块)(手册

更多可参看:

·         All contributed modules for multilingual functionality

·         与多语言功能相关的所有第3方模块

·         Tutorial - Building a multi-language site

·         教程构建一个多语言网站

 

其它的drupal国际化挑战

当你为世界的某一特定地区或者特定语言的组织创建网站时,会遇到各种各样的挑战,比如说,日期格式,各种特殊字符,货币,和税收计算。更多信息可参看下面的链接,如果你有东西分享的话,可以将它添加到这里。

更多资料:

·         翻译支持论坛

·         亦难解答

·         各种语言的支持网站名单

·         groups.drupal.org – 国际化(用于内容翻译和其它的国际化问题)

·         groups.drupal.org – 翻译(用于界面翻译)

·         翻译邮件列表

·         groups.drupal.org – 特定地区的各种组织 (一些特定语言的组织列在“工作组”下面,而不是“地区”下面)

 

 

 

 相关链接:http://drupal.org/node/254214Think in Drupal

 

Drupal版本:

使用SSH/Shell命令快速升级Drupal

 

    本指南是对官方升级指南的补充.请先阅读UPGRADE.txt文本中的官方升级步骤,以及Drupal.org的相关文档,以确保你了解升级过程中的各个方面.本指南是为具有SSH/Shell经验的高级用户所写的,只有当你熟悉SSH/Shell命令并且理解潜在的风险时(比如,没有撤销功能),你才能使用这里所讲的步骤.为简单起见,本指南中的术语SSH指的是任何类型的远程或者本地Unix shell/命令行.

 

 

本指南的目的,是为高级用户提供一系列的SSH/终端命令,使用这些命令,你可以在1分钟内升级一个Drupal站点(为了运行升级命令,你首先需要备份,备份时间会有所不同).

 

你可以使用FTP完成相同的步骤,但是使用SSH可以节省大量的时间(与使用FTP删除和上传文件相比, SSH可以明显地加快速度).使用SSH使得站点的升级和重新上线更加快捷,这当然是件好事.

 

提示:一旦你熟悉了这一流程以后,为了进一步加快你的升级速度,你可以将升级过程中的每一行命令复制粘贴到一个文本文件中,以供下次升级时参考使用.可以对文本文件中的命令进行“三击”,从而选中整行命令,将其拷贝到你的SSH客户端中,然后运行命令。使用Alt-Tab (Windows) 或者Cmd-Tab (Mac)在你的文本文件和SSH客户端之间快速切换,以加快Drupal的升级速度。注意,一些Windows编辑器不支持“三击”(写字板支持)。如果你喜欢的话,你可以使用一个shell脚本将整个流程自动化(这样你就不能对整个过程进行太多的控制了)。

 

准备你的站点

  1.      1,如果你在本地开发服务器上,比如WAMPMAMP等等,安装了一个备份站点的话,你可以先在这个站点升级一下---这样你就心里有底了,当在这里升级成功后,你再升级在线站点的话,就会不越到太多的麻烦了。
  2.      2,将你的Drupal站点切换到Off-line模式下,这样在升级过程中,用户就访问不了你的站点了,也就不会遇到这样或者那样的问题了。你可以导航到Administer > Site configuration > Site maintenance (admin/settings/site-maintenance)进行设置。
  3.      3,确保你以站点管理员(user 1)的身份登录。否则,在运行update.php文件的后半部分你就会遇到问题,以致于进行不下去。如果你忘记了登录,就运行了update.php,结果页面就会通知你在哪一步你需要获得相应的访问权限。

 

 

备份你的站点

下一步是备份整个站点,包括文件和数据库。如果没有备份的话,千万不要升级。大多数情况下,你可以通过你的主机控制面板来完成备份,当你具有SSH访问权限的话,使用命令行备份将会更加快捷。参考文章:备份你的Drupal站点。这也有一个非常有用的备份脚本,如果你喜欢的话,就可以使用它,或者你可以使用下面的基本命令进行手工备份:

  1.      1,首先在你的backups文件夹(如果不存在的话,先创建一个backups文件夹)下面,使用日期创建一个子目录。确保互联网上访问不了这个文件夹:

    mkdir /home/yoursitename/backups/08-17-08

  1.      2,现在备份数据库(根据你的目录路径需做出相应的调整):
    mysqldump -u username -p drupal_database > /home/yoursitename/backups/08-17-08/yoursite_db.sql
  2.      3,接下来备份你站点的文件(同样,你可能也需要做些调整):
    tar -czvpf /home/yoursitename/backups/08-17-08/yoursite.tar.gz /home/yoursitename/public_html

 相关链接:http://drupal.org/node/297496 , Think in Drupal

 

Drupal版本:

使用SSH/Shell命令快速升级Drupal(1)

升级你的站点

我们假定你没有修改Drupal的核心文件(如果你修改了任何一个Drupal核心文件的话,你的升级过程会变得麻烦起来或者甚至非常困难),而且你将所有的个人数据(比如,第3方模块,主题,和文件)都放在了/sites文件夹下(对于Drupal5,你可能将你的/files文件夹放在了站点的根目录下,而对于Drupal6,/files在默认情况下是放在/sites目录里面的),然后你就可以自信的删除其余的Drupal文件和目录了,并将最新的Drupal版本上传上去:

  1. 导航到你Drupal站点的根目录下(下面的命令都是在根目录下运行的):
    cd /home/yoursitename/public_html

 

  1. 创建一个临时目录,用于保存Drupal的旧文件/文件夹,直到你确定升级完全成功以后,再将其删除(这样做,而不是将旧文件立即删除,是为了应急,如果升级由于这样或者那样的原因失败了,使用这个备份可以快速的恢复原貌,而不用使用整个备份):
    mkdir d-backup

 

 

  1. 接下来,使用下面的命令,将出了你的个人数据以外的所有Drupal文件和文件夹,都移到临时的d-backup文件夹下。.htaccess robots.txt 文件没有包含进来,这是由于你可能对它们作了修改(如果没有的话,将它们也加入到这个列表中):
    mv CHANGELOG.txt COPYRIGHT.txt cron.php includes index.php INSTALL.mysql.txt INSTALL.pgsql.txt install.php INSTALL.txt LICENSE.txt MAINTAINERS.txt misc modules profiles scripts themes update.php UPGRADE.txt xmlrpc.php d-backup

 

  1. Drupal.org上下载最新的Drupal版本(或者使用下面的命令,调整一下drupal的版本号就可以了)。一般来讲,对于同一分支的不同版本,你可以大胆的进行升级(例如,drupal6.1升级到drupal6.4),不过最好还是先阅读一下每个版本的UPGRADE.txt文件。然而,对于不同分支之间的升级,比如drupal5.x升级到drupal6.x,就需要较多的准备工作了。有些主机不支持wget命令,所以这里提供了可选的curl命令(如果两者都不支持的话,只好使用FTP了)。

使用wget
wget http://ftp.drupal.org/files/projects/drupal-6.4.tar.gz

使用curl
curl -O http://ftp.drupal.org/files/projects/drupal-6.4.tar.gz

 

  1. 解压缩下载的文件(它将创建一个自己的子文件夹,所以不要担心它与你的文件混在一起)。这个命令假定你在当前目录仅有一个下载的Drupal文件,如果还有其它的话,你需要使用准确的名字,来代替命令中的通配符:
    tar -xzvpf drupal-*

 

  1. 进入新创建的子目录中:
    cd drupal-*

 

 

  1. 运行下面的命令,将新的Drupal文件移到你站点的根目录下。只能移动与d-backup

文件夹里同名的文件和文件夹,保留所有的个人文件和文件夹(比如/sites /files目录)最后的../就是告诉计算机将数据移到上一级文件夹下,也就是你站点的根目录:

mv CHANGELOG.txt COPYRIGHT.txt cron.php includes index.php INSTALL.mysql.txt INSTALL.pgsql.txt install.php INSTALL.txt LICENSE.txt MAINTAINERS.txt misc modules profiles scripts themes update.php UPGRADE.txt xmlrpc.php ../

 

  1. 返回到你站点的根目录:
    cd ..

 

  1. 如果你有其它额外的文件需要放在Drupal核心文件夹中的话(例如,如果安装了jQuery Update模块的话,把jquery.js放到/misc文件夹下),你也可以使用命令来完成。很少有模块让你将文件放在模块目录以外,所以这可能构成不了一步。下面是几个常用的例子:
    cp sites/all/modules/jquery_update/jquery.js misc/jquery.js
    cp sites/all/modules/image/image.imagemagick.inc includes/image.imagemagick.inc

 

 

  1. 最后,在你的浏览器中输入example.com/update.php,按照指示来升级你的数据库。不要修改"Select versions"字段集下面的任何下拉菜单选项;简单的运行update.php.你现在可以回到Administer > Logs > Status report (Drupal 5) 或者 Administer > Reports > Status report (Drupal 6),来确认你的drupal版本了。

 

 

清理临时文件/文件夹,并将站点重新上线

  1. 现在升级已经成功完成了,让我们将临时文件夹d-backup删除掉(记住,你现在仍然有“实际的”备份文件,在需要的时候还可使用)。同样,也删除下载的Drupal tar.gz备份文件,以及他解压缩用的drupal-*文件夹。可使用下面的命令,一步完成所有的删除工作(只有当其它的文件或者文件夹未以drupal-打头时,你才可以这样,因为它将删除所有以drupal-打头的文件和文件夹):
    rm -rf d-backup drupal-*
  2. 许多Drupal站点管理员喜欢删除他们drupal站点根目录下的各种.txt文件(比如,UPGRADE.txt, README.txt,等等),因为这些文件很容易将当前安装的Drupal版本信息暴露给外界。在你的Drupal安装目录下,除了robots.txt以外,你可以删除任何其它的.txt文件。如果你要删除这些文件的话,在将来的drupal升级中,可以调整步骤37里面的命令,以将这些文件排除在外。
  3. 完成以后,现在你就可以让你的drupal站点重新上线了,在Administer > Site configuration > Site maintenance (admin/settings/site-maintenance)页面调整drupal站点的状态。你应该测试站点以保证一切正常。

 相关链接: http://drupal.org/node/297496Think in Drupal

 

Drupal版本:

北京10月drupal meetup---drupal首页制作

      如果要制作一个网站的话,首先想到的就是首页,从首页开始,先得到一个简单的模型,然后再逐步的去实现相关的功能.对于drupal网站的建设,当你搭建好环境以后,第一步就会遇到首页的制作了。

     根据Drupal网站的首页的复杂程度,可以采取不同的方式,我所要讲的就是我在工作中,曾经碰到过的一些方式,可能会有所遗漏,如果有所不妥的话,欢迎指正。

 

大概可以分为以下几种:

1,  将一个page页面设为首页

2,  把各种类型的节点推到首页去

3,  使用cck为首页单独创建一个节点类型

4,  使用front模块

5,  使用drupal的panel模块

6,  使用nodeasblock模块

这个分类不大规范,仅仅作为参考。

 

drupal的首页制作,有多种方式,可谓条条道路通罗马,很多复杂的情况自己也没有遇到过,我会搜集更多的一些资料,到时候和大家分享一下。

 

相关链接: Think in Drupal

Drupal版本:

1.drupal首页制作-前期选型

讲首页制作,我们先找个案例,这个当然是假定的,要选取的是个很简单很简单的例子了,客户要建一个网站,用来发布新闻,网站的主题是关于drupal的,新闻分3类,drupal国际新闻,drupal国内新闻,drupal安全公告.每个分类下面,有这个分类的文章,在网站的首页,是显示关于3类新闻的相关信息,简单的介绍,或者是3类中最近发表的一些文章.

这样的网站,很多地方都用得到,一个机构,一个学校,公司,都会遇到这种需求.比如,可以把drupal换成joomla,换成公司.这类网站也是最简单的一种.

那么我们看看怎么实现这样的网站.当你知道你要做的网站是什么样子以后,接下来考虑的是使用什么程序,什么语言,来实现你心中的这个站点. asp? 很多公司的网站都是用这种技术实现的,这和微软软件的汉化程度有关,不错的选择..net?还是微软的,asp的升级版,也不错。Jsp,用的人在中国相对比较少,不过不少有实力的公司都在用它。这个还不错。Php,用的最广泛了,在世界范围内。事实上,每种技术特别是语言层级的,都可以解决这样的问题。但是你在考虑的时候,不得不考虑成本,考虑网站以后的维护,包括升级性。这个时候你就需要权衡。你要做的是一个新闻分类发布系统,有没有现成的可用呢,很多这类的软件,现成的,国内的我听说过的dedecms,国外的有joomla,drupal,还有.net的dotnetnuke。

是自己找人从头定制一个呢,还是找人使用现有的软件通过2次开发,这个也需要权衡。至于怎么决策,这是领导的任务,也是那些技术相关领导的任务。好了,现在决定使用php,使用drupal来实现你的网站。你找到了我,听说你做过不少的网站,这个帮我看看吧。私活,ok接了。需求很简单,drupal很强大,实现起来很方便。你半信半疑。不过以前看过我的文章,觉得还具有一定的可信性,决定让我做做试试。

现在开始选drupal版本了,drupal有两个稳定版本,一个是drupal5.x,现在已经到了5.11了,另一个就是drupal6.x,现在已经到了6.5了。前者有丰富的模块支持,后者由更强的最新特性,速度,用户体验与前者相比都有不少的提升。这时候还是需要进行选择,从程序员的角度,来说,选择drupal5.x无疑是对的,有过开发的经验,各种模块都已经熟悉了,轻车熟路,而且比较稳定,用起来放心。Drupal开发者会告诉客户,我们使用前者吧,这个版本更稳定,更节省时间。但是对于客户来说,要考虑的就与程序员不一样了。客户看到的是,drupal5.11和drupal6.5都是免费的,6比5大,也就是更高级,更强大,将来使用的时间也更长,就是说2年内不会落伍。客户坚持使用drupal6.5。很多人,遇到这种情况,程序员,其中的不少都会说服客户,采用自己的观点。不过这里我们假定客户就是上帝,上帝永远是对的。我们决定采用drupal6.5。

drupal有一个最佳实践经验,就是当有更高的稳定版本出现时,你需要马上得跟进,至少要准备跟进。现在drupal.org还是跑在drupal5.x上的,但是这并不应为着,官方没有打算升级,事实上,以及专门成立了一个升级小组,专门负责向drupal6的迁移,只不过由于涉及到的方面太多,工作量比较大而已,一个小组,3个月的准备时间。这是题外话。但是对于新站点来说,现在建站,就应该采用drupal6.x。这个是正确的选择。

       Drupal版本也选好了,现在让我们开始网站的制作之旅。

相关链接: Think in Drupal

Drupal版本:

10.1使用drupal6.5制作中英文双语网站

       我们把views 和panels的内容独立了出来,先跳过去.现在我们已经看到,已经将网站搭了起来,也基本上满足了客户的要求了.现在客户又提了出来,要国际化,drupal的新闻,要有英文的版本,来扩大知名度,打入国际市场.

       在drupal5种,国际化只有一个local模块,内容的国际化需要第3方模块的支持,比如localizer.而在drupal6种,i18n得到了进一步加强,除了核心的local模块以外,还增加了Content translation模块,这个模块我没有用过,让我们便实践便完成这篇教程的编写。

     在管理界面admin/build/modules,选中local和Content translation(内容翻译),点击保存,弹出来“

Some required modules must be enabled

  • You must enable the Locale module to install Content translation.

Would you like to continue with enabling the above?

点击“继续”.两个模块同时安装成功了,在drupal5中,如果存在依赖关系,你必须一个一个的分别选中保存,来完成安装,在drupal6中,可以同时安装存在依赖关系的模块。而系统会自动识别里面的依赖关系,并弹出前面所示的对话框。这一点也是6对5的改进。

 

       Local是用来翻译后台界面及模块生成的页面的,而内容翻译模块,是用来翻译内容的,什么是内容,顾名思义就是节点,就是区块,以及菜单导航等等。导航到admin/by-module,找到local模块所在的部分,查看里面的内容,在这里你可以配置该模块的权限,添加新的语言,以及翻译管理界面。翻译界面的url为admin/build/translate,菜单位于“Site building”下面,可见i18zn在drupal6种的地位进一步提升了。不过还好,与drupal5相比,local模块的变化不算太大。

再来看看内容翻译模块,在admin/by-module里,找到这个模块所在的位置,里面只有两个链接,1是配置权限,2是帮助链接,有点失望了,培植权限对于大多数站点都没啥用的,所以不用管,让我们看看帮助页面里面有啥提示。帮助里面给出了详细的使用说明,可惜是英文的,读了一遍,没有完全明白,怎么办?让我们导入drupal6的中文包。详细的看看这个页面都讲了什么内容。

跑到drupal.org上看了看,又有新的新闻了,那就是09年的华盛顿drupal大会正式开始卖票了,而且卖的挺火,啥时候drupal在中国也能这么火就好了。好了进入下载页面,找到drupal6的汉化包的位置,project/zh-hans,下载汉化包。

里面没有安装说明,解压后里面有很多文件。不知道怎么办了。先不管它,先到admin/settings/language/add,把简体中文添加上去。在网上找到了安装说明,如何使用6.x中文安装包。将汉化包拷贝到drupal的目录下面,没有反应,在翻译界面的导入页面看到一点提示,删除简体中文语言,再重新添加一遍,有反应,出现了导入添加语言的进度条,而且没有抱错,看来成功了。将简体中文设为默认语言,看到了汉化成果。Drupal6的汉化这么简单,比5还容易。向那些为汉化包作出贡献的朋友说声感谢了。

好了,导航到内容翻译的帮助页面,看到如下内容,就是内容翻译的指南了:

内容翻译模块使得站点文章可以被翻译为其它语言。内容翻译模块与本地化模块(locale模块用于系统界面的翻译,并用于管理并开启指定的语言)一道,用于创建并维护对站点内容的翻译。

设置内容翻译与开启翻译支持的内容类型。

  • 在权限设置页面给适当的用户角色分配翻译内容的权限。
  • 在语言设置页面添加并启用想要的语言。
  • 决定哪些内容类型支持翻译功能。要对某内容类型开启翻译支持,进入类型编辑页面,在多语种支持下拉框中选择启用,包括翻译选项。(多语种支持框在流程设置一栏下。)记住在启用多语种支持后保存该内容类型。

设置启用了翻译支持的内容类型:

  • 在创建或编辑文章时,使用语言下拉框选择恰当的语言。
  • 在翻译页签处为文章添加新翻译或编辑已有翻译。此翻译页签(tab)使用一个特制的编辑表单,在显示原文的同时,允许添加新的翻译或编辑已有翻译。只有拥有翻译内容权限的用户才能看到此页签。
  • 翻译要及时更新,已准确反映原文内容。翻译状态标志提供了一种跟踪失效翻译的简便方式。例如,当编辑文章后,勾选将翻译标记为过期选项,标记文章翻译已失效需要修订。每个翻译还可以通过在翻译编辑表单中,勾选此翻译版本需要更新选择框,来标志此翻译版本需要修订。
  • 内容管理页面显示了每篇文章的语言,并且可以按语言或翻译状态显示列表。

本地化(locale)模块提供的语言切换区块使用户可以自行选择语言版本。

接下来,我们将按照这里的提示,来制作中英文切换的网站。使用的内容还是在前面用到的。

相关链接:http://drupal.org/project/zh-hans ,http://drupalchina.org/forum/8 , Think in Drupal

Drupal版本:

10.2 显示翻译标签

我把上篇文章编号为10.1,但是drupal还是把它排到最上面,其实我是想让它排到8的后面的.而在这方面,微软的操作系统就做得比较好.不必苛求于drupal了.在上面,我们把drupal6.5的后台汉化了,而且找到了内容汉化的途径,也就是内容翻译模块中的帮助文本,还是中文版的。下面让我们按照里面的说明,来实现为内容添加英文版本。

 

导航到节点类型列表页面,编辑story节点类型的设置admin/content/node-type/story,在“流程设定”部分下面的,“多语言支持”中选择“启用”,保存。在drupal国际新闻下面,找到“Acquia drupal发布了”这篇文章,点击编辑,在编辑页面多了一个语言选项,现在为“与语言无关”,我们将它设置为“简体中文”,保存。

 

我们就将这个节点的语言设置为了简体中文。怎么为它添加一个英文版本的节点呢? 郁闷了,确实找不到翻译那个标签,在那里可以添加本节点的英文翻译呢?是不是刚才,在节点类型的设置时,选错了选项?再次导航到admin/content/node-type/story,在“流程设定”部分下面的,“多语言支持”中选择“激活,并有翻译”,如图所示。保存,谢天谢地,看到了“编辑”旁边的“翻译标签了”。

     这样我就大概知道怎么做了,因为在drupal5中,第3方模块loclizer就是这个样子。对应起来就可以了。

相关链接:Think in Drupal

Drupal版本:

2.安装drupal6.5

那么就让我们开始drupal6.5的建站之旅。首先是现在drupal,登录到官方网站drupal.org上,在正文的最上面,以及在右上角,都有drupal6.5的下载,点击,再点击,就看到下载链接了http://ftp.drupal.org/files/projects/drupal-6.5.tar.gz

 

下载到本地,我的存在了C:\QQDownload\drupal\ drupal-6.5.tar.gz。使用解压缩文件对其进行解压缩。在当前目录中,多了一个drupal-6.5目录,里面就是我们要用得软件。现在让我们进行安装。Drupal的安装其实已经很简单了,有些集成开发包比如wdp甚至为你装好了drupal。我现在用的是xampp,安装在F盘下面。现在将drupal-6.5目录拷贝到F:\xampp\htdocs目录下面,这里面有一点,drupal-6.5解压后有两层,要拷贝里面的一层。然后就是创建数据库。我们把数据库命名为drupal65,创建步骤为,打开xampp控制面板,启动apache,启动mysql。如果你装了QQ或者QQ超级旋风的话,需要先退出这两个软件,不然打不开apache,因为前者把80端口给占了,不过打开apache以后,可以继续使用QQ,霸道的QQ阿。(不过我装过GG的浏览器搜索插件,后来不小心把QQ的产品全部安装上了(包含了QQ的搜索插件),GG向我提示,不法软件想取代它的地位,被它拒绝,看来还是GG的技术更强一点)。

 

打开mysql的客户段,我这里用的是SQLyog,当然也有其它产品。连接到本地数据库。找到左栏的root@localhost,右键单击,你会看到“创建数据库这一选项”,点击它,在弹出的对话框中输入drupal65。现在,你看看这个数据库,里面还是空空的,没有内容。

 

接下来是,修改settings.php配置文件。在目录F:\xampp\htdocs\drupal-6.5\sites\default下面,现在有一个默认的default.settings.php文件,复制该文件,粘贴到当前目录,并将复制品重命名为settings.php。打开settings.php文件,这个是个配置文件,里面有各种网站的配置信息。现在我们关心的只是数据库的配置,在第92行,有一句:

$db_url = 'mysql://username:password@localhost/databasename';

 

将这行代码注释掉,然后紧接着在下面另起一行,复制这一段代码。然后修改里面的数据库,用户名,密码。修改后我的结果为:

//$db_url = 'mysql://username:password@localhost/databasename';             //第92行

$db_url = 'mysql://root:@localhost/drupal65';                              //第93行

 

在浏览器中输入http://localhost/drupal6.5,抱错,没关系,还没有安装呢。输入http://localhost//drupal6.5/install.php,还是抱错:

“The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.”

估计是这个6.5的原因,把中间这个点去掉。不好意思,地址输错了。应该为http://localhost/drupal-6.5/。有时候想当然的一件事情也会出错。少了一个连字符“-”。还是抱错,不过这次的错误信息我见过了。“Warning: Table 'drupal65.access' doesn't exist query:”。

在地址栏中地址后面追加install.php,也就是http://localhost/drupal-6.5/install.php,这样就进入安装页面了。选择“Install Drupal in English”,安装很快就进入了“Configure site”这一步。输入站点名称,邮件地址,管理员的用户名和密码,后者我输入的是admin/admin,密码太短了,会有警告提示,说你的密码不安全。另一个值得一提的就是简洁URL,在drupal6.5中,系统会自动对当前环境进行判断,如果环境支持简洁URL的话,就默认将其设置为启用,如果环境不支持的话,就默认为禁用。简洁URL(clean url)的配置可参看本站及官方上面的配置信息。输入好这些配置以后,点击保存。显示安装成功。不过里面有错误信息出现。“

  • warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in F:\xampp\htdocs\drupal-6.5\includes\mail.inc on line 193.
  • Unable to send e-mail. Please contact the site admin, if the problem persists.

      这是由于现在的网站,主要是系统环境不支持发送邮件。这个问题的解决办法,可参看阿舍的建站经验,我昨天刚刚看他写了篇这方面的文章,http://drupal.soa.tw/node/234,里面有说明。不用管这个错误信息。点击“your new site.”链接,进入http://localhost/drupal-6.5,现在看到的还是drupal的管理界面。我们这就用它开发搭建我们的网站。

相关链接:  Think in Drupal

Drupal版本:

3.使用page节点创建drupal首页

让我们继续我们的drupal6.x之旅。这一系列的文章,是关于首页制作的,围绕着首页制作,我们将建立一个简单的站点。也算是drupal入门教程吧。在前面,我们安装好了drupal6.5。现在我们进入了http://localhost/drupal-6.5/。看到了是drupal的默认首页。右边是正文,左边是管理菜单。

 

在右边的正文中,有4个部分,1是配置站点,2是添加模块,3是定值主题,4是填充内容。平时做项目的时候,开始要做的,就是先简单的配置一下站点,加上一些常用的模块,接着就是制作主题了。制作主题应该算是项目正式进入开发期了,它前面的都是准备工作。主题的制作,通常为客户发过来PSD文件,美工将其转化为静态HTML+css,然后drupal开发者,或者专门的drupal主题制作者,将静态的HTML替换为模板文件,tpl.php。主题的制作设计到这个过程,直到项目结束通常还设计到主题的东西。主题制作的最开始的任务就是,制作页面模板文件,接着才是节点模块,区块模板文件,根据项目的进展,开发的需要,有时候需要对这些模板进行调整,或者添加更加具体的模板文件,比如page-node-1.tpl.php这样的具体模板文件。这里暂时不讲主题的制作,相关内容可参看本站及官方还有其它站点的主题制作指南。我们假定我们的客户觉得garland主题,已经够用了。这个默认主题其实很强大的,只不过大家都在用,让人觉得比较土而已。

 

先进性简单的配置,通常就是cron还有files文件的路径了。这两个也比较简单。前者手工的运行就好了,后者,因为是在本地,所以怎么办都可以。对于初学者来说,我建议先看看drupal的后台,从上面到下面,看看每个选项,每个页面,每段文字,先看看英文的吧,看完以后,然后再装上drupal的中文包,再看看。也就是说先熟悉一下环境,我刚开始学的时候,这一点就花了2-3,这样你就基本上知道每个选项,每个功能的大致位置了。很多人,搞drupal也有一段时间了,遇到一些简单的问题,还是不会,就是因为他不知道在哪里配置,没有认真的钻研过。这是有用的。如果你仅仅是暂时的使用drupal,过段时间就不搞这个了,那也没有太多的必要。如果想靠这个吃饭的话,建议你按照我说的去学习。

 

假如你已经了解了drupal的管理界面,前面的基本配置,常用模块的安装,都已经完成了。现在就让我们添加内容。点击“Create content”(创建内容),里面有两个选项,page和story,两者之间的区别,很多人都应该知道,前者更多的是静态性的页面,后者更多的是实时性的动态性的页面。记住这些就可以了。我更多的时候,觉得两者之间并无区别,但是我的同事,包括很多的一些人,觉得page和story就是完全不同的概念。Page多用于介绍性的文章,联系方式,等等这样的内容,story则应该是新闻,博客这样的文章。不过两者在数据库中的存储结构是一样的。

好了,我们这里选择使用page,在标题中输入“首页”,在正文中输入以下测试内容:

Drupal国内新闻:

    北京10月的drupal meetup 成功举行。

    Zhupou.cn正式对外提供技术支持了

Drupal国际新闻:

    2009年春季的华盛顿drupalCon开始卖票了

    Acquia drupal发布了。

Drupal安全公告:

    SA-2008-065 - Node Clone –绕过安检

    SA-2008-064 - Node Vote – SQL注入漏洞

当然这个页面是丑陋的,我们有了第一个节点node/1。现在点击首页,还是drupal的默认首页。

导航到admin/settings/site-information,在最下面的“Default front page”输入框中,现在默认为node,我们把它改为node/1.当你再访问首页时,看到的就是刚刚我们创建的第一个节点。使用page作为首页,是最简的一种方式了。当然你可以使用任何类型的节点作为首页。觉得页面丑陋的话,可以专门做个静态的html,放到节点的正文中,然后选择full html就可以了。

相关链接: Think in Drupal

Drupal版本:

4.把drupal节点推到首页

我们接着前面的继续往下学习.由于网站分成了3个子栏目,每个栏目里面都包含相应的新闻.这个时候,如何实现每个子栏目呢?你可以为每个子栏目创建一种节点类型,然后为其使用views输出.还有就是,你可以使用drupal的分类,创建一个词汇表,下面添加3个术语.然后在创建新闻时,选择分类.第一种方式,可行,但是不可取,第2种方式,可行,可取.尽管是一个小网站,也不妨让我们探索一下drupal的分类机制.

 

      Drupal的分类,很有特色,与许多CMS的分类方法都不一样,其原理我就不多讲了,drupal能够流行,除了它的钩子机制以外,还与它的分类机制有关.导航到” Administer>>Content management>>Taxonomy”(“管理>>内容管理>>分类”), admin/content/taxonomy,在分类页面,除了上面的说明介绍以外,在下面的词汇表vocabulary (又译作术语表)表格中还没有词汇表可用.让我们添加一个.点击”Add a vocabulary”链接,以添加一个词汇表.在词汇表名称字段中输入” drupal新闻”,在描述中输入” 关于drupal的国内新闻,国际新闻,安全公告”,在帮助文本中输入” drupal新闻的帮助文本” .内容类型,选择story,我们用它来发布新闻,因为新闻具有动态性,实时性.下面还有4个选项,tags,这个是自定义标签, Multiple select,是否允许选择多个术语, Required,是否是必须要选的,最后是重量,没啥用的东西.我们根据实际的需求,选中Required.这样在分类页面中就多了一个词汇表,让我们向其中添加术语,术语只有两个选项,术语名称和描述,其实下面还有一个高级选项,但是我从来没有用过.依次添加”drupal国内新闻”,”drupal国际新闻”,”drupal安全公告”.

好了,让我们看看另一种首页的生成方式.你看看drupalchina.org,还有官方,以及我的个人网站zhupou.cn,都是采用的这种方式。那就是首页有很多节点摘要,而不是单独的一个节点。导航到admin/settings/site-information,将上文中输入的node/1改为node。

让我们创建内容,node/add/story,在这个页面多了一个drupal新闻: *下拉选项,而且是必选的,输入标题,摘要,正文,选择drupal新闻类型,还有在下面的发布选项中,看是不是选中了“Promoted to front page”(推到首页)。我们这里把所有的文章都推到首页,这和我们的博客就差不多了。不过很多网站,只有很重要的文章,还有站长密切关注的文章才被推到首页。Drupal6.5中,正文和摘要是可以分开的,而在输入格式中,没有了php code这一选项。Php 代码经过实践,是一种很不drupal位的一种输入方式,以前很多人都推荐不要用它,现在终于拿下了。而正文,摘要,这个是为了用户界面的友好性,因为很多人都不知道使用<!--break-->标签来分隔摘要和正文。现在就更加灵活一点,不过我在zhupou.cn上,装了tinyMCE以后,正文摘要的选择按钮不见了,js冲突,不过不妨事,我知道可以使用<!--break-->标签。Page节点和story节点的另一个区别就是,story节点默认是推到首页的,Page节点不是,刚刚发现的。

根据上文node/1中提到的新闻标题,我们分别为国际,国内,安全公告创建2个节点,现在出现在首页的就如图所示,内容和前文讲的差不多,就是格式不一样,另外就是里面有摘要,还有3个栏目下不时分开按照时间先后访的,而是按照总体的先后顺序来放的。

现在让我们添加一级导航。导航到admin/build/menu-customize/primary-links,点击add item链接,输入菜单的路径和标题,就可以依次添加“首页”,“drupal国内新闻”,“drupal国际新闻”,“drupal安全公告”菜单了。添加过程中的注意事项,首页的路径为”<front>”,3个新闻分类的路径可以到admin/content/taxonomy,点击该词汇表的术语列表admin/content/taxonomy/1,就可以查看相应的链接了,分别为taxonomy/term/1,taxonomy/term/2,taxonomy/term/3。添加后,发现首页出现在了菜单的最后方,我们在admin/build/menu-customize/primary-links,用鼠标拖住首页,将它提到最前面,点击保存就可以了。

现在就满足客户的基本要求了。让我们考虑一些更具体的问题:如何不显示摘要?每个新闻分类页面只显示10个标题,首页分成3个子栏,每个里面显示5个对应的标题,按时间顺序。这些问题我们将在接下来的文章中继续讲解。

相关链接: Think in Drupal

Drupal版本:

5.在drupal中,如何去掉摘要

把摘要去掉,只保留标题,这是客户提出来的需求.如何去掉摘要,也有多种方式,常见的有,使用views,修改模板文件,自己单独写个函数.方法有多种,又没有可能将摘要的字数设置为0呢,这样不也可以解决问题吗?这是我想到的另一个办法,如果可行的话,那么最简单不过了.

 

导航到admin/content/node-settings,查看里面的Length of trimmed posts:选项,里面最少的为200,默认的为600,还有一个叫做unlimited,看样子是无限制的意思,有点失望。不过看了看下面的说明。“To disable teasers, set to 'Unlimited'”,看来我的想法有戏。试一下。将选项置为'Unlimited',保存。修改一篇新闻,来查看效果。果然没有摘要了,把整篇文章都显示在了首页,如果你需要把整篇都显示在首页的话,就选这个吧,经验就是从无数的失败的经历中积累起来的,学习drupal也一样,遇到问题不妨去点点,去实践一下。虽然没有达到我们想要的目标,但还是涨了一点知识。

 

继续我们的问题探索,可不可以在drupal6种的正文,摘要切换中做点文章?我们再试一下。编辑节点,将摘要中的置为空,刚才的选项'Unlimited'还没有取消,不过不妨先看看效果。“You specified that the summary should not be shown when this post is displayed in full view. This setting is ignored when the summary is empty.”警告出现了。不过摘要确实没有了。那么我们发现了新大陆了,在创建节点时,选择“split summary at cursor”以将摘要和正文分开,将最上面的一栏,也就是摘要的输入框置为空,什么也不添,这样就没有摘要输出了。不过令人遗憾的是,<div class="content clear-block">      </div>还在,里面是空的。

      看来我们只好修改模板文件了。因为还有作者,发布日期这些东西也要去掉。其实我觉得,在里面加点摘要,也没有太大的关系,有些客户阿,要求就是苛刻。在继续讲解修改模板文件,让我们先来看看如何使用CCK创建首页。

相关链接: Think in Drupal

Drupal版本:

6.1.使用drupal的CCK创建首页节点类型,来制作首页

CCK模块和views模块很好用,但是也有缺点,最大的缺点是,当你学会了使用这两个模块以后,你老想着用它,有种上瘾的感觉.我刚开始学会的时候,是个地方都想用CCK,比如创建首页的时候,我就想到了将首页当作一个特殊的节点来用,并亲自实践过.后来,我在网上看到过以前辈写的文章,介绍用CCK来制作首页的方法, 看来这种方法早有人用.

如果说教程前面的部分还有点假大空的话,那么越往后越不好写,所需的技术也就越高了.本文可以当作drupal 6.5 CCK的入门教程吧.先列一下中文方面的资料吧,都是CCK的:

1. Drupal cck contemplate theming 技巧, 教學

Drupal cck contemplate theming-drupal的使用教程

台湾阿舍的CCK

Drupal China 上LoocorCCK & Views 模块使用小结(Drupal6.x)之一(系列文章)

Zhupou.cn翻译的 drupal CCK节点类型的主题定制

 

CCK的项目下在地址为:http://drupal.org/project/cck。现在还不是正式版,不过Views都有正式版了,这个的正式版也不远了。我们先下载这个 模块,并将其解压到sites\all\modules\cck下面。进入模块列表页面,启用CCK。

由于是学习,所把CCK的所有模块都启用了。CCK就是一个模块集合,核心就包括了9个模块,如果你还需要其它功能的话,还需要安装CCK的字段模块,这些就暂时不在这里讲了。

现在,让我们分析一下首页,先为原来的纯文本加点html标签:

<div>

<h2>Drupal国内新闻</h2>

   <ul><li> 北京10月的drupal meetup 成功举行</li>

    <li>Zhupou.cn正式对外提供技术支持了</li></ul>

</div>

<div>

<h2>Drupal国际新闻</h2>

    <ul><li> 2009年春季的华盛顿drupalCon开始卖票了</li>

    <li>Acquia drupal发布了</li></ul>

</div>

<div>

<h2>Drupal安全公告</h2>

    <ul><li> SA-2008-065 - Node Clone –绕过安检</li>

   <li> SA-2008-064 - Node Vote – SQL注入漏洞</li></ul>

</div>

 

显示的效果如图所示:

同样是图片,而且是同一抓图,png格式的就比jpg格式的小很多,为了节省带宽,这里都用png格式。同样,在drupal中,实现某种功能,也有不同的方式,各种方式有不同的优缺点,这个你需要去比较,从而选用最适合自己的方式。

上面的图,是3个div,我们可以创建6个字段,前两个使用drupal自带的title和body就可以了,我们为“Drupal国际新闻”,“Drupal安全公告”分别创建两个字段。这里都是文本字段,没有太高级的字段。我们用CCK,做出来的,应该就是上图所示的效果。

导航到“Administer>>Content types”,admin/content/types,点击“add content type”。

我们进入节点类型的创建页面,在里面输入节点类型的名称,内部名称(类型 type),以及描述。这里名称为“Front Page”,类型为“front_page”,描述为“Front Page description”。为了简单起见,呵呵^_^,实际项目中,描述不能像我这样省事的,不过我见很多人,在实际项目中,根本不添描述的,比我更懒。

下面的3个选项,是这个节点类型的默认选项,你可以对其进行设置。在“Submission form settings”,配置节点创建表单中的默认选项。“Workflow settings”是关于工作流的,节点创建后,会触发哪些事件。“comment settings”是关于评论的,里面的选项我就不多介绍了,自己看看。在这里,我们修改一下“Submission form settings”的设置。

改成Drupal国内新闻的了。保存,导航到“Create content”,node/add,这里就多了一个节点类型Front Page,点击进到Front Page节点类型的创建节点页面node/add/front-page,注意该节点类型的内部名称为“front_page”,而这里的url为“front-page”,一个下划线,一个连字符,系统自动作了转换。

现在还只有两个字段,这两个都是系统自带的,我们这里就换了换标签,有些人创建节点类型的时候,不喜欢使用自带的,其实能用上还是用上自带的这两个字段,毕竟这两个字段跑的比用CCK添加的字段要快那么一点点。而且只需要改改标签就可以了。

 

好了先就此打住,发到Think in Drupal上,吃吃早饭,干干活,然后再接着写。

 

Drupal版本:

6.2 使用drupal CCK创建首页节点类型

在前面的文章中,我们使用CCK创建了一个front page节点类型,其实这还没有用到CCK,上文中用到的是drupal内置的创建节点类型。下面让我们使用CCK再添加4个字段。

导航到admin/content/node-type/front-page,

front page

 

点击“Manage fields”链接。并添加四个字段,这里都是文本,2个是单行的,2个是多行的。保存一个字段后,会出现这个字段的设置表单编辑页面,这里我用的都是默认值。这后的效果如下:

Manage fields

 

现在让我们创建一个front page节点,并将其设为首页。这个时候我注意到,在“drupal国际新闻 正文” 字段下面,不能设置输入格式。怎么才能像body那样,下面也可以设置格式呢?我们还需要回到刚才的页面。

不能设置输入格式

导航到admin/content/node-type/front-page/fields,对“drupal国际新闻 正文” 字段重新配置,选择“Filtered text (user selects input format)”,保存。

front page

 

对于“drupal安全公告 正文”字段也进行相应的配置。然后再次访问front page节点的创建页面。输入上文中提到的html内容。部分截图如下:

 

保存以后,我们得到了node/8,我们将这个节点设为首页。比较难看,

front page

 

让我们去掉我们不想要的内容,包括把标题移到下面,以及去掉“add new comment”l链接,还有“Mon, 10/20/2008 - 16:59 — admin”,以及黑体的标题,正文,就是显示的和上文的一样。现在让我们开始修改页面模板。

先到sites\all下面添加一个themes目录,由于我们现在用的是官方的garland目录,这是自带的,最好不要直接修改它,我们可以创建一个garland的子主题。不过在这里我们还是直接的在garland里面修改了。

Drupal版本:

6.3分析一下drupal的garland主题

      直接就在garland目录下面修改了.拷贝themes/garland下面的page.tpl.php,并将复制品重命名为page-front.tpl.php,现在后者就负责首页的外观了,但是现在我们还没有在里面做任何修改。打开page-front.tpl.php,

garland的页面模板虽然丑陋,但是却相当经典。以前我做页面模板时,就是仿照这个,通常header部分都是直接拷贝这里的。

<?php

// $Id: page.tpl.php,v 1.18 2008/01/24 09:42:53 goba Exp $

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language ?>" lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">

  <head>

    <title><?php print $head_title ?></title>

    <?php print $head ?>

    <?php print $styles ?>

    <?php print $scripts ?>

    <!--[if lt IE 7]>

      <?php print phptemplate_get_ie_styles(); ?>

    <![endif]-->

  </head>

    注意这里面的php语句,$head_title,$head,$styles,$scripts,这些都是页面模板中的变量,还有$language,它现在成了一个对象变量了。具体的含义,可参看本站的译文还有官方的手册。

 

紧接着的代码,是网页最上面的一些logo,口号什么的,

  <div id="header-region" class="clear-block"><?php print $header; ?></div>

 

    <div id="wrapper">

    <div id="container" class="clear-block">

 

      <div id="header">

        <div id="logo-floater">

        <?php

          // Prepare header

          $site_fields = array();

          if ($site_name) {

            $site_fields[] = check_plain($site_name);

          }

          if ($site_slogan) {

            $site_fields[] = check_plain($site_slogan);

          }

          $site_title = implode(' ', $site_fields);

          if ($site_fields) {

            $site_fields[0] = '<span>'. $site_fields[0] .'</span>';

          }

          $site_html = implode(' ', $site_fields);

 

          if ($logo || $site_title) {

            print '<h1><a href="'. check_url($front_page) .'" title="'. $site_title .'">';

            if ($logo) {

              print '<img src="'. check_url($logo) .'" alt="'. $site_title .'" id="logo" />';

            }

            print $site_html .'</a></h1>';

          }

        ?>

        </div>

这些我们也不用管。

 

下面的这段是一级链接,和二级链接的输出。

<?php if (isset($primary_links)) : ?>

          <?php print theme('links', $primary_links, array('class' => 'links primary-links')) ?>

        <?php endif; ?>

        <?php if (isset($secondary_links)) : ?>

          <?php print theme('links', $secondary_links, array('class' => 'links secondary-links')) ?>

        <?php endif; ?>

 

      </div> <!-- /header -->

 

再下面是左栏区域:

<?php if ($left): ?>

        <div id="sidebar-left" class="sidebar">

          <?php if ($search_box): ?><div class="block block-theme"><?php print $search_box ?></div><?php endif; ?>

          <?php print $left ?>

        </div>

      <?php endif; ?>

如果左栏区域中没有区块的话,这里的html片段就不用输出了。

 

我们所关心的到了:

<div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">

          <?php print $breadcrumb; ?>

          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>

          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>

          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>

          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>

          <?php if ($show_messages && $messages): print $messages; endif; ?>

          <?php print $help; ?>

          <div class="clear-block">

            <?php print $content ?>

          </div>

          <?php print $feed_icons ?>

          <div id="footer"><?php print $footer_message . $footer ?></div>

      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->

这里面放的主内容,包括节点的标题,各种字段,属性。即便是在别的主题中,通常我也是直接拷贝这一整段代码,通常需要略作修改,比如这里,我们需要把标题删去,也就是删除以下内容:

<?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>

这样“drupal国内新闻”这一标题就不出现在顶部了,当然现在啥也没有了。

 

如何去掉“Mon, 10/20/2008 - 16:59 — admin”这样的信息呢?有不少初学者都这样问。是不是删除以下内容:

<?php if ($show_messages && $messages): print $messages; endif; ?>

就可以了。

我试了一下,不行,看来文章的作者,及发布日期不在这里控制。你可以逐个的删除这里面的变量,来观察页面内容的变化。

其中<?php print $content ?>的$content变量,是由节点模板控制的,也就是node.tpl.php,这个是最一般的节点模板,有时候我们需要更具体的节点模板,这个将在接下来的文章中讲到。

 

再下面是右栏:

<?php if ($right): ?>

        <div id="sidebar-right" class="sidebar">

          <?php if (!$left && $search_box): ?><div class="block block-theme"><?php print $search_box ?></div><?php endif; ?>

          <?php print $right ?>

        </div>

      <?php endif; ?>

 

    </div> <!-- /container -->

  </div>

<!-- /layout -->

这个和左栏一样,不过就是放在了右边罢了,左右是对成的。

 

最后面的这个变量一定要注意,

<?php print $closure ?>

  </body>

</html>

 

$closure是干什么的,我们先别管,忘了这个变量,会犯莫名其妙的错误的,有一次,我同事制作drupal主题,出现了错误,怎么都找不到,搞了半天,我让他从头开始,一个一个对照,看到底哪里少东西了,最后发现,忘记了这个变量<?php print $closure ?>。当你制作drupal主题的时候,出了问题,也应该看看是不是缺了这个变量。这个是经验之谈。

 

相关链接: Think in Drupal

 

Drupal版本:

6.4 Node-front_page.tpl.php

     你可以为特定节点类型的节点单独的创建一个节点模板文件,对于我们的首页节点类型,如果要单独的定制它的外观的话,就需要创建一个node-front_page.tpl.php.创建的过程就是拷贝node.tpl.php,然后将其重命名。

      我们先来看看这个garland的node.tpl.php,也就是还没有被修改的node-front_page.tpl.php。注意不要把node-front_page.tpl.php写成了“node-front-page.tpl.php”,因为我在写本文的时候就犯了这个错误,有时候,这样的一个很小的错误就会浪费你半天时间。我遇到过这样的情况。换成了后者,就不管用,因为系统内部没有front-page这种节点类型,只有front_page。

 

让我们先分析一下这个模板文件,最前面的部分,

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>">

 

<?php print $picture ?>

<?php if ($page == 0): ?>

  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>

<?php endif; ?>

    第一行是输出div的id和class的,根据节点的类型,状态的不同,其id和class也不相同。其次是输出图片的,接下来看看是不是个整节点,如果不是的话,也就是仅仅是一个摘要(特aser),那么在节点标题上就加个链接。

 

    再往下看:

<?php if ($submitted): ?>

    <span class="submitted"><?php print $submitted; ?></span>

  <?php endif; ?>

     这段就是输出节点的提交信息的,包括节点的作者,提交日期等等,也就是前文所提到的,尚未解决的问题。“Mon, 10/20/2008 - 16:59 — admin”,如何去掉这一信息呢? 我们把上段代码从节点中删除,就可以了。

 

    接下来就是节点的正文了,由CCK创建的内容,也在这里直接输出。

<div class="content clear-block">

    <?php print $content ?>

  </div>

    我们一会再看看,如果控制输出CCK定义的字段。

 

    最后的这段代码,用来输出节点的分类,以及其它链接的:

<div class="clear-block">

    <div class="meta">

    <?php if ($taxonomy): ?>

      <div class="terms"><?php print $terms ?></div>

    <?php endif;?>

    </div>

 

    <?php if ($links): ?>

      <div class="links"><?php print $links; ?></div>

    <?php endif; ?>

  </div>

 

</div>

     你在zhupou.cn的每篇文章下面,基本上都可以看到这样的分类,比如druapal6.x, druapal5.x等等。你可以根据需要将这些信息放到正文的上方,或者下方。

 

     这里面用的变量,都是节点模板中常用的变量,具体含义可参看http://drupal.org 上的手册,以及我以前翻译的一些文章。最后提示一个技巧,在这个节点模板中,善于使用<?php print_r($var) ?>。

 

相关链接:Think in Drupal

Drupal版本:

6.5 改造CCK节点模板node-front_page.tpl.php

我们在前面提到,在节点模板中,模板使用$content变量将正文,以及由CCK创建的字段一股脑的输了出来,怎么才能将其单独的输出来,放到定制的html中呢?

       在文章的最后面,我们提到了print_r()这个函数的应用,这个函数在制作模板文件中,用处可大了,又专门的支持主题制作的drupal模块,不过我没有用过,我觉得print_r已经够用了。让我们在节点模板中,插入<?php print_r($node) ?>,访问首页,发现里面的内容全乱套了。

stdClass Object ( [nid] => 8 [type] => front_page [language] => [uid] => 1 [status] => 1 [created] => 1224493166 [changed] => 1224493166 [comment] => 2 [promote] => 0 [moderate] => 0 [sticky] => 0 [tnid] => 0 [translate] => 0 [vid] => 8 [revision_uid] => 1 [title] => Drupal国内新闻 [body] =>。。。。。。。

这么多东西,怎么办,我们要做的就是直接在这里找到对应的变量,怎么找,先找内容阿。先把那一大串复制到一个文本文件中,然后慢慢的找,最后找到了

<?php //print_r($node->title) ?>

<?php //print_r($node->body) ?>

<?php //print_r($node->field_news[0]['value']) ?>

<?php //print_r($node->field_news_body[0]['value']) ?>

<?php //print_r($node->field_security[0]['value']) ?>

<?php //print_r($node->field_security_body[0]['value']) ?>

怎么找出来的?慢慢的试出来的,最后发现$node->field_news[0]['value']可以,很快其它的也一样,搞定。找到了这些具体的字段,我们就可以将其放到我们的html片段中了。放置的过程中,发现不能使用$node->body,因为同样输出所有的正文加上所有的CCK字段。这里应为使用<?php print $node->content['body']['#value'] ?>,注意这里的value前面有个“#”号。我咋知道的?试了好几遍才试出来。最开始学习drupal的时候,都是这样试错试出来的。这样我们就可以将

<div class="content clear-block">

    <?php print $content ?>

  </div>

替换为了

<div class="content clear-block">

  <div><h2><?php print $node->title ?></h2> <?php print $node->content['body']['#value'] ?> </div>

  <div><h2><?php print $node->field_news[0]['value'] ?></h2> <?php print $node->field_news_body[0]['value'] ?> </div>

  <div><h2><?php print $node->field_security[0]['value'] ?></h2> <?php print $node->field_security_body[0]['value'] ?> </div>

    </div>

这样我们把CCK创建的节点类型就完整的输出来了。最终首页节点模板的文件内容如下:

<?php

// $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $

?>

<?php //print_r($node) ?>

<?php //print_r($node->title) ?>

<?php //print_r($node->body) ?>

<?php //print_r($node->field_news[0]['value']) ?>

<?php //print_r($node->field_news_body[0]['value']) ?>

<?php //print_r($node->field_security[0]['value']) ?>

<?php //print_r($node->field_security_body[0]['value']) ?>

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>">

 

<?php print $picture ?>

<?php if ($page == 0): ?>

  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>

<?php endif; ?>

 

 

 

  <div class="content clear-block">

  <div><h2><?php print $node->title ?></h2> <?php print $node->content['body']['#value'] ?> </div>

  <div><h2><?php print $node->field_news[0]['value'] ?></h2> <?php print $node->field_news_body[0]['value'] ?> </div>

  <div><h2><?php print $node->field_security[0]['value'] ?></h2> <?php print $node->field_security_body[0]['value'] ?> </div>

    <?php //print $content ?>

  </div>

 

  <div class="clear-block">

    <div class="meta">

    <?php if ($taxonomy): ?>

      <div class="terms"><?php print $terms ?></div>

    <?php endif;?>

    </div>

 

    <?php if ($links): ?>

      <div class="links"><?php print $links; ?></div>

    <?php endif; ?>

  </div>

 

</div>

 

还差最后一个问题没有解决,那就是如何去掉“Add new comment ”这一链接,其实这个很简单,那就是编辑该节点,在编辑页面的“comment settings”部分选中“Disabled”就可以了。好了最终的效果图如下:

  你可能说,怎么还是这么丑,将3个div排成什么样的样式,是美工的活,CSS的东西我不大懂,在这里就不多讲了。讲的就是这个流程,如何把CCK的字段提取出来,如何将CCK创建的节点设为首页。有点累了,歇会先。

Drupal版本:

6.6 drupal CCK总结

使用CCK创建一个front page节点类型,然后再创建一个首页节点.这种方式有啥好处呢?那就是将来你编辑首页时,首页的各个部分现在都成了一个字段,相互之间互不干扰.或许 这是唯一的好处了,但是,使用这种方式创建的首页,仍然是静态的,而且与纯HTML的首页相比,没有任何明显的优势,而且我们也看到了为CCK节点类型定制节点模板也相当的费时费力.

 

       这里仅仅作为一个参看,也作为drupal CCK的一个入门教程,特别是定制节点模板的那部分,很少人会提到.你可以看看这篇文章Use CCK to make a unique front page,很早就有人提出了这种想法,而且不少人这样用,应该还是drupal圈内的高手吧, Lullabots的文章.还有这篇Take control of your Drupal front page layout using contemplate and CCK. Contemplate模块我没有用过,不过有不少介绍这方面的文章, joetsuihk 有篇文章Drupal cck contemplate theming 技巧, 教學,希望在你制作节点模板时,此文能给你带来一些帮助.

 

       CCK是个会用了以后特别上瘾的drupal模块,看到一个内容,都想用CCK实现,我为CCK这种方式,特别是它的灵活性感到惊讶,当然,当我把这种方式告诉没有接触过drupal的一些技术人员时,他们的态度就是批判再批判,当然他们没有用过CCK. 后来的实践,让我对CCK产生了免疫,能不用就不用,我说个例子,比如我现在的站点上,有个drupal安全公告栏目,这个都是翻译drupal.org上的,你看看你面的内容,你再想想CCK,是不是可以将它们对应起来。我最初确实是打算使用cck来实现的,但我看看了官方页面的源代码,就改变了自己的主意,事实上,我用的方式就是普通的story节点+分类+<!—break-->,看起来外观也是统一的。因为我使用的是同一个word模板。事实上,官方采用的也是我这种方式。我模仿了官方的用法^_^。

 

       CCK也是有前世今生的,最早是flexnode,已初具CCK的原型了,后来在此想法的基础上,独立开发出来了CCK,到现在CCK2也出来,将来这种方式也将被drupal官方正式采用,不知道什么时候。CCK是把重剑,你看看这个drupal模块集中模块的个数,以及模块的大小就知道了。重剑无形,使用不当就会对自己不利,只有等你力气比较大,能够掂得动它的时候再去学习它。

      

       那么使用CCK创建首页,这种方式我们就介绍到这里。我们将回过头来,继续赶路,学习一下其它的方式。

相关链接: Think in Drupal

Drupal版本:

7.0在template.php文件中添加自定义函数

没想到CCK的写了好几篇,怎么写都写不完,还好终于勉强的搞定了.现在让我们接着第5篇继续往下写.我们现在要采取的方式就是使用一段代码,将这些东西输出了.

我们写一个函数,用来读取分类以及它下面的内容,然后直接在页面文章中调用这个函数,这是一个很高效的方法,稍微会点php的都会这样干,我见过不少以前搞php的人,开始使用drupal时,都是直接使用裸php函数,无论是节点中,区块中,还是任何可以使用php code输入格式的地方,他们都会使用php。不过在drupal6.x中,我们这里6.5,php代码这种输入格式被取消了,大量的在内容中使用php代码,在drupal圈内是个被严重鄙视的方式。

Php代码放到文件,放到哪里?最好放到template.php文件中。也就是你的主题的template.php文件中,我们这里是garland。我们先来看看garland的template.php文件,里面有phptemplate_body_class(),phptemplate_breadcrumb(),phptemplate_comment_wrapper(),phptemplate_preprocess_page(),phptemplate_menu_local_tasks(),phptemplate_comment_submitted($comment),phptemplate_node_submitted($node),phptemplate_get_ie_styles()这样的函数,列出来这么多就是建议如果有时间的话,就看看这些函数,它们是干什么的。包括函数的命名方式,用途。有时候你需要修改这些函数。

我们写个函数,phptemplate_show_taxonomy_($tid),根据分类术语输出下面的内容,函数中内容就是读取术语ID $tid,根据ID得到术语的名称,已经使用该术语作为标签的节点列表。下面是我写的函数。

function phptemplate_show_taxonomy_($tid){

       //根据tid读取术语名称

       $sql ="SELECT name FROM {term_data} WHERE tid = %d";

       $result = db_query(db_rewrite_sql($sql),$tid);

       while($data = db_fetch_object($result)){

              $term_name = $data->name;

       }

       //$term_name = db_result(db_query($sql),$tid);

       //$output是用来拼html的,把html片段和数据拼起来

       //print_r($term_name);

       $output = "<div>";

       $output .= "<h2>".$term_name."</h2><ul>";

       //下面是术语相关的节点,按照时间顺序读取

       $sql = "SELECT n.nid, n.title, n.created

                                   FROM {term_node} tn

                                   LEFT JOIN {node} n on n.nid = tn.nid

                                   WHERE tn.tid = %d

                                   ORDER BY n.created DESC";

       //这里面只取前两个

       $result = db_query_range(db_rewrite_sql($sql),$tid,0,2);

       //循环,输出节点标题,这里加了链接了,注意l()函数的使用

       while($data = db_fetch_object($result)){

              $output .="<li>".l($data->title,"node/$data->nid")."</li>";

       }

       //加上结束标签

       $output .= "</ul></div>";

       //ok返回

       return $output;

}

 

注意我中间的改动,最初我用的是$term_name = db_result(db_query($sql),$tid),但是发现在这里不行,就改成了:

$result = db_query(db_rewrite_sql($sql),$tid);

       while($data = db_fetch_object($result)){

              $term_name = $data->name;

}

现在在page-front.tpl.php中插入3个语句:

<div class="clear-block">

          <?php print phptemplate_show_taxonomy_(1) ?>

          <?php print phptemplate_show_taxonomy_(2) ?>

  <?php print phptemplate_show_taxonomy_(3) ?>

          <?php //print $content ?>

 </div>

同时注掉$content的输出,就可以了。效果如下:

7.1 善用template.php

这个文件很有用,但是很多人,特别是初学的,连这个函数是干什么的都不知道,所以我在上文中让大家好好的看看这个函数。

这里可以干什么?可以覆写各种各样的主题函数,可以为page,node,comment,等模板文件中添加自定义的变量,还可以在这里添加模板建议(template suggestion),另外,这里面的函数你可以在页面模板文件中,直接调用。在前文中,我们就是这样用的。

对于许多小的drupal站点,如果觉得编写drupal模块真的比较麻烦的话,就可以使用这种方式,想一想吧,template.php中你可以放置任意的php函数,还有什么功能,不能直接实现呢?php能够实现的,drupal也大都可以实现。当然对于比较大的站点,用到这个文件的地方也不少。所以认真地读读garland的template.php,对于以后的开发工作是很有帮助的。

强调完这一点,接下来让我们看看front模块的使用。

相关链接: Think in Drupal

Drupal版本:

8. 使用drupal front page模块

Front模块,这个是专门用来创建首页的drupal模块,在实际的项目中,确实用到过这个项目,而且是客户点名要用这个模块.使用这个drupal模块,也可以创建首页.我在上周6的给参加meetup的朋友,演示过这个模块的用法。

如果你遇到了这种情况,首页面看起来很复杂,很花哨,里面充满了图片,flash,而这个页面可能每过一段时间,还需要更新一次的话,那么就可以考虑使用Front page模块,是用该模块来管理你的页面,这样就可以将这个页面完全独立于主题中其它页面的外观样式了。

在front模块的配置页面admin/settings/front,前面的配置都很好理解,注意最后一项,激活你的front_page设置,你需要按照说明在输入框中输入“front_page”,这样才能激活你的设置,我开始用这个模块的时候,就不知道配置这里,总是看不到效果,看不到效果,后来费了好大的劲,才发现还需要激活以下,这样才能取代drupal以前的首页设置。

回过头来看看前面的设置,你可以为匿名用户,登陆用户分别设置不同的首页,还可以定制站点离线时候的消息,还有首页面包屑链接的设置,对于哪些好久没有登陆的用户,当他再次登陆时,你还可以为他专门显示一些特有的信息。在具体的首页设置中,在type下拉选项中,有themed,full,redirect,前两个我用过,themed就是使用主题的页面模板,full就是完全独立,自己负责,redirect我没有用过,这个和项目的redirect to文本输入框有关。另外还有php代码设置,你可以选择是否在里面使用php代码。

除了我前面所讲的使用情况以外,如果你想为不同的用户显示不同的首页内容的话,你也可以考虑使用front page模块来管理你的各种情况。

不过在以前的项目中,每当遇到首页的制作时,我都会向同事推荐使用这个模块,但是最终的结果,他们都不采纳,觉得制作一个首页,还需要另外的模块?

对于没有接触过的朋友,不妨下载下来试用以下,将来在实际的项目中,也就多了一种选择。

Front page模块的相关链接:

官方网址:http://drupal.org/project/front

Drupal台湾的简介:http://drupaltaiwan.org/module/front_page

Drupalchina的介绍:http://drupalchina.org/node/2048

相关链接: Think in Drupal

Drupal版本:

升级drupal6.4到drupal6.5

登录到zhupou.cn后台,好久没有运行cron了,我现在都是手工的运行它,以前从来没有配置过,而且又不愿意装poormanscron模块。刚开始还是好好的,运行后,就报警了:

There is a security update available for your version of Drupal. To ensure the security of your server, you should update immediately! See the available updates page for more information.

而且这个信息,走到哪里他都跟着你,没办法,只好升级一下drupal了,我目前使用的版本为drupal6.4,需要升级到drupal6.5.先到drupal.org上下载最新的6.5版,http://ftp.drupal.org/files/projects/drupal-6.5.tar.gz。解压缩这个文件。里面就是最新的drupal6.5了。

不过在决定升级到drupal6.5以前,现在自己本机上升级一下,由于我的数据库还是20多天前的,所以需要备份一下数据库。把本地的环境先与上面的同步一下。

1,      使用phpmyadmin备份数据库,然后使用sqlyog导入。打开本地的链接,http://localhost/zhupou/,出现了错误信息:

“Warning: Table 'zhupou.watchdog' doesn't exist query: INSERT INTO watchdog (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (0, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:184:\"Table &#039;zhupou.cache_menu&#039; doesn&#039;t exist\nquery: SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = &#039;links:navigation:page-cid:node:1&#039;\";s:5:\"%file\";s:41:\"F:\\xampp\\htdocs\\zhupou\\includes\\cache.inc\";s:5:\"%line\";i:26;}', 3, '', 'http://localhost/zhupou/', '', '127.0.0.1', 1223911496) in F:\xampp\htdocs\zhupou\includes\database.mysql.inc on line 128

开始以为是sqlyog的原因,接着使用命令行重新导入了数据库。还是报同样的错误,换成forefox,chrome还是抱错。在网上搜索了一下,没有找到有用的信息。哪错了?不得不认真的去读这段信息,原来drupal中的数据库表watchdog不存在,我打开数据库看了一下,确实没有这个表,打开线上的数据库,里面有这个表,打开备份的zhupou.sql文件,在最下面的地方,发现“Table './zhupou/watchdog' is marked as crashed and should be repaired”,原来备份的sql中,没有相关的语句。

我想到了,自己备份的时候,没有关闭自己的站点(将站点置于下线的状态),会不会是这个原因呢?

    导航到admin/settings/site-maintenance,选择Off-line,保存设置,使用phpmyadmin再次备份。打开新备份的zhupou.cn,拉到最下面,发现里面还是“Table './zhupou/watchdog' is marked as crashed and should be repaired”。我晕倒了,站点怎么?

    使用phpmyadmin查看线上的数据库,然后查看watchdog标,里面报错

“SQL 查询:

SHOW INDEX FROM `watchdog` ;

MySQL 返回:

#145 - Table './zhupou/watchdog' is marked as crashed and should be repaired

 

原来这个表坏了,总算找到原因了,怎么办,平时没有经常的备份,数据丢失了,自己的原因,还是虚拟主机服务商的原因,因为前段时间数据库一直有问题,如果是后者的话,真的是无商不奸了,先不管这个,需要找到解决的办法?在没有找到办法以前,先把这篇文章贴上去。

相关链接: Think in Drupal

Drupal版本:

升级drupal6.4到drupal6.5(1)

昨天晚上搞到快12点了,还是没有搞定,原本以为半个小时就可以的事情,却遇到了难以解决的问题,前篇文章贴出来以后,已经到了12点了,也就是今天的0时,昨天搞不定,今天一大早(这个也太早了)接着搞。

在phpmyadmin上,察看表watchdog的结构,搜索,插入都报错,同样的错误信息。在操作页面,有一个表维护,下面为“强制更新资料表("FLUSH") ”。自己不敢乱动,决定先在自己的机子上,直接恢复这张表看看。从数据库“drupal6”中复制表watchdog的结构到zhupou中。发现还是不行,报同样的错误。继续看错误信息,发现里面包含了“zhupou.cache_menu&#039; doesn&#039;t exist”,这个表也不存在?

果然,cache_menu表不存在,而在“drupal6”(我的drupal6测试站点的数据库名)中,这个表是存在了,也就是说,应该有这个表的。查看线上的数据库,这个表也报废了,里面有错误,和watchdog一样。把这个表也恢复了,发现还是报错,在多个浏览器下做了测试,错误信息时有时无。重新登陆以后,发现错误信息没有了。点了几下,发现都没有问题。总算没有出现大问题。由于这两个标平时不怎么用,所以数据丢了也没有大事情。cache中的数据,数据会自动生成。而dog中的,从来还没有用过这个表呢。

相关链接: Think in Drupal

好了继续我的升级之旅。点击“强制更新资料表("FLUSH")”,发现需要RELOAD 权限:#1227 - Access denied; you need the RELOAD privilege for this operation。既然这个不行,那么就直接删除,再创建同样的表了。执行相应的sql语句,DROP TABLE,CREATE TABLE。之后访问自己的站点,没有出现异常。本地和在线站点都搞定了。再次同步本地的数据库,一切ok。

本地的和线上站点完全同步了。对本地的站点升级。

1,打开drupal-6.5\drupal-6.5下面的upgrade.txt文件,按照说明备份文件夹,我只备份了sites下面的目录,其它的我都没有动过,所以不用备份。

2.关闭站点,导航到admin/settings/site-maintenance,选择Off-line,保存。

       3,我没有使用自定义的主题,跳过;不过使用了几个第3方模块,将它们全部禁用。

4.删除原有的drupal核心文件。不包括sites,files目录。

5.将drupal-6.5\drupal-6.5下的核心文件拷贝过来。不包括sites。

6,运行http://localhost/zhupou/update.php,按照提示往下点击,最后看到:

The following queries were executed

system module

Update #6048

  • ALTER TABLE {menu_router} CHANGE load_functions `load_functions` TEXT NOT NULL
  • ALTER TABLE {menu_router} CHANGE to_arg_functions `to_arg_functions` TEXT NOT NULL

这意味升级成功了。不过还有工作要做呢。

7,导航到drupal管理员界面admin/build/modules,启用第3方模块。并重新运行update.php。

本地升级成功。升级在线站点。与本地不同的是,除了.htacess文件,我做了改动,为了省事,没有删除和拷贝这个文件,其它都一样。没有出现任何异常。在线站点升级成功。俺的站点已经更新到drupal6.5了,估计现在没有人访问。

Drupal版本:

升级到Acquia drupal

最近drupal又有升级版本可用了,自己的后台又出现了警告信息,让我赶快升级.打算从drupal6.5升级到drupal6.6,可是总是拖着,现在决定直接升级到acquia drupal。现在acquia的最新可用版本为Acquia Drupal 1.0.2-ISR,它分为两种,一种为全新安装版的,也就是直接使用它来新建一个站点,另一个是用来升级以后的acquia drupal站点,以及升级drupal6.x站点的版本。由于我需要从drupal6.5升级到最新的acquia drupal,所以就下载了后者。下载地址可到http://acquia.com/downloads查找。

升级步骤如下:

1首先是备份,包括各种文件,和数据库。

2,将站点处于离线状态,将默认主题设为garland,禁用第3方模块。

3,将下载的升级包解压缩,解压后的目录为acquia-drupal-1.0.2-ISR-update,然后向这里拷贝sites目录下的文件,以及其它修改了的文件。这里需要注意的是,第3方模块一定要放到sites\all\modules,另外需要注意的是,你已有的第3方模块是不是和acquia精选的模块重复,重复的话,就把你的那个去掉。

4,重命名,将网站的根目录名改为别的名字,将acquia-drupal-1.0.2-ISR-update改为你网站的根目录名。

5,运行update.php

6,接下来就是点鼠标了,继续,升级,然后看到升级成功的信息。

然后就其启用原有的模块,启用acquia的部分模块,并进行相应的配置。

我的升级都是用的土办法,用FTP向虚拟主机上上传。很慢,以后,可以改进改进。这个办法太土了,一定要改进。Acquia drupal太大了,传了半天,还没有传完。

升级完成后,在模块列表页面发现,好几个模块都不能用,原来需要PHP5.2,这个以前还真的没有注意,不过还好,这几个模块暂时还用不到。

Drupal版本:

在Drupal下访问MS SQL SERVER

首先写了一个测试函数mssql.module,用于测试,结果出现以下问题:

warning: Wrong parameter count for mssql_init() in F:\xampp\htdocs\wg\includes\module.inc on line 483.
warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: 172.16.230.128 in F:\xampp\htdocs\wg\sites\all\modules\mssql\mssql.module on line 27.
warning: mssql_select_db(): supplied argument is not a valid MS SQL-Link resource in F:\xampp\htdocs\wg\sites\all\modules\mssql\mssql.module on line 28.
warning: mssql_query() [function.mssql-query]: Unable to connect to server: (null) in F:\xampp\htdocs\wg\sites\all\modules\mssql\mssql.module on line 31.
warning: mssql_query() [function.mssql-query]: A link to the server could not be established in F:\xampp\htdocs\wg\sites\all\modules\mssql\mssql.module on line 31.
warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in F:\xampp\htdocs\wg\sites\all\modules\mssql\mssql.module on line 33.
 
结果在网上搜索,竟然没有人遇到这样的问题.我怀疑是配置的问题,检查PHP的配置文件,按照网上的说明,
1、打开php.inextension=php_mssql.dll的注释符号去掉。
2、打开php.inmssql.secure_connection = Off改为on
问题仍然存在,后来我想,是不是我的模块的命名的问题,我把测试模块的名字改为了msssql,多了一个s.因为我觉得mssql会用到一个init的函数,而这个函数恰好是Drupal的钩子函数.
换了名字以后,第一个问题解决了.又出现新的问题.
·                                 warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: 202.96.154.194 in F:\xampp\htdocs\wg\sites\all\modules\msssql\msssql.module on line 27.
·                                 warning: mssql_select_db(): supplied argument is not a valid MS SQL-Link resource in F:\xampp\htdocs\wg\sites\all\modules\msssql\msssql.module on line 28.
·                                 warning: mssql_query() [function.mssql-query]: Unable to connect to server: (null) in F:\xampp\htdocs\wg\sites\all\modules\msssql\msssql.module on line 31.
·                                 warning: mssql_query() [function.mssql-query]: A link to the server could not be established in F:\xampp\htdocs\wg\sites\all\modules\msssql\msssql.module on line 31.
·                                 warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in F:\xampp\htdocs\wg\sites\all\modules\msssql\msssql.module on line 33.
找了许久,发现还是配置的问题,在网上看到的, NTWDBLIB.DLL这个文件的版本有问题,我用的是PHP自带的.从网上找了一个比较新的,下载了下来,复制到php安装目录和apache的bin目录以及c:\windows\system32目录下.这样错误消息又变了:
第一句出线了乱码,使用记事本查看元文件,看到乱码对应的消息为:
“用户 '(null)' 登录失败。原因: 未与信任 SQL Server 连接相关联。 (severity 14)”.
通过baidu,找到了原因,原来我启用
mssql.secure_connection = On,
把它改为Off,就可以了.

终于可以正常工作,返回了正确的结果.

Drupal版本:

在Fedora 9/Postgresql上安装Drupal 6.x

 

在Fedora上安装Drupal并不太费劲,虽然相关的文章少了些,只要你肯多搜索一下, 在drupal.org和整个互联网上,你会找到很多相关资料的,通过不断的尝试和摸索,你就可以将Drupal成功的安装在Fedora上了.本文的目的在于介绍Drupal在Fedora 9/Postgresql上的安装,在这种情况下,一般地README文件所介绍的标准的Drupal安装方式就行不通了,而官方网站drupal.org上所列的标准安装方式也不再适用了.在这种情况下,按照Drupal标准的安装方式就行不通了.

 

可能本文的部分内容你会在别的地方也能找到,但本文可以满足你在Fedora 9 Postgresql上安装Drupal的全部需求,你只需要照着做就可以了.

 

Postgresql Fedora的配置

  • Postgresql安装在/var/lib/pgsql.
  • 系统将为你自动创建一个超级用户postgres,而密码为空.一旦你可以su root,接着你不用密码就可以su postgres(或者其它用户).
  • 尽管root能使用postgresql,但是root初始化了数据库,并启动了postgresql.

启动Postgresql

  1.     1,如果你的Postgresql已经运行了,跳到第5.
  2.     2,以root身份,在命令行中,输入service postgresql initdb.(根据路径的设置情况,你可能需要在命令行中使用/sbin/service).完成以后,你应该得到一个一切正常的反馈.
  3.     3,仍以root身份,在命令行中,输入service postgresql start.等待,直到命令执行完成.
  4.     4,为了让postgresql开机就启动, root身份,在命令行中,输入chkconfig --level 345 postgresql on.也有图形界面的方式,用于启动/停止服务,但是我喜欢使用命令行.
  5.     5,现在为postgres创建用户我们称它为drupal:

    createuser --pwprompt --encrypted --no-adduser --no-createdb drupal,

    这将弹出一个提示符让你输入密码.

  1.     6,使用postgres创建数据库---我们将它叫做drupaldb:
    createdb --encoding=UNICODE --owner=drupal drupaldb

以前,在命令行调用完createuser createdb以后,你会收到一些反馈信息,现在看起来好像没有了.

 

现在编辑pg_hba.conf

你需要编辑pg_hba.conf从而允许Drupal访问你的数据库.

root身份,使用你喜欢的编辑器来编辑文件/var/lib/pgsql/data/pg_hba.conf     

下拉到这一部分:

 

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               ident sameuser

 

 

在最后一行下面输入:
host     drupaldb      all       127.0.0.1/32      md5

保存文件,接着,root身份,输入命令:service postgresql restart

 

 

 

 

相关连接: http://drupal.org/node/284991Think in Drupal 

 

Drupal版本:

在Fedora上安装Drupal

  • 将Drupal安装到/usr/share/drupal。
  • 在内部,sites目录链接到/etc/drupal,files链接到/var/lib/drupal。
  • 使用httpd来控制对drupal的访问。
  • Httpd和drupal的基本设置位于/etc/httpd/conf.d/drupal.conf,这里你将看到

 

 

Alias /drupal /usr/share/drupal

<Directory /usr/share/drupal/>
        Order Deny,Allow
        #Comment the following line and uncomment the next for public use
        Deny from all
        #Allow from all
        #Uncomment the following line for setup
        #Allow from 127.0.0.1
        AllowOverride All
</Directory>

 

第一行是一个链接。在你的计算机上,打开浏览器,输入http://localhost/drupal你就可以访问Drupal,而不是像访问一个文件一样使用/usr/share/drupal但是这次你将得到一个403禁止访问页面。将Allow from 127.0.0.1前面的注释符去掉。可能就不用再说了,你需要使用root身份,来编辑这个文件,之后重启httpd,最快捷的方式应该是,service httpd restart

 

使用Drupal以前的额外工作

如果现在就试图建立你的站点的话,从Drupal中将会返回一些权限错误信息,你需要进行一下步骤:

  • root身份,来到/etc/drupal并输入命令chmod 777 default
  • 进入default目录,并执行命令cp default.settings.php settings.php
  • chmod 666 settings.php default.settings.php
    你是否需要也让 default.settings.php文件具有可写的权限,这个我不是很清楚,对于default.settings.php可能使用644就可以了。
  • 完成这些步骤以后,你不需要重启httpd

 

现在,出发!

现在,你就可以打开你的浏览器,输入http://localhost/drupal来访问站点的,你将会看到一些启动Drupal站点所需的表单,接着你在里面输入一些基本的管理员信息,这样你的Drupal站点就能运行了。

完成以后,还有最后一步,那就是将权限改为原来的默认值,返回到/etc/drupal/
chmod 755 default

而在default目录下,
chmod 644 settings.php default.settings.php

 

最后请注意有关SELinux 

对于SELinux,也不是经常会遇到问题,但是对于Fedora 9中的许多任务,最好将SELinux的强制模式改为Permissive理想的情况是,有许多关于SELinux的帮助文档,现在很多人在做这项工作,当时还没有专门针对Drupal的文档。

 

 相关链接:http://drupal.org/node/284991Think in Drupal 

Drupal版本:

在XAMPP下,配置drupal简洁链接(clean urls)

我的环境为: XAMPP,Vista系统,drupal5.x.在本地安装drupal测试环境有一段时间了,但是简洁URL(clean urls)始终没有调通,当初没有什么事,只是一个配置问题.最近,在学习ubercart,里面需要用到简洁URL.所以就开始配置.

 

首先是打开.htaccess文件,在里面看了看,好像没有什么要配的,由于以前的安装环境是用的wdp,而不是xampp,所以那里的简洁URL配置方式并不适用。以前专门写过一篇这方面的文章。用百度搜索了一下,看到的还是自己的那篇文章。由于自己对apache,php不是很熟,所以只能借助于现有的方案了。

 

先是找到http://drupal.org/node/15365这篇文档,按照说明,把apache conf里面的AllowOverride None改为了AllowOverride All,试了一下,又改了回来。还是不行。

 

看着这篇文档,往下拉,发现一篇文章,http://drupal.org/node/43545,专门讲述Xampp下面的简洁URL配置的。依葫芦画瓢。

1,             F:\xampp\apache\conf,在该目录下找到httpd.cond文件,打开,找到#LoadModule rewrite_module modules/mod_rewrite.so。

将前面的注释符“#”去掉。

2,             F:\xampp\apache\conf\extra,在这个目录下面,新建一个httpd-ubercart-5.conf文件,我的项目名为ubercart-5。添加以下内容:

             Alias /ubercart-5 "F:/xampp/htdocs/ubercart-5/"

                 <Directory "F:/xampp/htdocs/ubercart-5/">

                  AllowOverride All

                   Order allow,deny

                   Allow from all

                 </Directory>

 

保存,关闭,并重启apache,这样就搞定了。注意,你需要把F:\xampp\改成你的目录,把路径写对。

相关链接: http://drupal.org/node/43545 , Think in Drupal

Drupal版本:

Zend和Xdebug不能并用

把Xampp从1.7.3降到了1.7.1,想启用xdebug,打开php.ini文件,取消对xdebug的注释,重起apache,结果怎么都起不来。

后来发现,Zend和xdebug只能启用一个,关闭zend,只启用xdebug,结果OK;

[Zend]
zend_extension_ts = "F:\xampp\php\zendOptimizer\lib\ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts = "F:\xampp\php\zendOptimizer\lib\Optimizer"
zend_optimizer.enable_loader = 0
zend_optimizer.optimization_level=15
;zend_optimizer.license_path =
; Local Variables:
; tab-width: 4
; End:

[XDebug]
;; Only Zend OR (!) XDebug
zend_extension_ts="F:\xampp\php\ext\php_xdebug.dll"
xdebug.remote_enable=true
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
;xdebug.profiler_enable=1
;xdebug.profiler_output_dir="F:\xampp\tmp"

Drupal版本:

如何使用Drupal搭建多个站点

      随着需求的不断增多,当各个功能相互比较独立的时候,大家可能就需要搭建多个站点了.搭建多个站点的方式很多,比如说你可以完全的独立开来,使用不同的数据库,即便是drupal核心也是分开的;你也可以共用一个drupal核心,使用不同的数据库;还有就是共用一个drupal核心,共用部分数据库.

      我的环境是vista系统,XAMPP集成环境。对于第一种方式,直接在htdocs目录下面多建几个子目录就可以了,然后分别创建多个数据库。我一般都采用这种方式,因为自己主要是测试学习使用,相应的url为http://localhost/drupal,http://localhost/ubercart等等,其中drupal,ubercart就是htdocs目录下面的子目录,然后分别创建两个数据库,分别设置settings.php文件就可以了。这种方式我想大家都会用。

接下来要介绍的是如何使用同一个drupal核心搭建多个站点,这里是两个。步骤如下,

1,  把drupal核心放到htdocs目录下,而不是下面的子目录中。在sites/all目录下面,创建两个子目录modules和themes,用来放置站点公用的drupal第3方模块和自定义模块,根据你的习惯,可以在sites/all/modules下面再创建两个子目录contrib和custom,前者放置drupal.org下载的drupal第3方模块,后者放置自己开发的drupal模块。

2,  在sites/all目录下面,新建两个子目录:drupal.zhupou.cn,ubercart.zhupou.cn;这里面使用的是域名,在虚拟主机上,你需要设置对应的域名解析,以及子域名设置,我这里讲的仅仅是在本地,没有在虚拟主机上实践过。将sites/default目录下面的settings.php文件,分别拷贝到drupal.zhupou.cn,ubercart.zhupou.cn目录下面,并在这两个子目录下面分别创建modules和themes子目录,用途和上面所讲的一样。

3.  设置drupal.zhupou.cn/settings.php中的配置,主要包括$db_url,和$db_prefix,前者是配置的数据库,包括数据库名,密码。后者配置的是同一个数据库中,共用的部分,独有的部分,共用的部分使用‘shared’前缀,drupal.zhupou.cn自用的使用drupal前缀。所以先配置'default'                          => ' drupal_',

接着你把要共用的表分别列出来,比如共用用户标,下面就是:

'users'                            => 'shared_',

'users_roles'                       => 'shared_',

 

ubercart.zhupou.cn/settings.php的配置和前面一样,不过它的$db_prefix设置为

'default'                          =>'ubercart_',

公用和前者一样。当然你还需要设置sites/default/settings.php,设置方式和子站点一样,就是设置默认情况下,使用哪个站点。我经常设置$base_url这个设置,不过好像没有什么用,不设置也能工作。

4.在vista的hosts文件中,添加:

  127.0.0.1 drupal.zhupou.cn

127.0.0.1 ubercart.zhupou.cn

5.重起apache,这样就搭起了两个站点,其它就和一个站点一样了。

相关链接:Think in Drupal

更多drupal多站点安装的参考文章,可参看drupal手册中的http://drupal.org/node/43816,里面给出了各种环境下面的配置

Drupal版本:

Windows Vista系统中修改Hosts文件

在WindowsVista中修改Hosts文件或Lmhosts文件时,有可能会发生两种错误。

错误消息 1

拒绝访问 C:\Windows\System32\drivers\etc\ hosts

错误消息 2

不能创建文件 C:\Windows\System32\drivers\etc\hosts。

请确认路径和文件名是否正确。

即使使用拥有管理凭据的帐户登录,也会出现此问题。

替代方法

要解决此问题,请按照下列步骤操作:

1.单击“开始”,单击“所有程序”,单击“附件”,右键单击“记事本”,然后单击“以管理员身份运行”。

如果系统提示您输入管理员密码或进行确认,请键入密码或单击“允许”。

2.打开 Hosts 文件或 Lmhosts 文件,进行必要的更改,然后单击“编辑”菜单上的“保存”。

本文是对上文的补充,为转载文章,原文链接为http://download.5617.com/article/s/12-174839-0.htm.

使用drupal建立多站点时,需要修改hosts文件,vista的权限一直搞不懂,我的权限已经最大了还是无法直接编辑,在XP下面就可以,在Vista下面就需要拐弯抹角了,还是对vista不熟啊。

相关链接: Think in Drupal

 

Drupal版本:

学习acquia drupal

本地安装了acquia drupal以后,进入管理员界面,里面会提示让你输入一些订阅信息“Please enter your Acquia Network subscription keys on the settings page.”(请在设置页面输入您的Acquia网络订阅键)。进入admin/settings/acquia-agent,里面有两个必填项Acquia subscription identifier(Acquia订阅标识)和Acquia subscription key(Acquia订阅键),Acquia有免费的版本,到http://acquia.com/network申请个免费的先用用。Acquia的购物车系统采用的是Ubercart,这个可以从页面的源码看到。订阅以后发现我的帐户升级了,里面有很多订阅客户的设置。最后的页面是有标识和健的,一不小心,把这个页面关了。不知道哪里找了,觉得应该还可以在里面找到,就在http://acquia.com/network页面瞎逛。在我的站内信箱找到了相关信息

“Enter your subscription key and identifier during the installation process. You can find the key and identifier on your subscription page.https://acquia.com/network/node/23995/subscription”找到订阅标识和健,输入到admin/settings/acquia-agent中去。之后,可以到http://acquia.com/network中将任务Connect your Acquia Drupal site to the Network 标记为已完成。

       与drupal6相比,admin/settings下面多了两个链接Acquia settings,Administration Menu,后者是个很方便的模块。不过我平时很少用它,就是方便了一些,没有加新功能。不过这里还是先介绍一下这个模块。

http://drupal.zhexie.net/m/admin_menu里面的文章,很好的介绍了这个模块。说白了,这个模块就是将Drupal管理界面的菜单,动态化,nice menu化,然后放到页面的最顶部。把鼠标移上去下一级的菜单就自动显示出来了。在管理菜单的配置页面,有两个选项,Apply margin-top to page body,和Collapse fieldsets on modules page,前者是默认选中的,后者默认未选中。选中后者,保存,进入admin/build/modules,就看到这个选项的作用了。

相关链接:http://drupal.org/project/admin_menu ,Think in Drupal

Drupal版本:

acquia drupal免费的Cron服务

搞drupal有段日子了,从来没有配置过cron.一般都是同事去配置这些服务器段的事情.设置好acquia的订阅信息以后,我收到了若干封Acquia Support发来的电子邮件.里面有一封说:“We have not received a heartbeat from your site since October 13, 2008 at 11:43pm (11 min before this message was sent). This may mean that your site is offline and unable to communicate with the Acquia Network servers.”

Acquia网络服务联系不到我.在邮件的下面,有相关的提示和解决办法,原来是我的cron出问题了.当然有问题了,因为没有配置阿.手工的运行一下cron.很快,又收到了Acquia Support的电子邮件, “We received a heartbeat from your site on October 14, 2008 at 12:20am, which means that the site is back online and able to communicate with the Acquia Network servers.”可以了,不过Acquia网络服务将自动的监督我的网站的运行情况,频率大概每小时一次.我的是本地的测试站点,没有站点url的,也没有人访问.所以这个就免了.

不过有个意外的发现,那就是Acquia网络服务能够帮你自动的调用cron,如果你不会在linux下面配置cron的话,又不愿装poormanscron模块,那么你可以委托Acquia网络服务帮你管理你的cron.配置页面位于Acquia网站的个人页面的Settings>>Cron页面.不过这个需要url的.里面有3个选项, Do you want Acquia to run cron for you,选择“是”;How often do you want cron to be run on your site,选择“5分钟一次”;cron action path,默认设置为/cron.php。

以后再搭建drupal网站,像我这样比懒人还懒得人就可以使用Acquia网络服务中的cron服务了。

相关链接: http://acquia.com/networkThink in Drupal

Drupal版本:

我们新的Drupal行为守则

     随着我们整个社区的快速成长,我们越来越需要将成长过程中好的东西---经验、教训---沉淀下来,保留下来。也就是说,我们需要继续保持Drupal的有趣性、开放性、挑战性,以及公平性。新的Drupal行为守则((DCOC)申明了值得大家共同遵守的理念。我们可以把它理解为用户的编码标准。它是对我们理念的一次表述,而不是一个苛刻的规则手册。它也是我们已有价值观与整个Drupal社区之间进行沟通的桥梁。

       我们的朋友Ubuntu,在这方面走出了一条光明之路。Ubuntu使用Drupal作为他们的CMS,在这里,我们也借鉴一下他们的行为守则。我们的行为守则和Ubuntu的基本一样,除了项目名称的不同,以及我们这里没有冲突的解决流程,后者是因为我们这里没有各个分支版本之间的冲突。
       Drupal行为守则((DCOC),我们在groups.drupal.org上,已经讨论了好几个月了,在哥本哈根的Drupal全球聚会上,我们对其作了进一步的讨论。如果你对Drupal行为守则感兴趣,那么可以加入Drupal.org的政策小组,大家在这里可以更进一步的讨论。
 

行为守则的简明版本:

1.要体贴他人
2.要尊重他人

3 要与他人合作
4 不同意见时,可以请教人。
5 无法确定时,可以寻求帮助。
6.离开时要安静
 
翻译: Think in Drupal
作者:moshe weitzman

Drupal版本:

汉化手记

我打算汉化drupal的网店购物车模块Ubercart,版本为drupal5.首先,我先通读了drupal手册的译者指南部分.对汉化大致有了一个印象.在以前的工作中,很少与中文打交道,唯一的一次是给香港的客户做项目,遇到过汉化,不过那时仅仅用到了drupal5内核的汉化包,直接导入就可以了.现在想要做的是汉化drupal第3方模块.

除了阅读译者指南以外,我还到drupal中国论坛的汉化栏目里面转过,里面重要的文章差不多都读了个遍.从昨天开始,汉化Ubercart模块的子模块uc_store.由于是5.x,所以翻译包所在的目录为modules\ubercart\uc_store\po,目录名为po,而在drupal6.x中,这个目录名改为了translations. uc_store\po目录下面有两个文件,一个是uc_store.pot,一个是es.po,后者为另一语言的翻译包.我要使用的就是uc_store.pot.为了怕出乱子,我先给uc_store.pot做了个备份.

汉化需要一个专门用来编辑的编辑器,我用的是POedit,这个可以在windows下面使用,我的操作系统为vista,所以就选用了POedit,版本为1.4.2.使用Poedit打开uc_store.pot, 默认是po文件,不过也可以打开pot文件。然后就开始逐条翻译,这个文件还挺大的,翻译了3个多小时,才基本搞定。在开始的时候,不知道怎么操作,乱点了一通,学会了怎么使用Poedit,不过里面报了一个错误,到现在还没有解决,我当时也没有准备解决它,错误信息如下:

13:21:35: F:\xampp\htdocs\ubercart-5\sites\all\modules\ubercart\uc_store\po\zh-hans.po:8: invalid nplurals value

13:21:35: F:\xampp\htdocs\ubercart-5\sites\all\modules\ubercart\uc_store\po\zh-hans.po:8: field `Language-Team' still has initial default value

13:21:35: msgfmt: found 2 fatal errors

 

“invalid nplurals value”非法的复数值,这个我见过,http://drupal.org/node/17564一文提到过这个问题,我看编辑器,可以工作,就继续翻译了。第一次保存后,除了报错以外,uc_store\po目录下面多出了一个uc_store.mo文件,随着编辑的进行,以及不断的点击保存按钮,uc_store.mo和uc_store.pot文件不断增大。直到翻译结束。我将mo这个后缀名改为po,然后用Zend studio打开,发现里面都是乱码。把它重命名后,备份有保存了,我又把uc_store.pot重命名为了po文件,打开以后,里面带有我翻译的东西。从中摘录了部分内容:

# $Id: uc_store.pot,v 1.6.2.1 2008/01/07 20:56:46 rszrama Exp $

#

# LANGUAGE translation of Drupal (general)

# Copyright YEAR NAME <EMAIL@ADDRESS>

# Generated from file: n/a

#

msgid ""

msgstr ""

"Project-Id-Version: PROJECT VERSION\n"

"POT-Creation-Date: 2008-01-04 16:03-0500\n"

"PO-Revision-Date: 2008-10-05 13:21+0800\n"

"Last-Translator: zhupou.cn<g089h515r806 at gmail.com>\n"

"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=utf-8\n"

"Content-Transfer-Encoding: 8bit\n"

"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

 

#: uc_store.module:60

msgid "Store administration"

msgstr "网店管理"

 

#: uc_store.module:61

msgid "Administer store settings, products, orders, and more."

msgstr "管理网店设置,包括产品,订单等等"

 

#: uc_store.module:68

msgid "Customers"

msgstr "客户"

。。。。。。

上面的那一大段,都是一些自动生成的信息,算是元数据吧,最上面是注释,下面的就是英汉对照的译文了。Msgid后面跟的是英文字符串,msgstr后面跟的是简体中文字符串。

翻译的过程就是体力活,多亏了google的帮忙,很多都是直接从那里拷贝的。再往后就是文件命名了,我看看es.po的命名方式是采用的语言代码+后缀po的方式,所以我觉得uc_store.po这个名字不地道,然后查出来简体汉字的代码为zh-Hans,就将文件名改为了zh-Hans.po,又参考了drupal中国里面的命名,将其改名为zh-hans.po,把原来的uc_store.pot的备份还原成uc_store.pot文件,又把mo文件移了出去,这样po文件夹下面与原来相比,仅仅多了一个zh-hans.po文件。

启用本地化模块(Locale),在这个模块的管理界面admin/settings/locale上,点击import,admin/settings/locale/language/import,在这个导入页面,我先把drupal5.x内核的汉化包导入了进来,我觉得在导入的过程中,可能就把uc_store\po目录下面zh-hans.po也捎带了。成功导入以后,启用简体中文zh-hans,并将其设为默认语言,这样,drupal后台就被我汉化了。不过点击网店管理页面,里面并没有我的汉化成果,还都是英文呢。我又在页面admin/settings/locale/language/import单独的导入了一次uc_store\po\zh-hans.po文件,这次报了一个错,“The translation file zh-hans.po contains an error: the plural formula could not be parsed.”不过在错误信息下面,还看到了导入成功的信息,而简体中文的汉化程度也由100%变为了88.33%。这次我又进入网店管理页面admin/store,终于看到了我翻译的成功了,不过像Orders,这样的复数形式,还没有汉化,我觉得应该与中间遇到的复数形式错误有关。不管怎样,总算看到结果了,也学会了汉化drupal第3方模块的流程了。

   流程总结,使用poedit编辑uc_store.pot文件,完成后,将后缀名改为po,文件名叫什么好象都无所谓,只要找得到就可以了,然后进入翻译文件的导入页面admin/settings/locale/language/import,导入翻译的成果。

相关链接:  Think in Drupal

Drupal版本:

直接修改drupal field字段数据库中的值,不起作用?

Drupal6下面,使用的CCK,创建了ISBN字段,有两个内容类型使用这个字段,对于ISBN,由于数据源的不统一,现在想把带有”-”符号的,全部去除,本来有现成的程序来执行,但是觉得比较麻烦.直接操作数据库,

首先:
UPDATE content_field_isbn SET field_isbn_value = replace(field_isbn_value,'-','') WHERE nid = 17607
执行一条记录,看一下效果.
执行所有要修改的记录:
UPDATE content_field_isbn SET field_isbn_value = replace(field_isbn_value,'-','') WHERE nid > 17200
 
检查,发现所有的-符号都被删除了.原以为这样就大功告成了.后来检查Drupal网站,发现ISBN号里面的连字符还没有被删除掉,怎么回事,编辑了一下,发现还是有连字符,而直接检查数据库记录,连字符又出现了.
 
见鬼了.每当见鬼的时候,在Drupal里面,记得清除一下缓存,我把缓存请空,浏览Drupal网站,发现连字符都已经没有了,然后把刚才的那个节点手工的修改完毕,这才完工.
 
发现一点,CCK创建了一个cache_content表,里面把一个节点的所有CCK字段信息全部缓存了,这样读取数据的时候,就不用再去关联很多表来组装节点数据了。

Drupal版本: