原文:http://drupal.org/handbook/customization/tutorials
译者:葛红儒, http://www.thinkindrupal.com
Drupal简明教程,是由一系列的非常详细的一步一步的文章构成的.它们为你指明了方向,帮你成功了理解、掌握Drupal。构建一个摄影网站,允许许多用户提交图片,这属于简明教程的例子。而向你解释如何利用assetmanager模块的功能,来为某一节点插入图片,这应该是一个HowTo(如何做)的例子。理解了吗?
好的!
提出和分享您的知识
现在你理解了两者直接的差异,是时候写篇自己的文章了。如果你所写的,是这里现有文章没有覆盖到的,你可以点击本页底部的链接“add a child page”(添加子页面),成为Drupal简明教程的贡献者。相信我们,写篇你如何使用Y & Z完成X的文章,当其他用户阅读你的文章时,你会有种成就感的!
原文: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以前给你的建议:
好运!
Drupal很强大,很灵活。这意味着,它也很复杂。你觉得Myspace的工作人员没有自己的术语吗,或者他们是一天就把网站给建出来的吗?我不知道有谁在讲Drupal很简单,但是有很多人由于想一下子掌握所有的东西,反倒把事情搞复杂了。
为了在Drupal社区中,人们更好的相互交流,使用相同的术语是必须的。如果你说“在我屏幕右边的盒子一样的东西”,语意就不明确,别人也不好理解。你将其改为“右栏中的作者信息区块”----现在语意就非常准确了,每个人都能理解你的意思了。你告诉了他们它是什么,在哪里,甚至如何找到它以及相关部分的样式。
开始时,尝试着理解Drupal的简单部分,不要想着一下子都掌握了。例如,首先你需要理解什么是节点(可参看在我书中的定义)。接着你才能理解什么是节点类型。学习页面的基本构成部分(页首,页脚,左栏和右栏,以及中间或者内容区域)。多点点,多看看后台的管理页面,这样,即便是你现在不知道它们能干什么,你也能大概的知道它们在哪里。
如果你的目标是拥有一个"MySpace"一样的网站,愿望总是美好的,但你要记住,只有你一个人,而你所用的工具你也不太熟悉。很多人都能搭建一个"MySpace"一样的网站,这是因为它们对所用的工具,模块非常熟悉(顺便说一句,我觉得MySpace相当不符合逻辑)
首先,先把东西搭起来,这样看得见摸得着。然后你再为此庆祝,不要在那里做思想的巨人,行动的矮子。有了一个开始以后,你就可以实现更精彩的东西了,但你需要一步一步的去做。不要一下子就添加无数个模块,这样会把你的服务器累死的;你要跟着感觉走。一次添加一个模块,熟悉了以后,可以再添加新的。
为了让Drupal更易于使用,也更加符合逻辑,我们欢迎你提交反馈信息,比如说新的特性需求,或者你觉得一些地方不太符合逻辑。如果你没有看到你的方式出现在Drupal中,你也不能命令我们给你实现,或者威胁以后再也不用Drupal了。当然,也不要做出诬蔑性的评论,毕竟Drupal是免费的。
有多种方式,可以在你的本地计算机上建立测试环境.在Drupal手册的建立开发环境一节中,包含了不同操作系统下面的许多应用和指南.
建立本地开发环境的原因:
在这本drupal简明教程中,我们采用来自DeveloperSide.net的集成安装包,测试环境为 Windows PC。
这个安装包已经集成了以下东西:
注意,对于任何包含了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是单站点还是多站点,现在你都需要做些基本的设置.下面这些是我做的,你可能会有所不同;这里数据库的权限为"root",这样做的好处是,比较方便,干什么都比较省事,你不用担心权限的问题.对于一些东西,我将给出Drupal.org上的相关链接,但是还没有发现与本文相近的相关内容。
我强烈建议你启用Drupal的核心模块"Path"模块,这样你就可以为你的页面使用“普通的”名字了。
如果你想使用联系表单,通过站点为用户发送电子邮件的话,一定要启用"Contact"模块。
有些东西我推荐你在你的所有Drupal站点中都采用,现在就是最好的时候来做这些事:
相关链接:http://drupal.org/node/120614
需要第2个drupal测试站点?下面是如何简单的实现它。[提示:如果你已经想好了要创建多个站点,你首先需要将要创建的站点列出来,接着阅读本文给出的这些指示。有些步骤可以批量进行,从而节省你的时间。]
为什么还要创建其它站点呢?除了我的已经运行的几个站点以外,我还想起了一些新的玩意,还没有完全成型,而在现有的测试站点中,又很难将这种想法加进去。我可能还有一些关于将来自己要建立的站点的想法。总之,人总是会有这样或者那样的想法的,对于程序员来讲,想法就意味着网站的原型。所以,在你完全放弃自己的想法以前,你可以花上几分钟仔细考虑一下。过一段时间,你很可能会改变自己的主意;现在它看起来还有点凌乱。
最终,我决定为我的新想法创建一个测试站点。因为是测试用得,即便是将来它完全失去了控制,你也能将其推倒重来。
这个过程看起来很长,其实不然,我只是在这里对其进行了详细的描述。扩展阅读材料,可参看“在本地的Windows PC(localhost)上,使用一个Drupal,运行多个站点”。更多关于站点目录的官方细节,可参看为多站点设置站点目录。
如果你想了解这方面的更深的知识,你可以在drupal.org上对论坛进行搜索,输入"multi-site",最好使用google, drupal.org自带的搜索功能经常被关闭,而且速度也很慢;在http://groups.drupal.org/multisite上,有专门的一个小组来讨论这个问题。而在手册内部,有很好的一节:Drupal多站点安装和设置。
相关联接:http://drupal.org/node/120647
开始批量循环1
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,这样将来我可以重复利用它。
结束批量循环1
开始批量循环2
结束批量循环2
我注意到我的Apache将index.html放到index.php前面,所以在你的目录下面删除index.html,如果存在的话。
结束批量循环3
<VirtualHost *:80>
DocumentRoot /www/drupal/
ServerName databasename
</VirtualHost>
结束批量循环3
开始批量循环4
127.0.0.1 databasename
结束批量循环4
继续。现在你可以打开浏览器,并输入http://databasename了。
多站点目录的更多细节,可参看为多站点设置站点目录。
相关链接:http://drupal.org/node/120647
Think in 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> </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> </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> </p>
<p>If you are already a registered member of this site, please try <a href="user">logging in</a>.</p>
<p> </p>
<p>If you are not a member, you need to <a href="/join_us">join us</a>.</p>
<p> </p>
<p>If you have any questions about our site or group, please feel free to <a href="/contact">contact us</a>.</p>
<p> </p>
<p>--Webmistress</p>
不要担心,你尚未创建"join_us"页面。这就是启用URL别名(Path module 路径模块)的好处。将创建该页面放在你的待做任务列表中,在本书后面的章节中将会讲到相关的内容。
相关联接:http://drupal.org/node/120646
Think in Drupal(转载时请勿删)
现在该装的软件都装好了.但是我们该如何使用它呢?
首先, 通过点击桌面上的快捷方式,打开"Web-Developer Controller",.看左上角.你应该检查一下Apache 和MySQL是否在运行.如果是的话,那一切都准备好了.如果没有的话,选择Apache,接着点击"Start Service"按钮.等待,直到状态改变为"Running.".现在选择"MySQL"并启动它.
是不是很好玩阿,我们把所有的软件都搞定了.现在,让我们开始我们的Drupal之旅吧.
打开你的浏览器.在地址栏中键入http://localhost/drupal/,来访问你的测试站点.由于前期工作都已经准备妥当了,你现在就能看到你的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服务器(我的在线站点)。
drupal主题
相关链接:http://drupal.org/node/120641
Think in 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方模块 |
|
|
想要了解有哪些drupal模块可用,你可以访问:drupal模块手册和第3方模块手册。
相关链接:http://drupal.org/node/120642
http://nanwich.info, Think in Drupal(转载时请勿删除)
如果要启用一个drupal主题的话,可以导航到Administer>>Site building>>Themes.
如果在这个站点从来没有启用过这个drupal主题的话,你需要选中"enable"复选框,接着点击底部的"Save configuration"(保存设置)按钮.
为了设置主题如何工作,点击"Configure"链接(不是顶部的标签)
输入相应的字段.
保存设置.
现在先别离开这个页面.
Logo 和Favorite Icon
现在使用那个"Configure"标签
我喜欢在"Global Settings"下面完成这一设置,如果你喜欢的话,你也可以一个主题一个主题的分别进行设置.
默认的Logo就是位于页面左上角处的一个小图片。例如,在"Bluemarine"主题上,它用的是Drupal logo。
如果你想修改它的话,你可以这样:
主题名 |
宽 |
高 |
Bluemarine |
48 |
55 |
Chameleon |
49 |
57 |
|
64 |
73 |
Minelli |
64 |
73 |
Pushbutton |
144 |
63 |
Fancy |
80 |
80 |
现在点击"Save configuration"按钮。如果你是在"Global settings"设置的话,她敬爱那个影响到所有的主题(假定一切正常的话);如果你是在单个主题下面设置的话,那么仅仅影响到这个主题。
可用的主题列表,参看主题。
提示:想对一个标准的主题作出一些(或者很多)的修改吗?你可以考虑,将其拷贝到你的/sites/sitename/themes/文件夹下,然后对其重新命名。现在你就可以随心所欲的进行修改了,如果不顺眼的话,你再拷贝一遍就可以了。如果改动比较多的话,而且质量比较好的话,你可以考虑将其贡献给整个社区(当然,注明你的名字)。
“哇,我已经做了很多了,但是在我的站点上,现在还没有任何内容!”那么,现在就让我们添加内容.
首先,让我解释一下,你的用户访问你的站点首先看到的一页通常称为首页.在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"。手册的另一节创建新的内容可能会对你有所帮助。
有多种方式,可用来向文本中添加图片,每种方式都有自己的优点和缺点。
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(转载时请勿删除)
使用下面的几步,你在将来的任何时候,都能够方便的添加/修改你的首页.
1. 创建你的首页
用管理员登陆以后,从左栏选择
Create content > Page
来创建你自己的内容.完成了以后,点击提交,查看结果.注意,当前的URL(你当前新建页面的路径)应该这个样子:
http://www.example.com/?q=node/# (普通)
http://www.example.com/node/# (使用了简洁URL)
在这里, #代表着节点ID.我们需要这个id,将它拷贝到一个地方,或者记住它.
2. 首页
现在你有多种选择:
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模块来
在http://drupal.org/project/front你可以找到Front模块
安装完Front模块以后,选择
Administer > Site configuration > Advanced front page settings
这里面的下拉菜单都有很好的解释。如果你点击了其中的任何一个,你都会看到:
当你设置完以后,点击“Save configuration”,这样就可以了。
点击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站点添加了一些内容了。
对于在前面所讲的创建一个page页面,里面的东西同样也适用于story页面。许多时候,你都可以认为,这两种类型是可以互换的,至少使用两种内容类型是有好处的,这样可以避免潜在的内容类型冲突(例如,分类“冲突”)。
Stories包含一个“teaser”(摘要),或者是一段开场白,用来获取读者的注意。摘要的长度可通过两种方式进行设置:
注意:你可能会在一些地方看到使用<break>标签来设置摘要的结束点。这一改变最初是在drupal5.0中,而它带来了很大的争议,所以现在继续使用< !--break-->。
一个story页面一般没有菜单项的。如果你遵循一般的习惯的话,那么一个"page"适用于静态的独立的内容的,而"story"则用于相关内容的集合(例如,RSS种子,通讯文章,新闻稿等),那么一个story通常是与其它stories放到一块的,那么应该为哪一个story添加一个菜单项呢?一般来讲,用于一组story页面的菜单,应该是一个描述页面,指出如何展示这些story。
你可能想将story页面推到首页。对于你的“欢迎”消息,你可能想将它放在最上面。不幸的是,这里没有“weight”(重量)属性可用,所以你需要使用"Authoring"里面的日期来控制顺序(或者你也可以使用Weight module(重量模块))。
什么是Teaser?
下面的内容来自于zoon_unit在2007年1月10日发布的一篇帖子。
"teaser"实质上是一个文本片断,在用户未读全文的前提下,告诉用户帖子的内容。由于大部分作者通常在文章的首段来对文章做出解释,所以teasers适用于大多数文章。
下面是都发生了哪些东西:
一般来说,我为每本书仅创建一个书页。也就是第一页,通常介绍这本书的用途。而其它页面,则作为子页面添加上去(准确一点来说,子页面的节点类型仍然为"book page")
与page页面大部分都一样,不同的是,书页(book page)有一个父节点选项("Parent")。对于第一个页面,它的父节点为"<top-level>."如果你使用“Add child page”(添加子页面),在父节点选项中(Parent)已经自动为你设置了书的名称。如果你要创建另一个书页的话,你需要弄清楚这个页面应该放在哪本书或者哪个页面下面。
书的首页一般应该有一个菜单项。而剩余的页面则不需要,除非它们非常特殊。记住,在drupal中,书是有自己的导航的。
你现在阅读的就是一本书("book")。
在drupal中,博客条目与其它节点类型有一点点不同.假定你启用了"Blog"模块,你应该能够在你的导航菜单中看到"My blog"一项.当你点击它时,在该页面就会有一个“Post new blog entry”(发布新的博客)链接。
如果博客是日常的,你可以使用日期作为标题。
如果它是一些想法的集合,你可以给它起个有意义的标题。
输入博客内容。
当用户访问你的博客时,看到的总是最近发布的博客。
相关联接:http://drupal.org/node/120640
下面是一个自定义区块的简单例子.关于drupal区块的更多信息,可参看drupal手册的Blocks页面.
添加一个“联系信息”区块
一个组织一般都应该让人们知道如何去联系他们。一个方便的做法是,在你的页面中放上你的邮件地址。这应该是最简单的区块了。
Example Organization<br>
Mytown, State Zip<br>
(123) 456-7890
添加最近更新声明
这是一个相当普遍的做法,特别是对于一个组织的站点,让访问者知道站点的最近更新日期,就更普遍了。这个例子需要你,网管或者站点管理员(有时称为超级用户)来维护这个区块。有办法可以实现自动化,但是现在我们将手动的实现它。
<em>Site Late Updated on
附件 |
大小 |
118.39 KB |
|
110.19 KB |
相关链接:http://drupal.org/node/120634, Think in Drupal
使用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的菜单是如何工作的.关于drupal菜单的一个更完整的指南可参看创建一个菜单结构一文.
我们都知道菜单或者说导航系统,可以成就一个网站,也可以毁掉一个网站.它必须方便人们使用,也就是通常所说的直观性.它必须完整,并且紧凑.
在Drupal官方网站上,有大量讨论菜单的内容.大多数新手刚开始都很难理解drupal的菜单.我使用Drupal已经有一个多月了,而且我还在编写这本简明教程,但是我仍然没有完全理解Drupal的菜单.
对于初学者来说,最容易混淆的莫过于菜单和分类这两个概念.菜单是一个导航系统,而分类是一个用来组织内容的系统.所以说,菜单是通过内容的路径,而分类则用来维持内容的秩序.为了更好的理解Drupal,你必须将这两者区分开来.
使用菜单,你可以直接将其指向一个节点,比如page或者story页面,但是你也可以指向taxonomy/term/id,它将为你展示一个节点列表.比如在http://zhupou.cn/taxonomy/term/3中,你可以看到所有关于Drupal 5.x的节点.
如何创建菜单
Drupal提供了3种主要的方式,这3种方式可以联合使用,来为你的用户提供站点导航.
文本菜单
文本导航是最容易理解的。事实上 ,我现在还不能理解标签式导航中的“二级”菜单的工作方式,而许多人都觉得它应该那样的(下拉)。
在许多帖子中,你都会看到“一级链接”和“二级链接”这样的术语。我觉得,在这个地方是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
联系表单用起来很简单,但是它的设立和操作却是一件非常复杂的事情.
设立
首先,必须启用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/124129,Think in Drupal
"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站点与数据库。
这个对你可能也有帮助:备份你的数据库。
我知道“官方的”的流程是,向主机上上传"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/120627, Think in Drupal,
使用phpMyAdmin的备份流程
截图中使用是phpMyAdmin 2.9.2,这是我本地安装的phpMyAdmin版本.我的网站主机上装的是2.9.0.2,看起来基本上一样.两者生成的结果可相互交换.
现在你就备份了你的数据库!(还行吧,是不是?)
下载完成后,你也可以选择"zipped"选项,点击"Go",然后再下载一个文件。如果想要的话,你可以为每种压缩格式都下载一个备份。你可以试试。
偶尔,除了内容以外,你还需要更新一些其它东西,比如样式表,或者新的代码.
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.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返回给浏览器以后,才会触发这些钩子,所以对于用户来讲,不会有任何延迟。
使用你的hostmonster帐号登录到cPanel接口界面,将页面下拉到底部,查看高级选项部分.
相关联接: http://drupal.org/node/208579 , Think in Drupal
在Drupal.org上,你将看到许多帖子都是关于如何创建和使用分类的(或者“词汇表”("vocabulary")和“术语集”("terms"))。大部分帖子你可能都看不懂---许多我也看不懂。
事实上,如果一个站点的内容越多,那么越就需要使用使用分类,但是这并不意味着,小站点,就不能使用分类了。
为了帮你更好的理解如何使用分类,我将通过一个实例来为你讲解Drupal中的分类。
Recipe(食谱)模块应该是一个很好的例子。在我的一个网站上,为了形成更好的社区氛围,为了鼓励大家经常访问我的站点,我决定添加一组菜谱(一个真正的,而不是像本书这样)。食谱模块就用到了分类。
我很快就认识到,如果没有任何组织的话,输入一堆食谱以后,很快就会变得混乱起来。那么,食谱可分成多个类别:Appetizers(开胃),Entrées,Desserts(甜点)等等。所以让我们根据这些东西来建立一个“词汇表”(vocabulary),这样我们就可以管理食谱了。
填完以后,我们就可以点击提交按钮了。这样你又回到了类别列表页面。此时你应该可以看到你新加的词汇表了。
在它的右边,你将看到一个链接“add terms”。点击这个链接。
这也不像那些帖子中所说的那么复杂吧,是不是?
又例如,我为一个组织建过这样的网站,在网站上,会员可以为每月通讯提交文章。他们希望能用一种方式来管理这些文章,让他们可以根据日期或者话题来评审这些文章。所以我创建了两个词汇表,一个用于发行日期,一个用于话题。现在,当他们点击其中的一个时,就可以看到所有相关的读书报告,电影评论,或者幽默文章。而且,当每个月他们提交新文章时,这些文章将被自动归类到里面去。[这里使用了一个定定义的内容模块,稍加修改就可用作他用。你可以联系我,来得到这个模块。]
我在另一个站点上,对FAQs的归类时,也曾用到过drupal的分类。在原始的网站上,在我用Drupal为其改造以前,他们用3个静态页面放置了3种类型的FAQs。没有人想管理这些。我安装了FAQ module(非常好用),为其建立了一个词汇表(vocabulary),带有3个术语(terms)。他们后来又让我添加了3个术语(terms),他们觉得太麻烦,不愿自己去维护站点。
相关联接:http://drupal.org/node/120624,Think in Drupal
一些问题我们大家都见过;在这里,我给出几个这样的问题.[记住,在论坛上发帖以前,县搜索一下.]
表格的格式乱了,图片不能显示了,还有其它的一些奇怪的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中,页面之间可以有链接的.这一点和不使用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>.
这部分给你讲一些技巧,帮你改进你的Drupal站点或者让你的生活更轻松.
你可以在你本地建立一个专门的“包罗万象”的站点,里面放上你用到的所有的drupal模块和主题,以及Update Status(状态更新)模块,用来监测模块和主题的状态。
状态更新模块将检查Drupal官方站点,并告诉你,你的模块是否有更新的版本可用。
你可能觉得这样做有点荒唐,不过在你拒绝这一想法以前,让我给你一些额外的提示:很多人最后发现,他们需要修补,调整或者说是修改模块以及主题。如果你创建了一个“包罗万象”的站点的话,你可以把未被修改的模块和主题都放在这里,这样你就有了一个干净的拷贝,当你的修改到了不能控制时,你可以重新使用这个干净的拷贝。现在,你不仅仅有了一个很好的备份计划,还有一个好处,就是知道了是不是需要升级模块。
相关联接:http://drupal.org/node/124933, Think in Drupal
很多人都觉得,浏览器的首页,要么是空白页,要么是网络上的某个页面,但是从没想过这个页面可以是你本地的.
这个是我首页的一部分.你可以看到,我对所有的维护任务(cPanel, FTP,等等)都加了链接,这样我就不用到处查找它们了.
我也把drupal测试站点的相应链接也加了进来,这样便也能很容易的找到它们了.
相关链接:http://drupal.org/node/120620, Think in Drupal
我怎么才能禁用“创建一个新帐号”呢?
导航到drupal的后台管理页面Administer » User management >> User settings。点击单选按钮“Only site administrators can create new user accounts”(只有站点管理员才能创建新的用户帐号)。
怎么才能完全禁止用户登录呢,禁用以后,当我使用时,又该怎么登录进去呢?
首先,你可以导航到Administer » Site building >> Blocks,将"User Login"(用户登录)区块的"Region"(区域)设为<none>。现在你的用户登录区块就消失了。
为了让你能够登录,我提供两种技术:
测试站点,就是用来试验或者开发新内容的地方,它不影响当前的用户,只有当新内容可用时,才迁移到在线站点上去.但是确保你测试站点与在线(live)站点版本的一致性,也是非常重要的.
让我们忽略这一点,就目前来讲,假定我们处于一个理想的状态中,你的测试站点(staging site)总是与在线站点保持一致的,所有新加的东西都要经过测试站点的检验以后才能正式上线.
有两种基本的技术,可用于站点的同步:
第一种技术非常耗费时间,如果用户评论很多的话,它很难保证不丢失数据.你还需要记好,都有哪些地方做了改动,除非你是同时更新两个站点的.如果内容之间存在依赖关系的话,你需要小心的按照顺序来对他们进行更新,这样你的随机访问者就不会打乱它了.
第2种技术,允许将用户评论下载到你的测试站点.在这里,可以将其纳入到内容中去,或者将其删除,或者保持原样.你要小心一些,这样在没有正式上线以前,你不会丢失新的,试验的或者未完成的内容.
哪一个更好呢?这个问题我回答不了.你需要权衡利弊,自己做出决定.就我个人来说,以我现在的年龄和记忆力,我觉得第2中技术可能更好一些,当然,也可能会丢掉一些未上传的东西.我还有一个坏习惯,就是在在线站点上更新了内容以后,忘记将修改同步到测试站点中去.
这个专题的更多讨论,可参看drupal开发者邮件列表中的这个线程一文,作者Larry Garfield (Crell)。
现在你已成为了一名Drupal专家了,下面的这些资料,你应该觉得非常有用:
一个节点(node)就是一个容器,用来装东西的.节点中的部分东西是你创建的,还有部分东西是Drupal自己创建的.
一个模块(module)就是扩展Drupal功能的一种方式。它通常包含许多代码(一般为PHP)以及一个样式表(CSS)。例如,如果你想包含元标签来描述你的内容的话。你可以添加"Nodewords"模块(也称为"Meta Tags"模块)。
一个摘要(Teaser)就是关于页面的一段介绍性文字,用来吸引用户访问整个页面。默认情况下,通常为页面内容的第1段,或者前两段,通常在后面还加上一个"read more..."链接。
主题,就是用来将你的内容展示给访问者的,怎么展示,使用什么样的样式,布局,等等都归主题负责。它包括的元素有,你的页首,图标(icon),区块布局等等。它也包含代码和样式表。
一个服务器通常是一个能够提供上网服务的计算机。这些服务可能是运行数据库,或者管理信息的收集和传播。
一个浏览器就是用来展示网页内容的程序。实际上,它通常是一组程序集,而不是单个程序;它还使用了一组表格集(例如,设置)用来控制它的展示。例如,IE,Netscape,和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),它可以用于各种情况下。在前面的例子中,我们可以把“生物”作为一个词汇表。而每个词汇表下面都有一个或者多个“术语集”用来描述你的东西。而“术语集”可以是多层级的,也就是说它们存在着等级之分。“属”和“种”就是多层级术语。词汇表用于输入类型(Pages,stories等等。)而“术语集”则指定给特定的节点(“对澳洲坚果产量的开创性的研究”)。注意,我说的是“术语集”,因为一个节点可以有一个或者多个术语与之相连;例如,那上面的“…坚果…研究”这篇文章为例,可以为其指定“坚果”,“树木”,“丰收”。通过任何一个术语(或者说关键字)都可以找到这篇文章。
面包屑是从Hansel和Gretel借来的术语,在这个故事中,主人公为了走出大森林,在他们走过的路上撒下面包屑作为记号。在目前的计算机用于中,它通常指的是页面顶部附近的一小部分,用来说明到达当前页面所走过的路径。例如,浏览这篇文章时,你会看到顶部附近有Home › Drupal简明教程 › 适用于初学者的Drupal菜谱,它意味着,你首先来到了Home,接着点击了“Drupal简明教程”,最后选择了“适用于初学者的Drupal菜谱”,最终你看到了这篇文章。
数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务;数据的存储独立于使用它的程序;对数据库插入新数据,修改和检索原有数据均能按一种公用的和可控制的方式进行。当某个系统中存在结构上完全分开的若干个数据库时,则该系统包含一个“数据库集合”。
SQL是数据库的查询语言。例如:SELECT country FROM user_profile WHERE username = "Nancy";它将得到用户"Nancy"所在的国家。
See also:
在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即将问世了,正式版可能还需要3,4个月的时间。具体的时间就等待Drupal.org上的信息吧。不过代码已经冻结了,测试版的功能已经成型。从测试版里面,以及相关的发布信息里面,我们可以看到Drupal7有很多不同于Drupal6的地方。在这么多改进之处当中,有3个方面是最主要的,一个就是数据库层完全进行了重写,采用了PDO。二就是CCK核心化,Drupal中所有的东西都是基于字段的,有了比节点还基本的一个概念,假如节点是一个分子,那么字段就是原子了。第三个就是Drupal的用户体验的改进。
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与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主题,拿drupal6的稍微做了一些修改,没有想到出现这样的提示: 此版本与Drupal 7.x不兼容应当予以替换。
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教程分为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里面的文件夹一样,可以文件夹下面再创建子文件夹。
如何将你的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主题下面的蓝色旗帜里。它们不是必须显示在一级链接下面的,它们也不是下拉出来的。如果你想建立一个基本的多层级链接的话,这样的二级菜单满足不了你的目的。你还可以怎么使用它,我不知道。使用一级链接已经很好的解决了导航和链接的问题。
如何创建一个外部链接的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(重量)的设置是可选的,或者你也可以使用拖拽的方式来设置你链接的顺序。
保存。
这就可以了!不需要编码,也不需要额外的模块或者插件,所有的都很简单直接。你可以边创建菜单,边添加内容,并根据你的内容来调整菜单项(比如,添加CSS,JavaScript等等)
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 模組,里面有很详细的安装说明
以及官方手册:Forum: create threaded discussions
相关链接: Think in Drupal
6 | db_change_field(& |
7 | db_change_field($table, $field, $field_new, $spec, $keys_new = array()) |
6 | db_add_field(& |
7 | db_add_field($table, $field, $spec, $keys_new = array()) |
我们在升级站点是,flag模块,升级时报错,
我仔细的检查了这个模块的
通过对比数据库,发现这段代码:
db_add_field($ret, 'flag_actions', 'repeat_threshold', $column);
没有起作用,查了一下API,发现Drupal6,drupal7的API变了,我的代码里还是6的,把它改为Drupal7的,重新运行update.php。正常了。
可能你先用drupal搭建了一个网站,最初的时候,大部分都是使用的默认功能,也很好用,随着业务的增加,你开始对网站作出修改.最初定制的是主题,同时还可以将一些简单的业务逻辑放到template.php中。随着业务逻辑的不断增加,以及特定的需求,使得drupal默认的功能,不再能满足你的网站的需要了。
这个时候,就需要添加功能。很多人会这样,选择一个功能比较接近的模块,直接修改其中的代码,让它满足自己的需要。这种方法在drupal中,是应该被禁止的,但是还是有很多的人使用这种方法,出于项目周期的考虑,出于开发技能的考虑。不管出于什么样的原因,这种方式在开始的一段时间内,是很方便,很快捷的,但是随着时间的推移,这种方式将会为你带来恶梦,你的网站无法升级,安全漏洞一个接一个,原有的开发人员离职了,后续人员不知道他在哪里动了手脚?
想要避免这种恶梦吗?那么你就需要了解,drupal的模块,你应该学习,和掌握模块的编写,以及drupal中各种钩子的使用。Drupal的模块,就是一个功能。你所看到的drupal核心的,里面有了简单的功能,但是这种功能,通常是比较简陋,朴素的。通过安装模块,就可以扩展这种功能。Drupal的模块放置在两个位置,一个是安装根目录的子目录modules下面,一个是sites/all/modules下面。前者放置的是drupal的核心模块,后者放置的是drupal的第3方模块以及自定义的模块。
在本部分,我们将从头开发一个模块。通过这个模块,你可以学会开发模块的规范,以及一些常用的钩子函数。为了让本文更有意义,我们决定选用一个实际的例子。在每篇文章的下面,向添加一个咨询的功能。匿名用户,提出咨询,管理员对问题进行解答。这个和drupal自带的评论模块多少有点出入,也就是说,现有的评论模块,不能满足需求了。我们要开发一个专门为自己订做的模块,实现自己的功能。
相关链接: Think in Drupal
这的确是一个实际的例子,lonlife的站长提出了,他想在文章下面提供一个咨询功能,我首先 想到了使用drupal的评论模块,我觉得这个就够用了,但是他觉得评论模块不是他想要的,我让他给我一个例子,也就是他想要一个什么样的咨询功能.它给了我一个链接,京东商城里面的.我截一个图,来说明这个咨询功能.
网友的咨询信息,和管理员的答复,是放到一起的,一个咨询仅有一个答复.这种方式,是非常适合中国的情况的,我看到很多网站上,都是采用这种模式.我想,评论模块是不是改造改造也可以实现这样的样式,我觉得是可以的,但是修改起来也比较麻烦,这样可能还不如自己写段代码管用.
另外,自己一直也没有编写过drupal6下面的模块,通过实践,也可以增加自己的经验,另外就是还可以以此写点东西,让更多的朋友学习使用drupal6。何乐而不为呢?
要编写自己的模块了,首先要做的就是在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
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
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
/**
* @file
* 让匿名用户可以向站长进行咨询
*
* 当启用后,就会在每个节点后面添加一个咨询链接
* 匿名用户不用登陆就可以咨询
* 管理员可以对咨询进行管理,包括编辑,删除,答复等等
*/
最前面是php的开始标签,第2行为CVS标记,是自动生成的,这里是根据评论模块的内容修改而成。再往下就是注释了,用来生成文档,实际中,很少用到,仅仅用来注明模块的功能,用途。
为什么不把info文件和module文件合在一起呢?就如同本周六我给大家讲解drupal主题的Info文件时提到了,info文件通常都比较短小,用来存放模块,主题的原数据,这些数据可以缓存起来,当系统调用这一模块,主题时,只用调用info文件中的内容就可以了,这样可以提升效率。
现在在模块列表页面,就可以看到我们的模块了。
Given an internal Drupal path, return the alias set by the administrator.
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界面文本,默认使用的是英文(比如“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
相关链接: http://drupal.org/contribute/translations , Think in 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
这个页面是用来简洁的讲述如何编辑.po文件的,从而将一个翻译好的项目贡献给社区.更多背景知识可参看#240243:参与进来:翻译部分的工作.
由于我至少需要25个单词,才能发布这篇文章,所以我在这里引用Havamal的一首诗:
你不能承受其重的
生活的艰辛
比智慧更珍贵.
认识不同的人
胜过收获黄金.
智慧仅仅是懒人的安慰剂.
本部分是用来讲解如何显示drupal核心界面翻译的状态的.不幸的是,随着drupal的发展,这种方式已经过时了,google的夏季代码项目本地化服务器,提供了一种新的方式.不过在没有采用这种方式以前,你还可以使用这里讲述的方式.
检查你的翻译的状态
为了查看PO文件中有多少字符串已被翻译好了,你可以试试这行代码:
for i in *.po; do echo -n "$i: " ; msgfmt --statistics $i ; done
许多PO编辑器已经包含了这一特性。
相关链接: http://drupal.org/translation-status , Think in Drupal
在一个CVS文件夹中,包含了所有的小的po文件,如果你想把它们合并到一个po文件中的话,那么可以使用下面的命令(仅适用于linux/unix)。你需要在这个CVS文件夹下执行这一命令。
$ msgcat --use-first general.po [^g]*.po | msgattrib --no-fuzzy -o nl.po
当然,你需要把nl改成你自己语言的代码。汉语为zh-hans.
为了方便大家一起翻译,可以将Drupal的POT文件切成多个子部分,每个部分之间都不重复.
在drupal核心中,多次出现的字符串都被放到了general.pot文件中了.这样就保证了,这些字符串将被翻译成同样的字符串.如果模块里面包含的可翻译的字符串少于或者等于10个的话,那么这个模块就不能拥有自己独立的POT文件,而它们的字符串将被添加到general.pot文件中.
当然,项目组成员之间还需要密切配合,这样才能保证翻译的质量.
如果一个语言,对某些语句,存在多种译法的话,那么就可以单独创建一个PO文件,来放置这些可被修改的字符串.比如在汉语中,可以将you翻译成你或者您,这个需要根据你站点具体情况来决定。
推荐的drupal PO文件编辑器有(没有优先顺序这里):
注意,一定要下载最新的版本,复数形式是gettext标准最近新加的.
假如你有一个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
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就搞定了。
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。我在这里仅仅用来说明问题。
有好几个翻译小组都开始使用本地化服务器(也称作翻译服务器)进行翻译了.可以在服务器的项目页面可以看到有哪些小组使用服务器了.
在进行翻译以前,先阅读翻译站点上的信息,以及该语言项目页面的相关信息,看是不是有该语言的具体指南,流程,或者术语.
注册/登陆到站点上.根据站点的配置,译者可能需要加入到他想要翻译的语言所在的小组中去.
每个字符串都可以作为翻译或者建议添加上去.在一些服务器上,所有的用户都可以添加翻译,而在其它服务器上,大多数用户只能添加建议,而建议只有经过授权用户批准以后才能转变为翻译.
当然,还可以从.po文件中导入翻译。注意:服务器现在还不能检查新的字符串是不是和旧的一样。如果有人导入的翻译中,大量字符串已经存在数据库中的话,那么就会造成大量的建议冗余。
服务器使用Unicode字体创建基于文本的图标。如果你的图标不能正确显示的话,你可以检查一下你的浏览器与Unicode 'Dingbats'区块 兼容性。注意:可能你需要安装一个支持Unicode ' Dingbats '区块字符的字体。这些字体名单可参看支持Unicode区块' Dingbats '的字体。
更多资源:
在将来,所有的翻译都将使用本地化服务器,这个适用于所有的语言.更多信息,可参看本地化服务器项目页面.在2008年1月份的状态更新中,项目维护者写道:
这个项目可用于上百个模块的翻译了,已经很好用了 ,但是到目前为止,还未成为drupal.org的主流翻译方式,还没有成为官方使用的方式.
所以,在等待官方主流的服务器的同时,一些翻译社区已经建立了自己的本地化服务器了.在项目页面有这方面的一个列表. DrupalChina简体中文汉化工作站的地址为http://www.drupalchina.org/hanhua/.
注意: 这个模块还有很多地方需要改进.有多个已知的问题尚待解决,并且用户接口和功能也可能发生改变.在决定使用这个服务器以前,先看看里面的问题列表,再作决定.
注意:从通常的编辑.po文件的方式,转为使用本地化服务器,这将影响到整个翻译小组。在作出决定以前,需要征得大家的同意。
预备条件:
1,安装和启用模块
安装以下drupal模块:
阅读模块的README文件,看看里面是不是需要其它的安装指示。
访问admin/build/modules并启用以下drupal模块:
2,配置权限
导航到Administer > Users > Access control (admin/user/access),设置以下权限:
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]"。
本地化服务器的列表,可参看项目页面。
和其它站点一样,记住经常备份。
更多资源:
对于drupal开发者来说,如果想为模块添加多语言支持的话,可以参看手册的多语言支持部分.
Drupal核心和第3方模块/主题的界面翻译, 是完全独立于这些项目本身的开发流程的. Drupal核心和第3方模块/主题的开发者为代码中要被翻译的文本专门添加了特殊的标记.需要使用一个提取程序来收集这些字符串,并生成一个翻译模板文件.由于在翻译领域已经有了相关的工业标准,我们选择了一个已有的标准,有很多成熟的工具支持这一标准.
GNU Gettext工具集提供了大多数翻译所需的解决方案.由于Drupal使用自定义的标记来标明所要翻译的文本,所以我们提供了自己的工具来生成Gettext翻译模板,生成Gettext翻译模板模板以后,就可以使用任何支持Gettext的工具来编辑模块和译文了(通常一个简单的文本编辑器就可以了).Drupal可以导入翻译后的Gettext模板。Drupal.org,根据你翻译的文件的不同,语言的不同,将翻译文件放在了独立的地方。
翻译流程
下面是翻译的流程(点击查看大图):
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帐号的话,你可以把文件提交到这里,如果没有的话,你可以在该模块下提交一个问题,然后让模块维护者提交你的翻译。
更多资源:
每个语言都有自己的指南.下面是一些基本的指南,你可以依次为起点将Drupal翻译成自己的语言:
“Linux学校:本地化和翻译”里面的建议很值得参考:
你的任务是…表达内容,所以对于原始文本已可以使用意译(当然,首先所讲的内容要表达出来)。阅读原文,理解它的意思,然后再考虑使用自己的语言表述同样的意思(不需要逐字翻译)。
如果译者的前后用语能够具有一致性的话,那么人们就更容易理解Drupal了。如果你把Drupal中的一个字,前后翻译成了多个不同的同义词,那么对于同样的功能,读者可能就不知道你在讲什么了。为了在你的整个Drupal站点上保持这种一致性,推荐你使用一个单词对应表,专门记载Drupal中常用术语。英语-挪威语drupal术语对照表为此提供了一个很好的示例。如果你想创建一个自己的对应表的话,那么需要动员自己语言的Drupal社区人员共同讨论相应的标准和对应译法。最好不要自建一个对应表,而是从已有翻译项目中重用已有的译法。
另外重要的一点是,本地化文件的写作风格。如果你的翻译项目已有了一个正式的风格的话,那么就遵守它。如果风格更口语化,那么就采用这种风格。如果你觉得你的翻译比原有的更好,那么就可对其进行重写,不过此时也要采用同样的写作风格。
还有,你还要注意drupal中特定文本在的长度。有时候,比较长,你可以多说一点。如果长度比较短的话,你需要长话短说了。
尽可能的把网络和技术术语翻译成自己的语言,尽量避免使用英语术语。如果你不确定这个术语的特定译法的话,你可以向相应的权威部分询问。对于那些尚未标准化的术语,不妨引入新的术语。当年“鼠标”一词开始使用时,大多数人都觉得这个词很荒唐可笑,不过现在也被大家接受了。
其它方面,则会由于语言的不同而不同。你可以联系你的语言的翻译项目的维护者,或者联系你的语言的特定社区。
References:
参考:
Drupal挪威的手册页面的翻译部分
Linux学校:本地化和翻译
第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核心翻译项目中你的语言的维护者。他们会为你提供帮助的。
如果还是找不到组织的话,你还可以看看groups.drupal.org上的区域小组中,是不是有本地语言的组织。
下面列出来的是一些特定语言社区的drupal手册页面的链接。(如果链接过时了,你可以在文档问题中通过提交问题来通知我们)
翻译用户界面
你可以翻译界面文字 (比如"Log in"按钮和"Add new comment"文字).对于许多语言来说,都已有了完整的或者部分完整的翻译可用.你需要:
· Locale (核心模块)
· 翻译下载
更多可参看:
· 译者指南(如何贡献翻译)
· 本地化客户端(Localization client)(第3方模块,使得界面翻译更加容易).
对从右到左语言的支持
如果你的网站的文字是从右向左展示的,那么你需要一个支持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方模块)(手册)
更多可参看:
· All contributed modules for multilingual functionality
· Tutorial - Building a multi-language site
· 教程 – 构建一个多语言网站
其它的drupal国际化挑战
当你为世界的某一特定地区或者特定语言的组织创建网站时,会遇到各种各样的挑战,比如说,日期格式,各种特殊字符,货币,和税收计算。更多信息可参看下面的链接,如果你有东西分享的话,可以将它添加到这里。
更多资料:
· 翻译支持论坛
· 亦难解答
· groups.drupal.org – 国际化(用于内容翻译和其它的国际化问题)
· groups.drupal.org – 翻译(用于界面翻译)
· 翻译邮件列表
· groups.drupal.org – 特定地区的各种组织 (一些特定语言的组织列在“工作组”下面,而不是“地区”下面)。
本指南是对官方升级指南的补充.请先阅读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脚本将整个流程自动化(这样你就不能对整个过程进行太多的控制了)。
准备你的站点
备份你的站点
下一步是备份整个站点,包括文件和数据库。如果没有备份的话,千万不要升级。大多数情况下,你可以通过你的主机控制面板来完成备份,当你具有SSH访问权限的话,使用命令行备份将会更加快捷。参考文章:备份你的Drupal站点。这也有一个非常有用的备份脚本,如果你喜欢的话,就可以使用它,或者你可以使用下面的基本命令进行手工备份:
mkdir /home/yoursitename/backups/08-17-08
升级你的站点
我们假定你没有修改Drupal的核心文件(如果你修改了任何一个Drupal核心文件的话,你的升级过程会变得麻烦起来或者甚至非常困难),而且你将所有的个人数据(比如,第3方模块,主题,和文件)都放在了/sites文件夹下(对于Drupal5,你可能将你的/files文件夹放在了站点的根目录下,而对于Drupal6,/files在默认情况下是放在/sites目录里面的),然后你就可以自信的删除其余的Drupal文件和目录了,并将最新的Drupal版本上传上去:
使用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
文件夹里同名的文件和文件夹,保留所有的个人文件和文件夹(比如/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 ../
清理临时文件/文件夹,并将站点重新上线
如果要制作一个网站的话,首先想到的就是首页,从首页开始,先得到一个简单的模型,然后再逐步的去实现相关的功能.对于drupal网站的建设,当你搭建好环境以后,第一步就会遇到首页的制作了。
根据Drupal网站的首页的复杂程度,可以采取不同的方式,我所要讲的就是我在工作中,曾经碰到过的一些方式,可能会有所遗漏,如果有所不妥的话,欢迎指正。
大概可以分为以下几种:
1, 将一个page页面设为首页
2, 把各种类型的节点推到首页去
3, 使用cck为首页单独创建一个节点类型
4, 使用front模块
5, 使用drupal的panel模块
6, 使用nodeasblock模块
这个分类不大规范,仅仅作为参考。
drupal的首页制作,有多种方式,可谓条条道路通罗马,很多复杂的情况自己也没有遇到过,我会搜集更多的一些资料,到时候和大家分享一下。
相关链接: Think in 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
我们把views 和panels的内容独立了出来,先跳过去.现在我们已经看到,已经将网站搭了起来,也基本上满足了客户的要求了.现在客户又提了出来,要国际化,drupal的新闻,要有英文的版本,来扩大知名度,打入国际市场.
在drupal5种,国际化只有一个local模块,内容的国际化需要第3方模块的支持,比如localizer.而在drupal6种,i18n得到了进一步加强,除了核心的local模块以外,还增加了Content translation模块,这个模块我没有用过,让我们便实践便完成这篇教程的编写。
在管理界面admin/build/modules,选中local和Content translation(内容翻译),点击保存,弹出来“
Some required modules must be enabled
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模块用于系统界面的翻译,并用于管理并开启指定的语言)一道,用于创建并维护对站点内容的翻译。
设置内容翻译与开启翻译支持的内容类型。
设置启用了翻译支持的内容类型:
本地化(locale)模块提供的语言切换区块使用户可以自行选择语言版本。
“
接下来,我们将按照这里的提示,来制作中英文切换的网站。使用的内容还是在前面用到的。
相关链接:http://drupal.org/project/zh-hans ,http://drupalchina.org/forum/8 , Think in Drupal
我把上篇文章编号为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
那么就让我们开始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)的配置可参看本站及官方上面的配置信息。输入好这些配置以后,点击保存。显示安装成功。不过里面有错误信息出现。“
”
这是由于现在的网站,主要是系统环境不支持发送邮件。这个问题的解决办法,可参看阿舍的建站经验,我昨天刚刚看他写了篇这方面的文章,http://drupal.soa.tw/node/234,里面有说明。不用管这个错误信息。点击“your new site.”链接,进入http://localhost/drupal-6.5,现在看到的还是drupal的管理界面。我们这就用它开发搭建我们的网站。
相关链接: Think in 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
我们接着前面的继续往下学习.由于网站分成了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
把摘要去掉,只保留标题,这是客户提出来的需求.如何去掉摘要,也有多种方式,常见的有,使用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
CCK模块和views模块很好用,但是也有缺点,最大的缺点是,当你学会了使用这两个模块以后,你老想着用它,有种上瘾的感觉.我刚开始学会的时候,是个地方都想用CCK,比如创建首页的时候,我就想到了将首页当作一个特殊的节点来用,并亲自实践过.后来,我在网上看到过以前辈写的文章,介绍用CCK来制作首页的方法, 看来这种方法早有人用.
如果说教程前面的部分还有点假大空的话,那么越往后越不好写,所需的技术也就越高了.本文可以当作drupal 6.5 CCK的入门教程吧.先列一下中文方面的资料吧,都是CCK的:
1. Drupal cck contemplate theming 技巧, 教學
Drupal cck contemplate theming-drupal的使用教程
台湾阿舍的CCK
Drupal China 上Loocor的CCK & 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上,吃吃早饭,干干活,然后再接着写。
在前面的文章中,我们使用CCK创建了一个front page节点类型,其实这还没有用到CCK,上文中用到的是drupal内置的创建节点类型。下面让我们使用CCK再添加4个字段。
导航到admin/content/node-type/front-page,
点击“Manage fields”链接。并添加四个字段,这里都是文本,2个是单行的,2个是多行的。保存一个字段后,会出现这个字段的设置表单编辑页面,这里我用的都是默认值。这后的效果如下:
现在让我们创建一个front page节点,并将其设为首页。这个时候我注意到,在“drupal国际新闻 正文” 字段下面,不能设置输入格式。怎么才能像body那样,下面也可以设置格式呢?我们还需要回到刚才的页面。
导航到admin/content/node-type/front-page/fields,对“drupal国际新闻 正文” 字段重新配置,选择“Filtered text (user selects input format)”,保存。
对于“drupal安全公告 正文”字段也进行相应的配置。然后再次访问front page节点的创建页面。输入上文中提到的html内容。部分截图如下:
保存以后,我们得到了node/8,我们将这个节点设为首页。比较难看,
让我们去掉我们不想要的内容,包括把标题移到下面,以及去掉“add new comment”l链接,还有“Mon, 10/20/2008 - 16:59 — admin”,以及黑体的标题,正文,就是显示的和上文的一样。现在让我们开始修改页面模板。
先到sites\all下面添加一个themes目录,由于我们现在用的是官方的garland目录,这是自带的,最好不要直接修改它,我们可以创建一个garland的子主题。不过在这里我们还是直接的在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
?><!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
你可以为特定节点类型的节点单独的创建一个节点模板文件,对于我们的首页节点类型,如果要单独的定制它的外观的话,就需要创建一个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
我们在前面提到,在节点模板中,模板使用$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
?>
<?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创建的节点设为首页。有点累了,歇会先。
使用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
没想到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的输出,就可以了。效果如下:
这个文件很有用,但是很多人,特别是初学的,连这个函数是干什么的都不知道,所以我在上文中让大家好好的看看这个函数。
这里可以干什么?可以覆写各种各样的主题函数,可以为page,node,comment,等模板文件中添加自定义的变量,还可以在这里添加模板建议(template suggestion),另外,这里面的函数你可以在页面模板文件中,直接调用。在前文中,我们就是这样用的。
对于许多小的drupal站点,如果觉得编写drupal模块真的比较麻烦的话,就可以使用这种方式,想一想吧,template.php中你可以放置任意的php函数,还有什么功能,不能直接实现呢?php能够实现的,drupal也大都可以实现。当然对于比较大的站点,用到这个文件的地方也不少。所以认真地读读garland的template.php,对于以后的开发工作是很有帮助的。
强调完这一点,接下来让我们看看front模块的使用。
相关链接: Think in Drupal
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
登录到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 'zhupou.cache_menu' doesn't exist\nquery: SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:navigation:page-cid:node:1'\";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标,里面报错
SHOW INDEX FROM `watchdog` ;
#145 - Table './zhupou/watchdog' is marked as crashed and should be repaired
”
原来这个表坏了,总算找到原因了,怎么办,平时没有经常的备份,数据丢失了,自己的原因,还是虚拟主机服务商的原因,因为前段时间数据库一直有问题,如果是后者的话,真的是无商不奸了,先不管这个,需要找到解决的办法?在没有找到办法以前,先把这篇文章贴上去。
相关链接: Think in Drupal
昨天晚上搞到快12点了,还是没有搞定,原本以为半个小时就可以的事情,却遇到了难以解决的问题,前篇文章贴出来以后,已经到了12点了,也就是今天的0时,昨天搞不定,今天一大早(这个也太早了)接着搞。
在phpmyadmin上,察看表watchdog的结构,搜索,插入都报错,同样的错误信息。在操作页面,有一个表维护,下面为“强制更新资料表("FLUSH")
果然,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
“
这意味升级成功了。不过还有工作要做呢。
7,导航到drupal管理员界面admin/build/modules,启用第3方模块。并重新运行update.php。
本地升级成功。升级在线站点。与本地不同的是,除了.htacess文件,我做了改动,为了省事,没有删除和拷贝这个文件,其它都一样。没有出现任何异常。在线站点升级成功。俺的站点已经更新到drupal6.5了,估计现在没有人访问。
最近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,这个以前还真的没有注意,不过还好,这几个模块暂时还用不到。
首先写了一个测试函数mssql.module,用于测试,结果出现以下问题:
终于可以正常工作,返回了正确的结果.
在Fedora上安装Drupal并不太费劲,虽然相关的文章少了些,只要你肯多搜索一下, 在drupal.org和整个互联网上,你会找到很多相关资料的,通过不断的尝试和摸索,你就可以将Drupal成功的安装在Fedora上了.本文的目的在于介绍Drupal在Fedora 9/Postgresql上的安装,在这种情况下,一般地README文件所介绍的标准的Drupal安装方式就行不通了,而官方网站drupal.org上所列的标准安装方式也不再适用了.在这种情况下,按照Drupal标准的安装方式就行不通了.
可能本文的部分内容你会在别的地方也能找到,但本文可以满足你在Fedora 9 和Postgresql上安装Drupal的全部需求,你只需要照着做就可以了.
Postgresql 在Fedora的配置
启动Postgresql
createuser --pwprompt --encrypted --no-adduser --no-createdb drupal,
这将弹出一个提示符让你输入密码.
以前,在命令行调用完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/284991 , Think in Drupal
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中将会返回一些权限错误信息,你需要进行一下步骤:
现在,出发!
现在,你就可以打开你的浏览器,输入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的文档。
我的环境为: 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\改成你的目录,把路径写对。
把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核心,共用部分数据库.
我的环境是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,里面给出了各种环境下面的配置
在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
本地安装了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,就看到这个选项的作用了。
搞drupal有段日子了,从来没有配置过cron.一般都是同事去配置这些服务器段的事情.设置好acquia的订阅信息以后,我收到了若干封Acquia Support发来的电子邮件.里面有一封说:“We have not received a heartbeat from your site since
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服务了。
随着我们整个社区的快速成长,我们越来越需要将成长过程中好的东西---经验、教训---沉淀下来,保留下来。也就是说,我们需要继续保持Drupal的有趣性、开放性、挑战性,以及公平性。新的Drupal行为守则((DCOC)申明了值得大家共同遵守的理念。我们可以把它理解为用户的编码标准。它是对我们理念的一次表述,而不是一个苛刻的规则手册。它也是我们已有价值观与整个Drupal社区之间进行沟通的桥梁。
1.要体贴他人
2.要尊重他人
我打算汉化drupal的网店购物车模块Ubercart,版本为drupal5.首先,我先通读了drupal手册的译者指南部分.对汉化大致有了一个印象.在以前的工作中,很少与中文打交道,唯一的一次是给香港的客户做项目,遇到过汉化,不过那时仅仅用到了drupal5内核的汉化包,直接导入就可以了.现在想要做的是汉化drupal第3方模块.
除了阅读译者指南以外,我还到drupal中国论坛的汉化栏目里面转过,里面重要的文章差不多都读了个遍.从昨天开始,汉化Ubercart模块的子模块uc_store.由于是5.x,所以翻译包所在的目录为modules\ubercart\uc_store\po,目录名为po,而在drupal6.x中,这个目录名改为了translati