Plone学习-PloneBook中文版

来源:互联网 发布:金山软件董事长 编辑:程序博客网 时间:2024/05/17 07:49

PloneBook中文版

 

第一章 简介... 1

Plone是什么?... 1

什么是内容管理系统?... 1

为什么使用基于web的内容管理系统?... 1

什么是内容管理框架?... 1

什么是Zope... 2

为什么使用ZopePlone... 2

什么是Python... 3

本书目标读者... 3

本书预览... 3

本书覆盖的Plone版本... 4

Feedback. 4

第二章 Plone的安装和升级... 5

需要... 5

服务器... 5

客户端... 5

下载Plone. 5

使用Windows Installer安装... 6

The Installer 6

Plone Controller 7

Windows Installer内容... 11

Mac OSX上安装... 12

Mac OS X Installer安装的内容... 13

Linux上安装... 15

Debian. 15

Red Hat/Mandrake/Suse. 15

从源代码安装... 15

安装前需要... 15

取得最新版本的Plone. 15

安装... 15

添加一个PloneSite. 16

升级已经安装的Plone系统... 16

1.0 Alpha版本以前的版本迁移... 16

1.0 Beta3以前(alpha以上)迁移... 17

1.0 Beta3以后的版本迁移... 17

已知的迁移问题... 17

第三章 Plone使用(完)... 18

使用Plone. 18

加入站点... 18

登陆... 18

忘记密码... 18

退出登陆... 19

成员文件夹... 19

设定用户参数... 19

添加和编辑内容... 19

文档是什么?... 19

添加文档... 20

编辑文档... 20

为文档设置特性... 21

发布文档... 21

添加和编辑其他形式的内容... 21

Image(图像)... 22

File(文件)... 22

Link(链接)... 22

Topic(主题)... 22

Folder(文件夹)... 22

News Item(新闻条目)... 22

Discussing content(讨论内容)... 22

内容搜索... 23

第四章 Plone工作流(完)... 24

工作流系统... 24

Object States(对象状态)... 24

用户角色... 24

转换——改变对象状态... 25

本地角色... 25

发布对象... 25

审阅对象... 26

对象发布后的编辑... 27

第五章 配置Plone. 28

Zope管理接口... 28

管理接口中Plone站点的布局... 28

动作... 28

动作概要... 28

动作提供者... 29

槽位置(Slots... 30

About... 31

Calendar(日历)槽... 31

Events (事件)槽... 31

Favorites(最喜欢)槽... 32

Login(登陆)槽... 32

Navigation(导航)槽... 32

News(新闻)槽... 33

Related(相关)槽... 33

Review(审阅)槽... 34

写自己的槽... 34

导航和表单... 34

Syndication(联合管理)... 34

第六章 定制Plone(完)... 36

一些基本概念... 36

皮肤... 36

层(Layers... 36

修改logo,一个快速示例... 36

修改logo,说明... 36

定制其他部分... 38

Style Sheets(样式表)... 38

Images(图像)... 38

Plone contentPlone内容)... 38

Plone templatesPlone模板)... 38

制作一个全新的皮肤... 38

样例站点... 39

其他配置... 39

修改tabs. 39

修改日期... 40

Plone的页面渲染... 40

main_template. 40

main_template.pt中的槽... 41

header 模板... 41

html_header 42

第七章 Plone风格向导(完)... 44

Plone HTML. 44

基本文本... 44

列表和表格... 44

嵌入的风格... 45

Plone颜色... 46

Plone风格列表... 46

第八章 扩展Plone (完)... 47

创建新的内容类型... 47

重定义现有内容类型... 47

创建新的Zope产品... 49

使用ArcheTypes. 49

Plone的表单和导航栏... 49

Portal 表单... 49

Portal navigationPortal导航)... 50

诊断Plone安全性... 51

第九章 维护和优化Plone. 52

调试模式... 52

简单优化... 52

使用Apachemod_proxy缓存静态内容... 52

这不是唯一的方法,但可用... 54

增加ZODB Cache大小... 54

缓存槽位置(slots... 54

缓存页面... 56

Plone缓存管理器... 56

缓存404错误页... 56

打包Plone. 56

备份Plone. 57

什么时候备份... 57

备份什么... 57

如何备份... 57

第十章 结构化文档... 59

基本文本格式... 59

斜体字... 59

下划线文本... 59

加粗文本... 59

标题和段落... 59

未经格式化文本... 60

未经格式化文本块... 60

嵌入的未经格式化文本... 61

列表... 61

普通列表... 61

数字编号列表... 62

定义列表... 62

链接... 63

链接... 63

电子邮件... 63

参考... 63

图像... 64

表格... 64

第十一章 Plone案例研究... 65

安装Plone. 65

Almost starting to fiddle. 66

Starting to fiddle. 66

定制Plone. 67

修改tabs. 67

修改slot 68

修改zpt 68

缓存... 69

一些hack(删改)... 69

日历上的新闻... 69

Plone文件夹打开Syndication. 70

定制策略... 70

迁移... 71

附录A 资源... 72

网站... 72

开发... 72

学习资源... 72

附录B 常见问题和解答... 72

附录C 商业化Plone. 72

附录D 关于Plone. 72

附录E 词汇... 72

How-To. 73

国际化和本地化... 73

取得所需软件... 73

安装LocalizerTranslationService. 73

添加Plone语言文件... 73

translation service指向语言目录... 74

修改Plone Site的默认字符... 74

修改Zope管理接口(ZMI)的默认字符... 74

 

 


第一章 简介

Plone是什么?

Plone是免费的、开放源代码的内容管理系统(Content Management SystemCMF)。Plone着重于适合各种组织使用。它带有一个工作流引擎、预先配置的安全和角色系统、一组内容类型和多语言支持。有来自全世界的众多开发者、作者和测试者每天为Plone做各种贡献。Plone是基于内容管理框架的。(Content Management Framework)。

 

什么是内容管理系统?

要给内容管理系统(CMS)下个定义很困难,比找个要卖给你CMS的人还难。简单来说,CMS用来管理内容,通常是为了web site管理内容。CMS的主要目的是用来方便的进行内容的创建、发布和修复,以适应商业应用。

 

l         内容管理的麻烦在于它的琐碎或不可能实现

 

不同CMS可以是否集成web分成两类:基于web的系统和非基于web的系统。Plone是免费的、开放源代码的基于web的内容管理系统。

为什么使用基于web的内容管理系统?

理解Plone这样的内容管理系统最简单的方法就是将它与标准web站点设计工具(如Macromedia Dreamweaver)进行比较。他们都可以在远程计算机上制作页面,并提交用来确认或发布。但有以下四个方面的区别:

l         任何具有所需权限的用户可在任何位置制作网页,使用标准浏览器,无需任何特殊软件。CMS的使用比DreamweaverFTP容易,只需很少的培训,许多制作任务可分配给不熟练的人员。因此,CMS使得更多的用户可在WEB上创建和编辑内容。同时,较少的培训和较低的技巧使得制作和维护的成本降低。

l         通过输入文本、上载文件到站点预先制作的模板中来制作页面,保证页面的统一风格。即使直接制作发布web页面的人员非常多,也可保证风格的统一,更重要的是内容结构的一致性也可保证。

l         CMS中的工作流控制可充分使用,web管理员的工作可有效的分配给工作在不同地点人员,并不会降低安全性,并保证质量标准。

l         不同版本的文档自动保存,需要时可进行自然的审核跟踪。

内容管理系统的这些优点对大型组织或大型合作项目更为重要。

什么是内容管理框架?

内容管理框架是一个应用,包括一系列Zope工具。这些工具构成的框架提供了许多内容管理系统需要的关键服务。内容管理框架可作为单独产品使用,或者如Plone一样建立在它的基础之上。内容管理框架提供了核心的工具如Workflow(工作流)、个性化和目录化。内容管理框架的开发由Zope公司领导,是一个开发源代码的产品,受益于世界上众多的开发者的辛勤劳动。

主页:http://cmf.zope.org

什么是Zope

Zope是一种开发源代码的web应用服务器,用python语言编写。它是可升级、稳固、功能强大的系统,包括一个对象数据库、web服务器和多种模板语言。Zope主要由Zope公司开发和提供支持,也可从来自世界各地的开发者得到帮助。

主页:http://www.zope.org         

为什么使用ZopePlone

ZopePlone是开放源代码软件(OSS),也就是说任何人可自由取得源代码。制作ZopePlone的人的商业模型是从咨询服务中获取利益,主要在于定制或企业化应用。其他开放源代码CMS系统还有MidgardBitfluxOpenCMSWyona

专有的和开放源代码的内容管理系统从技术上讲并没有什么不同。在两个阵营中,都有好的、中等的和较差的产品。文档和支持的质量也有很大不同。主要的不同是开放源代码的CMS相比专有系统而言,开放源代码的CMS由较小的公司制作。这就增加了对这些小公司能够持续多长时间,能够提供怎样的支持的怀疑。以我来看,不同之处更多的是表面的,而不是实际的东西。开放源代码的产品更小,对一个客户或一个关键人物的离去更加敏感,而专有系统产品较大,受收购(如AllaireMacromedia收购)和IT股票市场的反复无常(如Broadvision)的影响。总之,两者都会很容易的消失。不同在于,对开放源代码产品,用户可以取得源代码,可以进行维护、定制和开发。没有制作者的积极介入,这些工作对专有系统是无法完成的。这才是采用开放源代码产品的关键原因。

为什么采用ZopePlone而不是其他开放源代码的CMSPlone基于ZopeZope是为建设内容管理软件的一个框架。在某种意义上,Zopeweb应用的操作系统。CMF就是一个web应用,用来方便建设CMSPlone就是一个基于CMF,运行在Zope上的内容管理系统,带有自己的一组模板和文件类型。以我们的观点(我们指的是由WebInternet指导组WISG设立的CMS工作组的观点)Zope比其他竞争性产品更胜一筹在于以下原因:

l         Zope是面向对象的,在某种意义上,在Zope中出现的所有内容(网页、图像、链接、文件等)都是对象,包含在一个对象数据库中。数据库是层次化的,而不是关系型的,特别适合于层次化的文件结构。技术人员会认为数据库是行列结构的表格的集合,与主键值相关。Zope的数据库是不同的,与普通的文件系统结构很类似,对象包含在对象中。

l         Zope对象数据库中包含对象的所有老版本,这对撤销修改,对协作文档的版本控制和需要审核轨迹的元素非常有用。

l         Zope中包括大量特别适合大型组织和协同工作的工具,后面的手册中会介绍。例如:预定义的数据库搜索,基于灵活的搜索标准,自动显示符合特定用户定义条件的所有对象。

l         Zope可在所有平台上使用,包括:UnixLinuxMac OS和广受欢迎的Windows982000XPNT),而其他开放源代码CMS或专有系统并非如此。

l         Zope是一个非常友好的开发环境。可通过点击按钮完成脚本的定制拷贝,而将原始版本保留在原来的位置,这是我遇到过的具有最好安全性的系统。

l         Zope中可方便的设计结构化XML文档,带有链接到文档结构的工作流。这是大型组织管理系统的基本特性,促进了文档结构和风格的一致性和流水线工作流。

l         最后,Zope为大型组织使用而设计,具有以下特性:大量贡献者致力于合作项目,他们位于不同地点,使用不同的平台。强大的组织需要灵活性和安全性,需要定义具有不同浏览、书写、编辑、批准大型项目不同部分权限的本地角色,可伸缩到大量对象和服务器。

第七,Zope team与竞争者的文化的不同对大型组织至关重要。Zope的一个客户US Navy,使用Zope管理RDproject,这是一个大型,公共部门组织,关注灵活性和安全性,对大部分公司都一样,无论公共的还是私有的。

Plone(区别于Zope)而言,我认为超越基于Zope的通用的CMS的概念。Plone至少给Zope增加了两个有用的特性,对工程科学web站点非常重要:

l         整洁、雅致的导航框架,依赖于文件夹和内容视图,而不是html文档链接(需要更新)。受益于导航快捷方式(如公告栏,显示最近几天创建和修改的对象,避免了要浏览整个站点才能找到这些对象)的帮助

l         创建复杂结构文档的简单工具,如PIQUPC表单,每个文档的不同部分对不同的观众可见,可定制的确认路径

第一个特性使基于Plone的站点可以简单,快速的开始使用。第二个特性使它易于管理,不像其他CMS更多的构思发布而不是内容的处理。

什么是Python

Python是功能强大的、解释性、交互式、面向对象的编程语言。Python是开放源代码的,可运行在几乎所有系统平台之上。Zope主要由Python编写,部分用C语言进行了优化。

Python,(名称取自希腊神话,潜藏在Parnassus山上的巨大毒蛇,被Apallo杀死)1.生活在亚洲、非洲、澳洲的无毒大蟒蛇,缠绕猎物使之窒息而死 2.一般的,所有绞杀猎物的大蛇 3.特别可怕的,讽刺压榨特定其他人所有钱财的人,称为VHLL’s ???

主页:http://www.python.org

本书目标读者

本书主要目标读者包括:

n         系统管理员

n         站点内容管理员(主要负责检查添加和发布的内容)

n         站点成员(加入的人,可以添加内容)

n         站点开发者(编写HTML或代码的人)

本书预览

1.            简介

2.            安装Plone

3.            Plone使用

4.            管理Plone

5.            配置Plone

6.            定制Plone

7.            风格向导

8.            扩展Plone

9.            优化Plone

10.        案例研究

11.        附录A 资源

12.        附录B 常见问题及解答

13.        附录C 商业化Plone

14.        附录D 关于本书

15.        附录E 词汇

16.        附录F 结构化文档

本书覆盖的Plone版本

本书覆盖了可从Plone.org上下载的最新release版本的Plone。不覆盖CVS版本或以前的版本。还覆盖了定制的默认站点。然而还存在其他版本如private site,但在本书中不覆盖,但大多数概念是相同的。

Feedback

非常高兴用户能有回应,最好的方式就是发送电子邮件到文档邮件列表,会有人进行回复。

 


第二章 Plone的安装和升级

这一章介绍Plone的安装,用户得以使Plone运行,Plone的升级在这一章的结尾介绍。

需要

Plone可安装在任何Zope支持的平台上:WindowsMac OSXLinux,大部分UnixsSalaris。在Windows2000上安装时需要写注册表,可能需要用户具有较多的权限。

服务器

显然在高性能的计算机上Plone会运行的更好,通常投入正式应用的大型站点的计算机的主频不要低于1.5GHz,内存不小于1GB。但在主频600MHZ64M RAM上为中型的站点也能提供很好服务。更多有关性能的信息,参考第九章《Plone优化》。

Plone基本安装需要大约50MB硬盘空间。如果已经安装了ZopePython,所需硬盘空间就小得多。但要考虑到Plone对象数据库会根据存储的数据量而变成任意大小。

客户端

Plone只需要一个可以访问服务器的web浏览器就。如果用户要登陆,浏览器必须允许cookiesJavaScript不是必需的,但可提供更丰富的用户体验。

Plone 1.0支持的浏览器包括:

n         Internet Explorer 5.5以上(建议使用版本6.0以上)

n         Netscape 7.0以上

n         Mozilla 1.0以上(建议使用版本1.4以上)

n         Opera 7.0以上(建议使用版本7.20以上)

n         Konqueror 3.0以上(有些不一致,但也许直到在Safari中的KHTML代码更新后前只能这样)

n         Safari 1.1以上

Plone在下面的浏览器也能完全工作,但是和Plone的原始外观会有些不同:

n         Netscape 4.7

n         Internet Explorer 5.0

n         Internet Explorer 4.0(未完全测试,应该工作的很好)

n         Konqueror 2.x

n         Lynx(文本模式)

n         W3m(文本模式)

n         AWeb

n         Links(文本模式,图形模式可选)

n         任何支持标准HTML,支持表单输入和cookies的浏览器(包括大多数移动PDA浏览器)

下载Plone

最新的Plone可在 http://www.plone.org/download 下载。未来可能有CD-ROM发布。

使用Windows Installer安装

The Installer

Windows Installer自动在Windows上安装Plone。已经测试过Windows 9xMENT3.51+2000XP。但在其他版本也应该可以工作。建议用户在安装的计算机上有管理员权限。如果已经安装过ZopePython,用户可能希望安装源码,以节省硬盘空间。安装包括额外的包和选项,预装载的数据库和其他一些东西。

Windows Plone Installer可从Plone.org网站下载。下载完后,双击图标开始安装,会看到下面的界面:

installer需要完成几个步骤,按照提示点击下面的NextCancel按钮。没有必要讨论所有步骤,大部分都是解释说明文字。当出现Enter a password界面时(见下图),必须输入一个密码,这就为用户admin设置了密码,后面会需要这个密码,所以要记住。如果忘了的话,可以使用Plone Controller重新设置。

安装需要大约3分钟,依赖于计算机的速度。在安装的最后需要做一些工作,如编译所有Python文件。安装完成后,Plone默认不会启动。如果保持Launch Plone Controller复选框选中的话,会启动Plone Controller,用它可以启动Plone

Plone Controller

Plone Controller提供了图形界面,用来方便的管理Plone,可控制log文件,端口和Plone启动等。要启动Plone Controller,从Start Menu中选择Plone

controller启动到Control页,用来方便的启动和停止Plone例程。如果已经等不及了,单击Start启动Plone

该界面告诉用户Plone是否启动。在按钮旁边是高亮度显示的当前状态(Current Status)信息。由于Plone默认不会自动启动,必须单击Start来启动Plone。在较慢的计算机上,要花一点儿时间启动,特别是第一次,会导致控制器超时,认为Plone没有启动。重新单击Start就会正常。该问题会在以后的版本中修复。

Plone启动后,可以单击View Plone按钮访问Plone站点。这会启动浏览器来访问Plone站点。如果定义了HTTP Manage端口,Manage Plone按钮可把用户带到Zope管理接口,默认这个端口是8080

Services

Services标签用来设定Plone监听进入连接的端口,包括HTTPFTPWebDAV。如果让某一端口保持空白,该端口会被禁止。确认没有其他服务器监听相同的端口,如IISApachePWS都可能监听同样端口。

n         HTTP:指定用户访问Plone的端口,默认是80。尽管这个端口不是必需的,但不指定这个端口用户无法通过浏览器访问Plone。如果该端口设定了并且Plone已经运行,控制器的View Plone按钮可用。

n         HTTP Manage:指定管理员访问Plone的端口,默认是8080。该端口可用来访问Zope管理接口。如果端口设定了并且Plone已经运行,控制器的Manage Plone按钮可用。

n         FTP:指定通过FTP访问Plone的端口,默认是21

n         WebDAV:指定通过WebDAV访问Plone的端口,默认是8081

Advanced

Advanced窗口提供了一些高级选项。如果不确定这些条目的意义,请保持默认值不要修改。其中最关心的是Service Daemon选项,这个选项可指定Plone的工作方式,大部分与Windows服务的使用有关。

如果运行Windows NT2000xp,可以以服务的形式运行PloneWindows nt/2000)选项。这会在后台运行Plone,没有可见的图标,Plone可作为一个服务来访问。作为服务,Restart(重起)按钮出现在ZMI,有权限的用户可通过web重新启动Plone。以服务的方式运行的另一个优点是可从管理控制台(在Windows控制面板)来启动/停止Plone,或者用命令行net start plone启动,net stop plone停止。

如果在Windows 9598ME上运行,必须选择Windows 95/98选项。在系统进程条里有一个Plone进程图标。还可以从控制器控制Plone或从系统tray中。Windows NT2000XP也可以使用这个选项。

该选项在安装时自动选择。

手动运行Zope

如果用控制器运行Plone有问题,可以从命令行启动Plone。在Zope文档中有更详细的信息。Plone控制器中调用的命令是:

c:/Program Files/Plone/Python/python.exe

    c:/Program Files/Plone/Zope/z2.py

           -X -w80 -w8080 -f21

    INSTANCE_HOME=c:/Program Files/Plone/Data

    HTTP_MANAGE=8080

n         分成了几行是为了方便阅读,这个命令都在一行

n         假设Plone安装在c:/Program File/Plone中。

Windows Installer内容

除了Plone以外,Windows安装中还包括以下组件:

n         CMF 1.3.1

n         Plone需要CMF,最新版本在 cmf.zope.org

n         Zope 2.6.1

n         最新版本的Zope,可在 zope.org 找到。

n         Python 2.1.3

n         Zope 2.6.0需要Python 2.1.3  . Python 可在http://www.python.org/ 找到。

n         Python Win32 Extensions

n         The Win32 extensions Mark Hammond 编写,提供了访问Windows API和函数的功能。 Win32 extensions 可在 Starship 找到。

n         PIL 1.1.3

n         The Python Imaging Library 使用户可从python操作和修改图像。PIL 可在 pythonware.com 找到,CMFPhoto 使用PIL来重新调节图像。

n         ReportLab 1.15

n         ReportLab 提供了 PDF接口。使用户从python创建 PDF ReportLab 可在 reportlab.com 找到。

n         Zope Controller 1.0

n         The Zope Controller Windows GUI 应用提供了启动、停止、配置Zope的方法。 Plone版本的Controller来自于 Zope Controller

n         CMF Collector 0.9b

n         The CMF Collector Plone的错误跟踪系统。CMF Collector Zope Corp. 开发可在 cvs.zope.org 找到。

n         CMF Wiki 0.1

n         The CMF Wiki 0.1 是为了Plone设计的 Wiki system 一个实现。由Zope Corp. 开发,可在 cvs.zope.org 找到。

n         CMF Quick Installer

n         The CMF Quick Installer 可让用户在ZMI中通过选择适当的产品容易的快速安装新Zope产品。The Installler 可在 SourceForge Collective project找到。

n         CMF Photo

n         CMF Photo 可让用户通过Plone浏览图片并动态调整图片大小。CMF Photo可在  SourceForge Collective project找到。

n         CMF Forum

n         CMF Forum 可让用户制作公告栏来添加和编辑评注。CMF Forum 可在 SourceForge Collective project" 找到。

n         External Editor 0.6 (Client and Server app)

n         External Editor是在本地编辑Plone对象的程序。可在"zope.org":找到:http://www.zope.org/Members/Caseman/ExternalEditor

n         Zope Book 2.5

n         Zope Book 的源在Zope.org HTML 版本的帮助在
http://www.orgmf.com.ar/condor/zopestuff.html

n         Localizer

n         Localizer 可将Plone翻译成不同的语言。

n         Translation Service and Translations

n         Translation Service 实现Zope 页面模板和Plone的翻译,这里提供了PloneLocalizer的集成。 The Translation Service 可在
http://www.zope.org/Members/efge/TranslationService
找到。

n         由多个Plone的翻译计划,在SourceForge Plone i18n project 维护,installer安装了所有能够安装的翻译文件,尽管有些翻译还没有完成。

安装的数据库带有一个Plone实例(包括CMF CollectorCMF Wiki),访问规则,一个Site Root和外部编辑器。如果在目录下已经存在一个数据库,则不会安装。

Mac OSX上安装

Mac OS X installer自动在Mac OS X上完成Plone的安装。Mac OS X 10.2.3及以上版本已经过测试。建议用户有计算机的管理员权限。如果已经安装了ZopePython,可单独安装原码以节省硬盘空间。安装包括额外的软件包和选项、预装载的数据库和其他一些东西等。

Mac OS X上的Plone installer可从plone.org网站下载。下载完成后,可双击解压档案,然后双击解压后的installer包开始安装,可以看到如下的屏幕界面:

输入用户的Mac OS X账号密码来授权安装。账号必须有管理员权限。如果账号没有管理员权限,注销并以有管理员权限的用户登录,然后重新启动安装程序。(可能需要将安装软件包放在/User/Shared目录下以便让其他用户可访问到)安装授权通过后,可以看到如下屏幕界面:

安装要完成几个通用步骤,随着界面下部的ContinueGo Back按钮,没有必要讨论每个步骤,大部分都是说明文字。当提示选择Plone的安装卷位置时,用户必须选择Mac OS X所安装的分区。

安装需要大约3分钟,依赖于计算机的速度。安装完成后,默认Plone不会启动。/Application/Plone下的ReadMe.rtf文件中有大量的关于运行和管理Plone的有用信息,包括如何启动Plone,为用户方便,启动的命令如下:

sudo /Library/StartupItems/Plone/Plone start

Mac OS X Installer安装的内容

除了Plone以外,installer还安装了下面的组件:

n         CMF 1.3.1

n         Plone需要CMF,最新版本在 cmf.zope.org

n         Zope 2.6.1

n         最新版本的Zope,可在 zope.org 找到。

n         Python 2.1.3

n         Zope 2.6.0需要Python 2.1.3  . Python 可在http://www.python.org/ 找到。

n         PIL 1.1.3

n         The Python Imaging Library 使用户可从python操作和修改图像。PIL 可在 pythonware.com 找到,CMFPhoto 使用PIL来重新调节图像。

n         ReportLab 1.15

n         ReportLab 提供了 PDF接口。使用户从python创建 PDF ReportLab 可在 reportlab.com 找到。

n         CMF Collector 0.9b

n         The CMF Collector Plone的错误跟踪系统。CMF Collector Zope Corp. 开发可在 cvs.zope.org 找到。

n         CMF Wiki 0.1

n         The CMF Wiki 0.1 是为了Plone设计的 Wiki system 一个实现。由Zope Corp. 开发,可在 cvs.zope.org 找到。

n         CMF Quick Installer

n         The CMF Quick Installer 可让用户在ZMI中通过选择适当的产品容易的快速安装新Zope产品。The Installler 可在 SourceForge Collective project" 找到。

n         CMF Photo

n         CMF Photo 可让用户通过Plone浏览图片并动态调整图片大小。CMF Photo可在  SourceForge Collective project" 找到。

n         CMF Forum

n         CMF Forum 可让用户制作公告栏来添加和编辑评注。CMF Forum 可在 SourceForge Collective project" 找到。

n         External Editor 0.6 (Client and Server app)

n         External Editor是在本地编辑Plone对象的程序。可在"zope.org":找到:http://www.zope.org/Members/Caseman/ExternalEditor

n         Zope Book 2.5

n         Zope Book 的源在Zope.org HTML 版本的帮助在
http://www.orgmf.com.ar/condor/zopestuff.html

n         Localizer

n         Localizer 可将Plone翻译成不同的语言。

n         Translation Service and Translations

n         Translation Service 实现Zope 页面模板和Plone的翻译,这里提供了PloneLocalizer的集成。 The Translation Service 可在
http://www.zope.org/Members/efge/TranslationService
找到。

n         由多个Plone的翻译计划,在SourceForge Plone i18n project 维护,installer安装了所有能够安装的翻译文件,尽管有些翻译还没有完成。

安装的数据库带有一个Plone实例(包括CMF CollectorCMF Wiki),访问规则,一个Site Root和外部编辑器。如果在目录下已经存在一个数据库,则不会安装。

 

Linux上安装

Debian

PloneDebian的标准软件包(测试中,不稳定),因此Debian用户可使用命令

apt-get install plone

非常简单的安装Plone

Red Hat/Mandrake/Suse

RedHat,MandrakeSuseRPM包。最新的软件包可从Sourceforge下载。注意软件包之间的依赖关系,如果使用其他版本的发布可能会导致一些问题。

从源代码安装

如果用户熟悉从源代码安装产品,这可能是用户最渴望的方式。当然安装要求用户熟悉tar等工具。

安装前需要

Zope 2.6.1或以上版本  zope.org

CMF 1.3.2或以上版本  cmf.zope.org

取得最新版本的Plone

plone.org可找到Plone源码的tar包。要解压tar包(或任何其他下载的版本),使用下面的命令:

#gunzip CMFPlone1.0.tar.gz

#tar –xvf CMFPlone1.0.tar

当前版本的Plone tar 包包括几个与Plone分离的产品:DCWorkflowFormulator。可从Sourceforge CVS下载,使用以下命令:

(在使用cvs 登录命令时会提示要输入密码,只需回车)

cvs -d:pserver:anonymous@cvs.plone.sourceforge.net:/cvsroot/plone login

cvs -d:pserver:anonymous@cvs.plone.sourceforge.net:/cvsroot/plone co -r Plone-1_0 CMFPlone

cvs -d:pserver:anonymous@cvs.formulator.sourceforge.net:/cvsroot/formulator co Formulator

 

cvs -d:pserver:anonymous@cvs.zope.org:/cvs-repository login

cvs -d:pserver:anonymous@cvs.zope.org:/cvs-repository checkout Products/DCWorkflow

安装

l         安装Zope,按照INSTALL.txt中的说明完成

l         安装CMF,按照INSTALL.txt中的说明完成

l         CMFPloneActivePakDCWorkflowFormulator目录拷贝到Plone实例的Products目录下。可从CMFPlone目录中的INSTALL.txt中找到更多信息。

l         重新启动Zope,如何启动取决于Zope安装的方法和操作系统。

l         Zope管理接口(在Zope站点URL后加上/manage),可在安装产品的列表中找到Plone Site。这表示Plone安装成功,参考“添加一个Plone Site,了解更多信息”。

添加一个PloneSite

假设已经用上述方式之一成功安装了Plone。如果使用WindowsMac OSX installer安装,已经创建了一个Plone Site称为Plone,就无需读这一小节,除非需要在Zope中安装另外一个Plone Site

l         访问Zope管理接口,通过在Zope站点URL后加上/manage来访问。

l         从下拉列表中选择Plone Site,如图:

l         随后的表单提示输入一些Plone 站点的信息:

n         Id (必须):Plone站点的id,简短的名字,包含有限的字符组(建议只包括字母),将是Plone站点的URL

n         Title(标题):Plone站点的名字,将出现在所有页面。

n         Membership source(成员来源):如果不确定是何意义,保持默认值“Create a new…”可选择在Plone站点下添加一个用户目录或使用上一级目录。

n         Description(描述):站点的描述

n         Site type(站点类型):可定义不同类型的站点,例如定制了皮肤的站点。这里假设使用默认值。

l         按“Add Plone Site”后,就创建了一个新站点,可能需要几秒钟时间装载所有信息。

恭喜,现在已经安装了Plone

升级已经安装的Plone系统

注:这些安装说明应适用于所有版本和未来版本的Plone。当然可能需要一些额外的步骤,请参考发布版本的说明。

如果已经存在一个Plone安装版本,希望进行版本升级,就需要添加一个迁移工具。迁移工具需要了解访问Zope管理接口。迁移之前,请进行Plone站点的完整备份,以防万一。

安装软件

l         停止Plone

l         备份Plone安装,包括数据库(参考第9章)。

l         下载并安装新版本的Plone。安装完成后就已经将文件系统中的Plone替换为新版本。通常直接安装在旧版本的Plone上就足够了。

l         重新启动Plone.

l         接着进行下面的迁移说明

1.0 Alpha版本以前的版本迁移

迁移过程中不包括此内容,建议使用Plone新代码添加一个新的Plone实例,然后将内容对象移到新站点上。只须使用Zope管理接口中的copyPaste工具。

1.0 Beta3以前(alpha以上)迁移

需要在Zope管理接口中添加迁移工具。从增加对象下拉列表中选择Plone Tool,在下面的页面中选择Plone Migration Tool,点击“Add”。在Plone实例中添加了一个新对象,称为migration_tool。选择该对象,它将显示用户Plone实例的一些信息和文件系统中的代码。

当然由于该工具最近才加入进来,还不能识别用于有什么Plone实例,将显示beta 1.3的当前实例和文件系统实例。选择用户认为正确的版本,而后选择强制迁移。

1.0 Beta3以后的版本迁移

Zope管理接口中,找到migration_tool工具。它将提示当前Plone的版本和文件系统中的版本。要迁移现有的Plone,只要点击migratePlone将执行所有需要的升级过程。

已知的迁移问题

CMFTypes

迁移过程中定制的类型会丢失,迁移会在任何依赖这些类型的内容的地方挂起。删除这些内容后迁移会顺利完成。


第三章 Plone使用(完)

使用Plone

这一章假定用户已经安装了Plone或可以访问一个Plone站点,如果还没有安装,参考第二章进行安装。

Plone使用当前的浏览器标准和技术,所以建议使用最新版本的浏览器。这一章介绍Plone的默认设置,可能与用户的站点的显示不完全一致,这取决于用户站点进行了怎样的定制。

加入站点

加入Plone站点,使用户可以作为成员在站点中加入内容,如图像、文档等。用户的确切权限取决于站点的配置。

要加入站点,在站点首页右上侧选择join链接。

这就打开了注册表单,让用户填写。这是遇到的第一个表单,需要注意一些事情:标签边上有红色方框的输入区域表示必须填写的部分,当选定一个输入区域后,会在左侧弹出帮助文本。可以通过单击表单区域操作表单。

在注册表单有几个区域:

²        Full Name(全名):用户的名字

²        Username(用户名):要使用的用户名,大部分人选择中间没有空格的字母数字组合,如bobjane97

²        E-mail(电子邮件):需要有效的电子邮件地址,如果丢失了密码,可以通过邮件发送给用户,以后可在用户设置处修改电子邮件地址.

²        Password(密码)和Confirm Password(确认密码):用户密码,必须超过5个字符,可包含字母,数字和下划线。密码是大小写敏感的。

²        Mail Password?(邮件发送密码):如果需要将密码通过邮件发送给用户,选中检查框。

填写完表单后,单击register来提交信息。然后单击log in立刻访问站点。

登陆

如果已经有了用户名和密码,可以在页面左手边登陆界面中输入用户名和密码,然后单击log in来登陆站点。要登陆Plone站点必须允许Cookies

忘记密码

如果忘记密码,可通过注册时设置的电子邮件地址发送给用户。可以通过单击站点左边的Forgot your password? 链接来请求将用户的密码发送给用户。如果在注册时没有登记有效的电子邮件地址,就只能联系站点管理员。

退出登陆

一旦登陆,在站点页面的右上角会有链接log out。使用完成后最好退出登陆。

成员文件夹

每个成员有一个文件夹,用来创建和存储内容。它位于成员文件夹,包括一个默认主页index_html。要浏览用户自己的成员文件夹,单击站点右上侧personal bar中的my folder链接。

设定用户参数

在页面右上侧有my preference链接,可打开Personlize form(个性化表单)。这个表单可让用户设定一些与站点交互的参数。

²        E-Mail(电子邮件):与成员关联的电子邮件地址,在Plone站点中有多个地方会用到。更重要的是,如果用户忘记了密码,这是系统要发送的地址。

²        Content editor(内容编辑器):要编辑复杂内容时,可能需要编辑器的帮助,如果站点管理员设置了一个可用的编辑器,可以在这里进行选择,然后就可以在点击edit标签时使用,默认设置是没有编辑器的的。

²        Listed status(列表状态):该特性指定用户资料是否显示在成员标签里,或是否出现在成员搜索列表里。默认设置是:Listed

²        Form Help(表单帮助):每个表单项有关联的弹出框提供关联的帮助。这对访问系统的新用户非常有用,在用户填写表单时会提示表单项的使用方法。不需要帮助的用户可通过选择no来关闭帮助。默认设置是Yes

²        Display Names(显示名字):对象有一个Name特性,用来作为内容对象的内部表示。该名字也显示在对象的web地址(URL)上。默认的名字类似:News_Item.2002-11-16.4102,用户可通过修改Name的值来简化名字,如november_news。默认设置是Yes

注:当修改对象的名字值时,所有与老名字相关的内容都无效,会导致页面找不到的错误。建议在提交对象审阅或从其他地方链接该对象后最好不要修改名字。

²        Look(外观):一些用户想修改Plone的外观,系统提供了多个looks(外观)或themes(主题)。选择一个想要的外观,默认设置:Plone Default

²        Portrait(肖像):看到其他成员的肖像对大型组织和社区站点非常有用。肖像选项可让用户上载75x100的图像(如果上载的图像不符合该尺寸,会自动调整尺寸)

完成需要的修改后,单击save提交保存。

添加和编辑内容

作为站点成员,在成员部分有一个文件夹用来存储用户内容。这里并不详细介绍添加和编辑所有不同类型的内容,只详细介绍添加一个特殊的内容类型,Document(文档)。各种类型的内容的添加和编辑的方式都很类似,大部分都是重复这些过程。

文档是什么?

文档是一页内容,通常是自包含的文本段落。文档可用多种格式书写:纯文本、HTML或结构化文本。Plone站点的缺省主页就是文档的一个例子。

添加文档

要添加一个文档,需要转到目录视图,链接在页面的左侧。该模式显示文件夹中的对象列表,可对他们进行编辑。如果没有看到Switch to Contents View(转到目录),则用户没有添加和编辑内容的权限。

一旦进入目录视图,可在右上侧add new item按钮旁边看到一个下拉框,这里列出了在该文件夹中可添加的内容类型。从列表中选择Document,点击add new item。文档添加完成后,立刻转到文档的编辑页面。

编辑文档

使用编辑表单,文档可直接在web浏览器中进行编辑。需要注意的是页面上边高亮显示的编辑标签和页面上部的消息,如下图所示:

文档有四个编辑区域:

²        Name(名字):该标识会成为文档web地址的一部分。应该简短,具有描述性,不要包含下划线或大小写字母混用。如audit-report-2003,如果没有提供,Plone会自动创建一个名字。

²        Title(标题):该项会出现在页面顶部,搜索接口,浏览器标题等位置,该项是必须的。

²        Description(描述):该项是文档的描述,通常不超过20个字,用来介绍文档,给文档的其他部分做个总结。

²        Body Text(主体文本):该项包括文档的主体。内容的格式用下面的单选按钮来设定。有:

n         Structured Text(结构化文本)——默认设置,结构化文本是将纯文本转化为HTML的特殊格式,无需用户了解复杂的HTML。(参考附录)

n         HTML——用户可输入任何HTML语句。

n         Plain text(纯文本)——普通文本,不带标记。

如果在计算机上已经有了文档文件,可上载文档文件,不必在浏览器body text项中输入,使用页面底部Upload(上载)按钮,上载的文件内容将替代body 项中的任何内容。

文档编辑完成后,点击save(保存)按钮,会返回到查看标签,在这里可以看到文档的显示效果,要继续进行编辑,点击edit标签。

如果没有在edit表单中没有输入正确的信息,在保存文档时会返回到编辑页面,在页面顶部高亮提示错误信息。这时用户的修改没有被接受,必须修改错误后再点击save按钮。

为文档设置特性

任何对象都有一些特性。这些特性也称为metadata,提供了如关键字、版权和投稿者的信息。特性表单有多个区域对所有类型的对象都是通用的。

²        Allow discussion(允许讨论):该特性让有权限的用户进行讨论。如果保持默认设置,就使用站点最广泛的策略。

²        Keywords(关键字):关键字是为对象设置metadata的一种方式。使用Control+Click从列表中选择多个关键字。

²        Effective Date and Expiration Date(生效日期和过期日期):生效日期是对象可用的第一天,过期日期是最后一天。搜索和导航里只有该范围内的对象。保持该两项为空使对象永久可用。

²        Format(格式):对象的MIME类型。如果不知道,不要修改。

²        Language(语言):该元素书写的语言

²        Copyright(版权):对象的版权信息

²        Contributors(撰稿者):提供该对象的人的名字,每个人的名字都单独一行。

发布文档

文档创建后处于visible(可见)状态,表示用户可访问它,但不会出现在站点导航树里。可见文档可通过搜索特性或直接使用URL访问。

如果对文档已经满意,可以提交以进行发布。选择state(状态)标签,该页访问发布流程。

Effective Date(生效日期):让用户指定内容生效的起始日期,只有到了该日起,内容才会发布,如果没有指定,该项不会有作用,文档就会发布。

Expiration Date(过期日期):让用户指定内容过期的日期,过了这个日期,文档就不会发布了,如果没有指定,该项不会有作用,文档就会发布。

Comments(评论):为评论过程提供一个评论接口。评论可在发布过程中由审阅内容的人阅读。同样如果审阅者拒绝了内容,可以在这里写评论,写出拒绝文档的原因。

Change state(修改状态):这些是文档可改变成的状态,发布和审阅内容在第4章详细介绍,在要发布内容时,选择Submit(提交),点击save(保存)。

现在文档就处于pending(未决)状态。审阅者可审阅文档,决定是否发布,即编辑并发布或拒绝。

添加和编辑其他形式的内容

Plone站点默认有多种对象类型,添加和编辑这些类型的对象的过程与上面描述的文档的处理类似。

Image(图像)

图像是内容的图形部分。该内容类型通常以一个扩展名结束:gifjpgpngtifpict。,如果图像类型可在用户web浏览器中可视,无需下载到用户计算机上,图像就可在Plone CMS系统中显示。

添加一个图像后,对象的id改变为图像文件。因此如果上载一个文件名为photo.gif的图像,在Plone中可用photo.gif来访问它。在添加后上载一个新图像时,可使用browse(浏览)按钮选择文件系统中的图像文件。

注意Macintosh .pict文件通常在微软的浏览器平台上不可视。

File(文件)

文件是一个很随意的对象,可从文件系统上载。可以是任何条目,如纯文本文件,微软word文档,Excel表格,PowerPoint幻灯片,Acrobat PDF文件等等。在添加文件时,对象的id改变为文件的文件名。如添加文件book.pdf,可在Plone中使用book.pdf访问它。

Link(链接)

链接是用户共享URL的主要方式。这些URL可以是internet资源或本地资源。连接可像其他内容对象一样包含metadata。注意要链接internet资源时需要以匹配的协议作为开始(如http://),否则链接可能是错误的。

Topic(主题)

主题可让用户通过查询中心信息库创建资源的集合。集合在criteria(准则)标签里定义。特定准则匹配系统中的所有内容对象,可以查询系统的各个不同部分,通过物理位置、创建时间、审阅状态和许多其他方面。主题只链接其他资源,与文件夹不同,链接里面不保存实际资源。

默认只有管理员角色的用户允许创建主题。

Folder(文件夹)

容器是组织内容的最简单和最强大的架构。文件夹是收藏各种内容对象的容器,如文件、文档和其他内容类型。默认所有内容类型都可以添加到文件夹中。

News Item(新闻条目)

新闻条目在web站点用很常用。发布的新闻条目在News标签和新闻部分中按时间逆序显示。

Discussing content(讨论内容)

Plone中任何内容都可讨论。内容的所有者(或者说是创建内容的人)通过点击对象的Properties(特性)标签打开讨论特性,选中Allow The default radio按钮,是站点管理员设定的对象策略。

如果可讨论,在察看内容时会显示讨论,用户也可参与讨论。

内容搜索

有两种方式搜索Plone中的内容。在Plone站点的顶部有一个搜索框,提供简单的关键字查询方式。可使用高级查询功能缩小搜索结果。这可通过点击顶部的search标签访问。

在高级搜索表单,能通过内容的多个特性搜索,如标题、关键字、描述、审阅状态、创建时间、内容类型甚至作者。

 

在这一章里,讲述了添加和发布内容的基础内容,搜索和改变Plone实例以适合用户的使用。尽管每个站点都不一样,每个都有这些基本内容。


第四章 Plone工作流(完)

工作流系统

工作流是用来管理网站对象的过程。举个公司文档发布的例子:一个雇员写了一个文档并提交给编辑审看,然后再发布到网站上。审看的过程就称为工作流,网站管理员用来保证发布到网站上的内容的正确性。Plone有非常强大和灵活的默认的工作流系统,建立在Object States(对象状态)和User Roles(用户角色)的基础上。

 

Object States(对象状态)

对象状态决定了该对象对各种不同用户是否可用,以及该对象可变换到的其他状态。Plone的默认工作流包括四个状态:可见(visible),未决(pending),发布(published),私有(private)。站点管理员和开发者可以创建定制状态,这些会在第五章中详细解释。

u       默认情况下,对象创建成visible状态。所有的用户可通过搜索功能找到visible对象,并可通过访问对象的url直接访问。Visible对象不在导航树中显示。私有目录中的Visible对象依然对所有用户可见,可通过搜索功能找到。Visible对象可由所有者和站点管理员编辑。

u       未决(pending)对象是由站点成员提交的要发布的对象。从最终用户的角度看,他们与visible状态没有什么不同。这两个状态的不同之处在于pending对象标记用来审阅,站点审阅者可发布或拒绝对象。Pending对象只能由管理员编辑。

u       发布(Published)元素对所有站点浏览者可见。他们可出现在搜索结果和导航树中。当一个News元素被发布后,它会出现在News标签中,也会出现在News中(第五章)。发布后的元素只能由管理员编辑,但可以由用户收回进行编辑。(收回使对象变回到visible状态)

u       private状态的对象只能由拥有它的用户和有对象所在目录管理权限的用户可见和编辑。他们不会出现在搜索结果中或其他用户的导航树中。管理员可编辑private项目。

注意:尽管大多数对象都有自己的状态,但有些继承父对象的状态。论坛就是这种情况的一个例子,可见或发布状态文件夹中的论坛所有用户都可以通过搜索找到。私有状态下的目录只对有访问权限的用户可用。

用户角色

Plone用户角色定义了不同用户可见的内容和可做的事情。采用这种方式,Plone为操作的每个方面建立的安全性。Plone默认安装定义的角色包括:匿名、成员、所有者、审阅者和管理员。

u       任何没有登陆的访问站点的人处于匿名角色。在公开站点,匿名用户可通过直接访问url或通过搜索来浏览发布、未决和可视的内容。但只有发布的内容在导航树中可见。如果设置站点为私有,匿名用户什么也看不到。

u       成员是登陆到站点的用户。成员可在他们的目录中添加来创建内容,然后提交给站点审阅者以发布。在公开站点,成员和匿名用户可看到的内容一样,在私有站点,成员可以访问发布、未决和可视的内容。成员还有自己的参数设置。

u       审阅者可发布或拒绝由成员提交的内容。当审阅者登陆后,如果有需要审阅的信息,在个人导航栏会有一个“未决”消息。在页面右侧一列也会出现一个审阅列表。审阅者与成员可访问的内容一样。

u       成员时所由他创建的内容的所有者。成员可编辑内容,提交或收回内容,将内容改为私有。不建议将所有者指派给其他用户。

u       站点管理者可见所有状态的内容(可视,未决,发布和私有)。除了成员和审阅者的所有能力,管理者可以添加,编辑,删除和移动内容。管理员还可以添加,编辑,删除用户并分派角色。

Plone继承了Zope的用户角色模型。参考Zope Book

转换——改变对象状态

所有者和管理员可改变他们控制的对象的状态。可用的状态由预定义的转换来控制。例如:站点成员可提交对象以审阅或使对象变成私有,站点审阅者可发布已提交的元素或拒绝它。站点管理员可定制这部分工作流系统。(参考第五章)。

要改变对象的状态,在目录视图的查看标签,选中要改变状态的对象旁的复选框,点击页面底部改变状态按钮。卷到发布过程页的底部,选择需要的状态,点击提交。

也可在页面视图下改变状态,只需点击状态标签,卷到页面底部,选择需要的状态点击提交。

本地角色

站点管理员可赋予特定用户在站点的一些部分的附加权限。这是通过给目录指派本地角色完成的。管理员和所有者有权限指派本地角色。

要指派一个本地角色,转到一个文件夹的目录视图,在目录标签点击本地角色。搜索要指派的角色的用户名,选定用户名上面的复选框。从下拉列表中选择要指派的角色,点击“assign local roles to selected users”(指派本地角色给选定用户)。

使用同样的接口可删除本地角色。

发布对象

对象所有者可改变和编辑可视状态下的对象。对象所有者完成对象的编辑后,可点击状态标签发布对象,这样打开了一个发布表单:

该表单提供了以下选项:

状态——对象的当前状态

生效日期和过期日期——生效日期是对象可用的第一天,而过期日期是最后一天。搜索和导航只在这个日期范围内显示该对象。保持空白将使对象永久可用。

评注——这里可添加任何评注或你要求改变状态的理由。这些评注保留在对象改变日志中。

改变状态——用户可以将对象改变成的状态。这里可用的状态与用户角色有关。成员可以提交对象或将对象改变为私有。一旦提交,有审阅权限的用户可使用该对象,可发布或撤销该对象。

审阅对象

如果有审阅权限,当登陆到Plone web站点后,会提示是否有对象需要审阅,展示在个人工具条,如下图所示:

点击该链接,得到一个需要审阅的对象列表,然后选择要审阅的每个对象。点击发布标签,会展示出一个类似前面图示的表单。在这里,基本上有两个选择——赞成并发布对象(发布选项)或拒绝掉(拒绝选项)。如果拒绝掉一个对象,可能需要给用户提供一个评注,解释拒绝的原因。

对象发布后的编辑

管理员可编辑任何状态的对象。成员在对象发布后不能再编辑对象。必须首先将发布的对象收回变成可视状态。要完成收回,点击对象的发布标签,点击收回(retract)。然后就可以编辑对象,并重新提交。这就保证了重新编辑的对象通过审阅过程进行维护。


第五章 配置Plone

这一章介绍通过web接口对Plone进行的一些配置,而无需编写任何代码。

Zope管理接口

Plone是建立在Zope和内容管理框架(CMF)基础上的。Zope有一个内置的web管理接口(ZMIZope Management Interface)。大多数Plone的日常操作,如添加和编辑内容无需访问这个web管理接口。但要使用Plone的一些高级特性,就需要访问ZMI

在站点URL的后面加上/manage就可以访问ZMI,如http://localhost/manage。如果使用的是MacWindows平台,可以通过端口80访问站点,通过端口8080访问ZMI。如通过http://localhost访问Plone,通过http://localhost:8080/manage访问ZMI

页面左侧的帧是导航栏,页面右侧用来管理对象。更多的信息请参考Zope Book

说明:要登陆ZMI,需要通过HTTP 基本授权。但是没有方法退出登陆。这表示如果不关闭浏览器,你无法退出Plone站点。这不是Plonebug,而是HTTP基本授权API的缺陷。为了测试,最简单的办法就是打开两个浏览器,分别登陆Plone站点和管理接口。

管理接口中Plone站点的布局

Plone站点被分成一系列对象,无论是内容还是工具。通过web 浏览器访问Plone时,无法看到处理了大部分Plone工作的工具。并不是所有的工具都是Plone独一无二的,大部分直接来自于CMF,更多的信息请参考CMF相关文档。

动作

Plone中,有些东西{工具}会在站点的不同部分,在不同的时间被不同的人执行。这些东西{工具}包括搜索、浏览目录、登陆等等,这些东西称作动作(Actions)。Plone将这些表示成tabslinks和其他元素。这些是提供站点导航元素的一个高度可配置的方式。动作可通过Zope管理接口进行配置,包含在几个位置,如portal_actions。包含动作的工具称为工具提供者。

动作概要

每个动作有以下特性,都可以通过ZMI配置:

l         Name(名称)——动作的名称,这个名称用在用户接口中,如动作被用作tab,就是tab显示的文本。

l         Id ——动作的唯一的id(针对当前的工具提供者)

l         Actions(动作)——要执行的动作,例如当动作被用作tab时,该动作就被用作链接。这个域是一个tal表达式,参考ZPT文档。

l         Condition(条件)——使用动作的一个条件。如当动作被用作tab时,如果符合条件tab就会显示。这个域是一个tal表达式,参考ZPT文档。

l         Permission(权限)——要使用该动作,用户所需要拥有的权限,要使用该动作,必须符合该权限。

l         Category(分类)——用来给动作分类,在Plone中,用来区分动作,以在用户接口的不同部分使用。有以下的一些类别:

n         Folder(目录)——在该类别中的动作出现在目录中

n         object(对象)——在该类别中的动作出现在对象中

n         portal_tabs(门户标签)——这些动作出现在Plone站点的最上部分,默认是WelcomMembersNewsSearch等,在这个类别中的动作通常与整个站点相关,而不仅仅针对特定内容。

n         object_tabs(对象标签)——这些动作出现在页面的中部,内容的顶部。这些动作通常与内容相关,在大多数情况下,并不显示,除非用户有权利编辑这些内容。

n         folder_buttons(目录按钮)——出现在目录内容页的按钮,与在目录中拷贝或移动文件相关,如CopyPaste

n         user(用户)——与用户相关的动作,如Log inJoin

l         Visible(可视性)——分类是否活动。由于动作通常与可视的元素有关,所以使用了可视性这个名词。

Plone中,ZMI接口中每个类别中的动作的顺序决定了在站点表示时的位置。例如WelcomeZMI接口中最上面的的动作,它出现在Plone站点的最上,最左的位置。选定动作,并使用Move upMove down按钮可将动作从列表中上下移动。

动作提供者

动作提供者有些散乱,有时候不容易找到动作出现在什么地方。要得到Plone站点中当前的动作提供者,在ZMI中,选到portal_actions并选择Action Provider标签。这里列出了会包含有动作的所有对象。

门户动作(portal_actions

门户动作中包括所有其他动作提供者没有包括的动作。这里最常用的动作就是portal_tabs类里的动作。

例如:在Plone中加入一个documentation标签

一个通常的任务就是在门户站点的顶部加一个标签,指向一个内容目录。例如在Plone.org中,所有的文档都存放在一个名称为documentation的目录中。为了让用户更方便的访问documentation,需要添加一个动作。

n         Plone接口中

n         Plone 站点的根下面创建一个目录,名称为documentation

n         发布这个目录(如果需要的话)

n         ZMI

n         指向portal_actions

n         到页面的底部的Add部分,按下面的内容填写:

u       Namedocumentation

u       Iddocumentation

u       Action:string:$portal_url/documentation

u       Condition:空白

u       PermissionView

u       Categoryportal_tabs

u       Visble:选中

n         点击Add

这样就添加了一个可以访问documentation的标签。

门户的成员工具(portal_membership

包括一个用户成员的相关动作。通常都在user类别里。这些动作显现在标准Plone外观的门户标签的下面。这些动作的大部分都与用户的登陆和退出的权限相关。

门户登记(portal_registration

包括用户登记的动作。在默认Plone中,只有一个动作join

门户讨论(portal_discussion

包括讨论相关的动作,在默认Plone中只有一个动作reply

门户取消(portal_undo

包括取消内容的动作,如undoquick undo。提供了用户取消内容,回到前一版本内容的接口。

门户发表(portal_syndication

包括内容发布的动作。要发布内容,必须使该动作Visible(可见),然后在目录中会出现一个Syndication标签,让用户可以选择发布内容。

门户工作流(portal_workflow

这里的动作包含在工作流中,并且是工作流中的关键部分。工作流在上一章作了简要介绍。

门户设置(portal_properties

包括修改门户的动作,如Plone Setup,可以用来修改一些plone的关键参数。

槽位置(Slots

一个槽位置是web页的一小部分,包括一些自包含的信息。在Plone中,在页面的左右两列包含这些槽位置,如日历,导航树,登陆框等等。这些槽位置可表现动态或静态信息,可通过ZMI非常容易得进行配置

要配置槽位置,需要访问ZMI选择需要编辑的对象的Properties(特性)标签。在Plone的例子中,选择Plone实例,而后选择Properties。这里列出了包括left_slotsright_slots的一系列特性:

left_slots与页面左边一列的槽位置有关,right_slots与页面右边一列的槽位置有关。按照顺序进行显示。槽位置特性可在这里编辑,会影响整个站点。或者可以编辑每个目录的特性来影响该目录下的页面。如在标准Plone安装中,Members目录有一个不同的right_slots特性。

注意所有Plone中的槽位置都可以进行配置。下面介绍Plone中每个槽位置的详细信息。要显示出这些槽位置需要在槽中列出文件位置和路径表达式

About

文件名:plone_templates/ui_slots/about_slot.pt

路径表达式:here/about_slot/macros/aboutBox

这里显示当前对象的信息,如创建人,最后更新时间等等。

Calendar(日历)槽

文件名:plone_template/ui_slots/calendar_slot.pt

路径表达式:here/calendar_slot/macros/calendarBox

这里显示Plone日历,可在ZMI中使用portal_calendar工具配置,在日历中显示选中对象类型。

Events (事件)槽

文件名:plone_templates/ui_slots/event_slot.pt

路径表达式:here/events_slot/macros/eventsBox

显示将要发生事件的列表,即使在槽列表里中有这个元素,如果没有发布事件,它也不会显示。

Favorites(最喜欢)槽

文件名:plone_templates/ui_slots/favorite_slot.pt

路径表达式:here/favorites_slot/macros/favoritesBox

显示用户最喜爱的列表,用链接来组织。尽管在槽列表中有该元素,但除非用户有一些最喜爱的对象,才会显示。

Login(登陆)槽

文件名:plone_templates/ui_slots/login_slot.pt

路径表达式:here/login_slot/macros/loginBox

显示登陆槽,用来让用户登陆。如果用户已经登陆,即使在槽列表中有该项目,也不会显示。

Navigation(导航)槽

文件名:plone_templates/ui_slots/navigation_tree_slot.pt

路径表达式:here/navigation_tree_slot/macros/navigationBox

注:老版本的槽navigation_slot,不推荐

 

导航槽在当前位置显示简单的树状文件夹,提供了强大而简单的导航工具。导航槽可定制,通过ZMI接口中portal_properties/navtree_properties访问。

News(新闻)槽

文件名:plone_template/ui_slots/news_slot.pt

路径表达式:here/news_slot/macros/newsBox

显示最新新闻元素的列表,带有指向新闻的链接。只有发布了一些新闻,在槽列表中的新闻元素才会显示。

Related(相关)槽

文件名:plone_templates/ui_slots/related_slot.pt

路径表达式:here/related_slot/macros/relatedBox

显示相关元素的列表,由关键字决定。例如,在上面的图中,当前页有关键字Python,那么就列出了其他包括该关键字的页面。元素分为内部和外部资源。只有存在相关对象的时候,在槽列表中的该元素才会显示。

Review(审阅)槽

文件名:plone_templates/ui_slots/review_slot.pt

路径表达式:here/review_slot/macros/reviewBox

显示需要审阅的对象列表,只有用户有审阅权限并且有元素等待审阅的时候才会显示。需要审阅的元素数量也会在导航条中显示。

写自己的槽

使用路径表达式制作槽是一个非常强大的工具。允许用户将从任何对象中将几乎任何内容放入槽中。Plone只要找到表达式对应的结果并显示。例如,如果有一个投票产品,想在槽中显示,可用如下表达式:here/polls/funnylaughter/frontpage_poll_view (注:这只是个例子,这个路径表达式在标准Plone安装中不能工作)。路径表达式是ZopePlone的关键部分,参考。。。

如果只是想写一个定制槽,需要用正确的HTMLTAL类写一个页面模板,参考:。。。

导航和表单

Syndication(联合管理)

Syndication(联合管理)是通过RSS(真正简单的联合管理 丰富站点摘要)访问目录中内容的能力。RSS制作文件夹中所有对象的列表。这个摘要可通过许多不同的新闻阅读程序标题性的访问

要在ZMI中起用syndication(联合管理),到portal_syndication对象,这里有一个为文件夹的动作“Syndication”,默认是不可见的。设置Visible 复选框(check box),使动作可见。站点的Syndication(联合组织)也需要激活,点击properties(特性)标签,然后点击“enable syndication”。

Plone站点中的所有文件夹就都有了Syndication()标签。用户必须为每个需要syndication的文件夹激活syndication。到要激活syndication的文件夹,点击syndication标签,这里有一个简单的按钮用来激活syndication,点击就可激活。如果得到消息“Syndication not allowed(不允许)”,返回到portal_syndication对象,确认在特性标签中激活了syndication

在激活syndication后,由以下值可设置:

²        Update period(更新周期)   客户端检查RSS feed是否更新的周期

²        Update frequency(更新频率)

²        Update base()

²        Maximum Items(最大元素)    显示的最大元素

 

注:syndication不会递归设置到每个目录下面的子目录,只是设置到当前目录和发布的内容。


第六章 定制Plone(完)

这一章介绍如何修改Plone站点外观的各方面内容。解释了页面的元素,皮肤和槽的组织。

一些基本概念

皮肤

皮肤是内容的可视化包装。它也可能包含小部分直接与可视化表示相关的逻辑。安装完Plone,看到的是我们熟悉的默认的皮肤,可以在plone.org或其他站点见到。可以通过编写一个新的皮肤改变Plone的外观,尽管可能还保持着Plone的感觉,例如zopezen.orgzopera.org

但通过完全的定制,Plone可以有完全不同于Plone站点的外观。在 http://www.plone.org/about/sites 列出了一系列使用Plone却有着不同外观的站点。大多数站点可很容易的为用户提供不同的外观感觉,许多站点利用Plone内部接口的强大功能和灵活性,用户可非常容易的添加和编辑内容,同时提供完全不同的外在观感。

皮肤在Zope管理接口(ZMI)中的portal_skins工具中定义。在portal_skins中点击properties,这里列出了可在站点中使用的皮肤列表。例如,有一个皮肤称为“Plone Default”。在表单中可以看到皮肤的条目和旁边的一些值,这些值是层(layers)。

properties标签,用户可修改让展示的默认皮肤,以及是否允许用户更改皮肤。如果用户被允许改变皮肤,用户就可以在my preferences里进行修改。

层(Layers

每个皮肤都包括很多层。层是提供给用户的一组独立的模板和脚本。通过混合这些层就形成了皮肤。用户可改变层,从而方便的在皮肤中添加或删除组件。如皮肤“Plone Default”(通过ZMI->portal_skins->properties访问)有一系列层:customplone_3rdParty/CMFCollector等,这些就是构成这个皮肤的层。

关于层有以下两点非常重要:

²        层的顺序非常重要,对一个对象来说最上面的层首先被解释

²        每个层都是portal_skins->contents中的一个入口点,通常是文件系统路径视图或文件夹

修改logo,一个快速示例

看了上边内容,你可能已经迫不及待要试着修改些什么了。最经常问的一个问题就是“怎么改变页面左上角的Plone图标?”这非常简单。

²        ZMI中的portal_skins->plone_images

²        找到logo.jpg,并点击

²        点击Customize按钮

²        点击browse,选择一个新的图像文件,并按Upload按钮上载

就这么简单,回到Plone中,图标已经改变了。

修改logo,说明

在上面的例子中,讲述了如何改变主页的logo。以上修改可以生效是由于皮肤有一个重要特性,就是上面介绍过的层。层最重要的就是查找顺序,最上面的层(列表中的第一个)总是被第一个检查来寻找相应的项目。

因此来看皮肤Plone Default的层,第一个层是custom,这是portal_skins->custom文件夹,后面的列表中还有plone_images层,映射到了文件路径视图,这些文件可从Plone的安装目录中找到。当点击图像(portal_skins->plone_images)时,没有提供给任何编辑图像的选择,但是可以进行定制,如下图:

用户不能编辑这个文件,由于它保存在文件系统中。在下拉列表中给出了一个默认的文件夹custom,点击Customize按钮,就将图像拷贝到了ZODB数据库中的custom文件夹,并直接转到定制页面。可以注意到图像的路径、meta类型已经改变,现在就可以编辑图像了。

为什么这样就可以改变logo,这是由于在层的列表中,custom(定制)层在plone_images层的前面,由于这个图像已经被拷贝到custom目录,这个图像就首先被查到。所以当浏览器请求logo.jpg时,回搜索每一层,首先在custom中找到图像,就返回这个图像。

既然这样,那好现在在上面的第四步,上载了一个图像,这就改变了logo.jpg,当然这个图像就会首先从列表中被找到。

这就是Plone中皮肤和层的基本概念。通过修改层以及移动层中的每个元素,可以很简单的修改和定制站点,可以只修改一点,也可以完全的改变整个外观。

定制其他部分

在更进一步钻研站点定制和页面模板之前,首先要了解的是sytlesheets(样式表)。

Style Sheets(样式表)

大部分Plone的风格是由stylesheets(样式表)控制的,通过配置这些stylesheets(样式表)可以从根本上改变Plone。在portal_skins->plone_styles中有五个stylesheet(样式表):

²        ploneCustom.css:一个定制样式表,实际上是空的。需要首先定制这个样式表。

²        plone.css:主要的样式表,控制着大部分站点设置,如果可能的话首先改变ploneCustom.css

²        ploneNS4.css:为Netscape 4设置的样式表

²        plonePresentation.css:包括了为Operapresentation模式的代码

²        plonePrint.css:包括了为打印页设置的代码

还有一个元素,stylesheet_properties包含了上面stylesheets(样式表)中所有颜色,字体和大小的实际定义。定制这些特性是一种修改外观感觉的简便的方法。例如,如果定制了这个对象,就可以通过修改mainFont特性的值“65% Verdana, Helvetica, Arial, sans-serif”来修改主字体。

portal_skins->plone_styles中的其他文件夹中是Plone附带的一些皮肤,是不同站点很好的示例。

Images(图像)

所有图像(除了特定产品)都包含在plone_images中。

Plone contentPlone内容)

包括与内容相关的模板,这里都是页面模板,是Zope模板语言。大部分用来生成HTML,而且是Plone专用的。页面模板是非常强大优雅的模板语言。通过修改这些模板可改变内容的表现形式。

Plone templatesPlone模板)

这里包括站点最重要的部分,主要的模板,标准的页眉和页角等。

定制一个新站点的主要的窍门在于找到需要定制的部分,实际上这很容易。首先找到调用页面的URL,如果最后一个元素是login_formdocument_edit等,那么就在portal_skins目录中直接找到相关的对象。要找到实际的对象,到portal_skins->find,输入URL的最后一个元素。对复杂的元素,可能要检查portal_types工具来了解调用的什么动作。如果还没有找到,使用findgrep命令在文件系统中查找。

制作一个全新的皮肤

当然修改皮肤很好,但有时你会要制作一个新皮肤。

²        portal_skins添加一个文件夹,给文件夹命名如alpha

²        portal_skins->properties增加一个皮肤,只需添加名称和层的列表,只要输入alpha

对一个新皮肤,是否添加以前的PloneCMF元素取决于你的选择。如果要添加,只需在alpha层之后添加即可。这样就有了一个称为alpha的全新皮肤,主要从alpha中提取元素。

样例站点

一个站点的例子就是ZopeZen.org,所有ZopeZen皮肤的代码都可以从网上获得。还有三篇文章介绍了该皮肤的制作过程。虽然随着新版Plone的发布,文章的某些部分有些过时,但大部分内容会给你启示。

²        "Building ZopeZen, Part One":

http://www.zopezen.org/Members/zopista/News_Item.2002-09-30.2355

²        "Building ZopeZen, Part Two":

http://www.zopezen.org/Members/zopista/News_Item.2002-10-02.2007

²        "Building ZopeZen, Part Three":

http://www.zopezen.org/Members/zopista/News_Item.2002-10-09.3743

其他配置

修改tabs

Tabs由“Actions”和“Actions Providers”决定(见第5章)。可通过创建动作条目生成TabsCategory(类别)用以下的方式影响tabs

如果类别是portal_tabs,动作会显示在站点上部(如News

如果类别是object_tabs,会显示在绿色编辑边框中(如Edit

如果类别是folder_buttons,会在folder_contents中显示为按钮(如Folder Contents

例子:在Plone.org中添加documentation标签

一个通常的任务就是在门户站点的最上面增加一个指向某个文件夹的标签,例如在Plone.org中所有的文档保存在documentation文件夹中。想要让用户能方便的访问文档,我们增加了一个Actions(动作)。

Plone接口中

²        创建documentation文件夹

²        发布这个文件夹(需要的话)

ZMI接口中

²        portal_actions

²        滚到页面底部的Add部分,输入下面的内容

ü         Namedocumentation

ü        Iddocumentation

ü        Action: string$portal_url/documentation

ü        Conditionleave blank

ü        PermissionView

ü        Categoryportal_tabs

ü         Visiblechecked

²        选择Add

现在在站点的上面就有了一个指向documentation的标签。

修改日期

Plone用一种便于阅读的格式表示时间,这个格式可通过Zope管理接口进行修改。这里值作为Plone站点的特性存储,再ZMI中,到portal_properties->site properties

n         localTimeFormat是短格式的时间和日期

n         localLongTimeFormat是长格式的时间和日期

所有这些值使用Python的时间格式模块来生成时间格式。具体格式可参考http://www.python.org/doc/current/lib/module-time.html 如果不熟悉该模块,下面是快速参考:

n         %a 本地的短格式星期名称(如Mon

n         %A 本地的完整格式星期名称(如Monday

n         %b 本地的短格式月名称(如Jan

n         %B 本地的完整月名称(如January

n         %d 十进制的每月第几天

n         %H 十进制的小时(24小时时钟)

n         %I  十进制的小时(12小时时钟)

n         %m 十进制表示的月

n         %M 十进制表示的分钟

n         %S 十进制表示的秒

n         %y 十进制,不带世纪表示的年

n         %Y 十进制,带世纪表示的年

例如:localTimeFormat的默认设置是 %b. %d, %y 。该格式的时间表示的是:短格式月.数字表示的天, 两位数字表示的年,如Oct. 24, 02。如果要包括星期,只要简单的将localTimeFormat修改为%A, %b.%d,%y,这样产生的日期就是:Thursday, Oct.24,02

Plone的页面渲染

这一节介绍Plone的页面是如何呈现的,可以通过修改来适合自己的站点。Plone中内容的表示是通过页面模板main_template.pt的,可在CMFPlone/skins/plone_templates中找到该文件。通过ZMI定制,到portal_skins->plone_templates->main_template

main_template

main_template模板定义了所有页面宏,所有内容都会使用。该模板调用5个已命名的宏和两组槽宏来构造页面,这些宏是:

n         html_header(在header.pt中)

n         portal_header(在header.pt中)

n         portal_message(在header.pt中)

n         viewThreadsAtBottom.pt(在discussionView中)

n         footer.pt(在portal_footer.pt中)

槽宏在站点对象中由CustomizationPolicy.py中以lines特性进行设置。特性是left_slotsright_slots,里面填写指向宏的路径表达式。这些槽在第五章有更详细的介绍。

总的来说,页面的构建大概是这样的:

+----------------------------------------------+

| html_header                                  |

| portal_header                                |

|==============================================|

| left slots |    portal_message | right slots |

| left slots |    slot:main      | right slots |

| left slots |    discussionView | right slots |

|==============================================|

| portal_footer                                |

+----------------------------------------------+

= 中间的部分使用表格分为三列,这里只表示了main槽,还有许多其他槽可用。

main_template.pt中的槽

²        base  here/absolute_url填入,可以重写

²        head_slot  RESPONSE中设置Content-TypeContent-LanguageExpiresPragmaLast-Modified的代码

²        super  如果用户对浏览的内容有编辑权限,contentTabs在这里展示。

²        header  在主要内容区域首先展示

²        main  主要内容

²        sub   紧跟在主要内容后展示,默认由线索讨论试图填充,但可重写

页面可图形化表示为:

+----------------------------------------------------------+

|                                                          |

|                                                          |

|==========================================================|

| left slots |  +--------------------------+ | right slots |

| left slots |  |                          | | right slots |

| left slots |  |                          | | right slots |

| left slots |  |                          | | right slots |

| left slots |  |    discussionView        | | right slots |

| left slots |  |                          | | right slots |

| left slots |  +--------------------------+ | right slots |

|==========================================================|

|                                                          |

+----------------------------------------------------------+

header 模板

模板header.pt定义了三个宏:在head元素中的html_header,在两个div元素中的portal_headerportal_message宏。

html_header

这里有许多槽:basehead_slotjavascript_head_slot。这些这里是空的,但会由main_template.pt重新定义填充槽,然后就可用了。

也定义了三个宏:portal_tabspersonalBarpathBar,这三个宏没有在其他地方使用。

下面表示是:

+----------------------------------------------+

| <macro 'html_header'>                        |

|    <slot 'base'>                             |

|                                              |

|    insert DublinCore meta tags               |

|                                              |

|  CSS:                                        |

|    include ploneNS4.css                      |

|    include plone.css (overrides NS4)         |

|    include plonePrint.css                    |

|    include plonePresentation.css (Opera)     |

|                                              |

|  <slot 'head_slot'>                          |

|  <slot 'javascript_head_slot'>               |

|                                              |

|  ECMAscript:                                 |

|    include plone_formtooltip.js (tooltips)   |

|      if the portal was configured w tooltips |

| </macro>                                     |

|                                              |

| <macro 'portal_header'>                      |

|    render searchbox                          |

|    render Plone logo                         |

|                                              |

|    <macro 'portal_tabs'>                     |

|                                              |

|    <macro 'personalBar'>                     |

|      render "You are not logged in" or       |

|        user_actions and global_actions.      |

|    </macro>                                  |

|                                              |

|    <macro 'pathBar'> render breadcrumbs      |

|    </macro>                                  |

| </macro>                                     |

|                                              |

| <macro 'portal_message'>                     |

|    render REQUEST['portal_status_message']   |

|        if present                            |

| </macro>                                     |

|                                              |

|==============================================|

| left slots |    portal_message | right slots |

| left slots |    slot:main      | right slots |

| left slots |    discussionView | right slots |

|==============================================|

| portal_footer                                |

+----------------------------------------------+


第七章 Plone风格向导(完)

风格向导,本章介绍Plone的扩展,通过中修改或增加代码或HTML来根据需要进行订制。

Plone HTML

这一节介绍Plone中默认的HTML文本风格,对浮动和插入引用使用嵌入风格给出一些小技巧。给Plone站点作些参考,通过授权过程给最终用户更多控制。

基本文本

如上图所示,使默认设置的header1header2header3header4header5header6的默认格式,以及段落、加重和斜体字的默认格式。

此外,Plone中页面空白也根据字体大小调整,Plone调整布局与用户的设置更加一致,平台和浏览器之间的差异性更小。使用相对的页面空白表示较大字体的一行会有较大的空白,较小的字体空白较窄。

列表和表格

这部分介绍列表和表格在Plone中的表现。

未排序的列表

排序的列表

定义列表

不经修改的表格

嵌入的风格

用嵌入的风格创建“浮动”的段落和插入的引用,或改变字体、颜色等。

如何浮动段落

(大段法语)

对“浮动”的段落,将下面的代码插入到段落标记中(在p之后,右尖括号之前):

style="font-size: 90%; background-color: #DEE7EC;

float: right; clear: none; width: 30%; padding: 1em;

margin: 1em; border: solid 1px #8CACBB;"

Plone中的pre标记

可以使用pre标记创建漂亮小蓝盒子,它内建在Plone风格列表中。Pre标记将字体修改为courier,在上面的显示浮动段落的代码中使用了pre标记。Pre标记用来重建代码行。

注意使用pre标记,必须在pre标记之间手工加入换行标记和文本,不能换行。

插入的引用

要建立插入的引用,可使用块引用(blockquota)。通过使用嵌入的风格命令,可更有弹性的控制布局。插入引用的嵌入式风格可在段落标记或div标记中使用。(也就是,将代码放在段落标记或div中)。

style="font-family: Georgia, Times New Roman, serif; width: 70%;

margin: 1em 20% 1em 10%; padding: 0;"

上边的代码会创建一个插入的引用,看起来如下图所示。除了偏移的空白,还将字体改变为:serif font,展示一种某人说话的感觉:

如果对插入引用很困惑,可找到greeking的有趣的历史信息。令人惊奇的是这个“dummy text”哑元文本成功经过几个世纪的复制而没有改变。有些奇异。

Plone颜色

Plone风格列表


第八章 扩展Plone (完)

这一章介绍如何扩充、扩展Plone。这个题目很大,可以用好几本书来讲解。这里只介绍一些通用的扩展Plone的方法。

创建新的内容类型

plonecmf中有许多项目类型。但有时,这些类型还是不能满足需要,这部分介绍如何在plone实例中添加扩充的内容类型。

添加新的内容类型需要了解一点儿python知识,有多种方式创建plone 扩展:

n         重定义现有内容类型

n         创建新的Zope产品

n         ArcheTypes

注:有些也可用ZClasses完成,在这里不建议(也不介绍)使用ZClasses。关于用ZClasses创建内容类型,有一个非常好的How-to

重定义现有内容类型

每个内容类型都设计用来完成特定的任务和功能。Plone提供了多个通用内容类型,也许能,也许不能满足需要。重定义就是将现有的内容类型(如News Item)修改来更好的满足用户的需要。

用一个例子来讲解,许多公司发布Press Releases,用来宣布公司新闻,如新产品或新买卖等,这些用News Item就可以完成,但是假设Press Release需要完成一些其他的事情:

n         News Item不同的名字,描述和图标

n         每个Press Release的底部有定制的文本来描述公司、联系方式等等。或者不仅仅是手工加入到每个Press Release,而是加入到模板中,让所有Press Release都有这个信息。

下面介绍完成上述工作的所有步骤:

从现有类型创建一个新类型

ZMI中,访问portal_typesportal_type工具列出了站点登记的所有内容类型。包括标准的类型:Documents(文档)、Folders(目录)、当然还有News Items(新闻条目)。使用右上侧的Add菜单,选择Factory-based Type Information

n         填入idPress Release,在Use default type information中,选择CMF DefaultNews Item。点击Add完成这个表单。

每个Plone的内容类型有描述内容类型的信息,这些列在菜单中。选择News Item表示Press Release会与News Item有同样的初始特性和配置。

现在,在portal_types列表中可以看到一个新的内容类型:Press Release。同样用普通用户访问Plone时,也可以添加Press Release对象了。

定制新的内容类型

现在的Press ReleaseNews Release除了名称以外完全一样。在ZMI中的portal_types工具选择新创建的Press Release对象,这会转到该类型的properties(特性)页面,注意到这些特性都来自于News Item。例如,description(描述)是“News Items contain…”这是出现在Press Release中的描述,应该更改为更合适的内容,如:Press Release contain news for the public

可以通过改变这个值来改变内容显示的方式:

内容类型工具值

n         Description(描述)——该内容出现的描述

n         Icon(图标)——该内容使用的图标id

n         Product meta type——该内容的meta type

n         Product factory method——产品工厂创建内容时调用的方法

n         Initial view name(初始视图名称)——Plone中不使用

n         Implicitly addable(是否隐含添加)——该内容是否可加到文件夹,除非另外进行了显式说明

n         Filter content types(过滤内容类型)——如果对象类型是文件夹类对象,选用它来过滤出能够添加到该对象的内容类型

n         Allowed content types(允许的内容类型)——如果对象类型是文件夹类对象,并且Filter content types被允许,只有列在这里的内容才能够加入到该对象中。

n         Allow discussion(允许讨论)——设定对所有内容类型的讨论的默认状态

为该内容类型定制模板

为完成第二个目标,需要调整该内容类型的模板,以提供给用户不同的视图。在ZMI中的portal_types工具选择新创建的Press Release对象,然后选Actions标签。这里列出了每个内容类型的动作,你可能会注意到这些动作与出现在页面顶部的tabs(标签)一样。

该例中,要修改的Action(动作)是View动作。这个动作是用户访问这个内容时得到的默认页。每个动作指向一个Page Template(页面模板),当动作被调用是调用页面模板。由于该内容类型是基于News Item的,视图的动作就指向newsitem_view。搜索plone skins,可以找到newsitem_view实际指向对象 portal_skins/plone_content/newsitem_view

要修改试图,需要制作一个新页,最简单的方法就是在ZMI选择对象,点击customise(定制)按钮。这会在custom文件夹创建了对象的一个备份,可通过portal_skins/custom访问。注意这个对象虽然和动作中的名称一样,为了区别,将这个对象的名称从newsitem_view改为pressrelease_view。回到portal_types/Press Releases/manage_editActionsForms,找到View动作,从newsitem_view改为pressrelease_view。现在Press Releaseview动作指向了新的页面模板。

现在需要做的就是修改视图,让公司介绍出现在视图底部。通过简单的修改pressrelease_view,添加需要的HTML,例如:

<p tal:condition="not: len_text"
   i18n:translate="no_body_text">
This item does not have any body text, click the edit tab to change it.
</p>

可能要加入:

<h3>About My Company</h3>
<p>Blah....</p>

这样就完成了在每个页面的底部显示一些附加内容的需要。

总结

重定义内容类型在Plone中是种简单的改变内容的方法,但只能做一些简单的修改,无法完成超过原始内容类型的复杂的修改。

创建新的Zope产品

在所有创建内容类型的方法中,创建新的Zope产品是功能最强大的方法。当然也是最复杂,最难以理解的方法,并且需要Python知识。对有经验的程序员或希望更深入了解Plone的内部结构的人来说,这是一个选择。写一个产品的唯一限制在与你的想象力。

由于这个主题太过深入,不能在此完全讲述,在这里只做一些假设:

n         了解Python

n         了解如何创建基本的Zope产品

……

使用ArcheTypes

ArcheTypes是在Zope/CMF/Plone中开发新的内容类型的框架。模型驱动自动化表单生成,简单结合的大量内容类型,从简单条目到复杂需求放在新的内容对象中。

ArcheTypes(以前叫做CMFTypes)是Zope产品,它简化了Zope2CMF中的新内容类型的创建。内容类型可能是文档、事件、图像或其他内容对象,对用户/内容创建者可见并可添加到内容管理站点中。大多数内容管理项目涉及引入新的内容类型,这通常很复杂很消耗时间。Archetypes提供了简单可扩展的框架,可减少开发和维护CMF内容类型的成本,同时降低了简单事例的学习曲线。

使用Archetypes创建新类型涉及一个主要的文本文件(python),定义了域和类型中的其他对象,特性和行为等。Archetypes使用这些信息按照需要自动生成所有表单和页,用来添加、编辑和浏览新类型的数据。这样就创建了一个产品,可以象其他CMF/Plone产品一样进行安装。

更多关于Archetypes、开发指南和其他帮助信息,请参考:

http://plone.org/documentation/archetypes/

Plone的表单和导航栏

Plone有一个表单和导航系统,很容易的创建导航表单。

Portal 表单

portal_form工具为表单提供确认和导航服务。描述他最简单的方式就是看看portal_form如何工作,如编辑一个链接对象的过程。

编辑的链接的URL ../myLink/portal_form/link_edit_form 。编辑表单的HTML动作是它自己: ../myLink/portal_form/link_edit_form portal_form工具解释url的遍历检查最新提交的值。如果portal form工具发现新值,portal_formportal_properties/form_properties sheet为表单找到一组有效值,在提交的值中调用。有效值的链返回success(成功)或failure(失败)。Portal_formportal_properties/navigation_properties 中找接着发生什么,递交给准确的目的。因为portal_form处理确认和导航的调用,所有的表单处理代码必须更新对象,最终的结果:简单,模块化的确认和简单的表单处理代码,所有这些都可以在portal_properties中使用特性表格重新配置。

为使portal_form与用户的form工作,需要做以下事情:

n         在用户的form中,改变用户的form动作,使他提交给自己(设定动作为 request/URL,参考link_edit_form)。添加一个隐藏变量,名称为 form_submitted,设定它的值为 template/idPortal_form测试REQUEST.form_submitted来确定表单是否提交。

n         给用户form登记一组确认(validators),通过调用portal_formsetValidators()来进行登记。第一个参数是form的名称,第二个是一组确认(validators)。或者你可以通过portal_properties/form_properties手工登记确认(validators)。要自动设置:

portal_form.setValidators('link_edit_form', ['validate_id', 'validate_link_edit'])

n         列表中的确认(validators)顺序调用,在上面的例子中,validate_id是一个通用的validator,大部分表单用它来检查对象的idvalidate_link_edit检查链接类特别特性。

n         为用户form写一个确认(validators)。该validator需要返回1一个状态(通常是successfailure),2一组词典中的错误信息,3一组传送给下一个导航状态的特性词典。如果validator是链条中的一部分,可能需要访问链条前一个validator返回的状态或错误。这个值在REQUEST中可用,用REQUEST[‘validation_status’]REQUEST[‘error’]

n         特性词典的通常应用是通过设置键值portal_status_message传递portal状态消息。导航工具会将这些特性值传递给下一个导航状态,以REQUEST方式(下一个状态是页面模板或python脚本)或查询参数的方式(下一个状态是URL或动作)。注意如果在确认(validation)后调用脚本,需要脚本从REQUEST中得到portal_status_message,并传递给下一个导航状态。

n         写一个表单处理器。处理器可以从REQUEST修改对象和metadata,返回状态代码。任何调用validator的附加代码和执行导航都不需要,应该删掉。表单处理器应该返回一个包括状态(successfailure)、下一个导航状态的上下文关系(返回上下文关系允许对象用portal_factory例示)和要传递给下一个导航状态的特性词典。

n         portal_navigation中设定form所需的导航(下一节)

Portal navigationPortal导航)

portal_navigation工具是处理导航表单的控制器的一部分。导航可通过portal_properties中的navigation_properties完全配置,导航特性格式如下所示:

[type].[action].[status] = [next thing to do]

例如,编辑链接的导航:

link.link_edit_form.failure = link_edit_form<br/>

link.link_edit_form.success = script:link_edit<br/>

link.link_edit.success = action:view

导航工具实现的是Design Pattern的状态控制模式,navigation_properties表是状态迁移表,导航特性左边表示当前状态,右边表示变化。如:

link.link_edit_form.failure = link_edit_form

表示从确认链接的link_edit_form接收到输出的failure信息,导航工具需要在当前的上下文关系重新调用页面模板link_edit_form。而:

link.link_edit_form.success = script:link_edit</code></p>

表示从确认链接的link_edit_form接收到输出的success信息,在当前的上下文关系调用脚本link_edit

link.link_edit.success = action:view</code></p>

表示在一个链接调用link_edit,得到输出的success信息,执行当前链接的view动作。

在右侧制定的变换可以是下面内容:

PAGE_TEMPLATE —— 在当前上下文关系调用页面模板 PAGE_TEMPLATE

action:ACTION —— 在当前上下文关系调用动作 ACTION

script:SCRIPT —— 在当前上下文关系调用脚本 SCRIPT

url:URL —— 重定向到特定URL(绝对URL

此外,变换可通过括号从request中合并数据。如url:http://www.zope.org/?myId=[id] 会发送给用户用REQUEST.id替代[id]后的特定URL

诊断Plone安全性

如果在Plone中作开发,产生一些错误和安全声明,会得到login_form。这在开发时没有什么用。这里是一些架构,帮助用户更详细地了解产生了什么错误。

n         ZMI/manage)中,选择cookie_authentication对象,擦除Auto-login page ID的值(可能设置为login_form

n         安装VerboseSecurity产品

n         设定环境变量ZOPE_SECURITY_POLICYPYTHON(有关修改环境变量,使Zope有不同的外观的更多信息,参考Zope源代码中的doc/environment.txt

n         重新启动Zope

n         当产生安全错误时,VerboseSecurity会给出更有用的信息

n         这对调测非常有用,但注意这会影响性能,只能在开发站点中使用。


第九章 维护和优化Plone

这一章介绍Plone的维护和通过优化Plone提高性能。大部分小技巧可混合使用。这部分是为技术用户和开发者的。

调试模式

显而易见,Plone运行在调试模式会极大地影响性能,特别是在Windows系统下。如果运行在调试模式下,在访问Plone中的一个页面时,会检查skins目录下的每个图像、脚本、模板是否更改。调试模式在所有操作系统上都对性能有影响,在Windows上特别差,大约增加510倍的访问时间。

Zope运行在调试模式时,刷新产品也会检查每个产品是否变化。这也带来性能问题,更多信息请参考Zope文档。

通过在启动时的命令行开关 –D 来控制开启或停用调试模式。默认安装不会运行调试模式。更多信息参考Zope Book第三章。

简单优化

启动python时带上 –O 参数有一点优化功能,通过优化生成的字节码,速度会提高约5-8%

启动Zope时使用 –t 参数(使用的线程数量)可以提高高流量站点的性能,但内存的消耗也随之增加。对大型站点似乎3个线程就足够了,记住Zope是多线程的,但大部分I/O范围的处理并不阻塞线程。Zope也是异步应用,像Squid一样。

监控cache 大小设置(参看下面),如果看到过多的对象负载,需要增加cache大小。使用活动图表来测量ZODB的活动性。通常一个小时内的负载不要超过1000或这样的负载的持续性,如:在plone.org有时负载会达到5000,但这种情况较少。平均三十分钟的负载是10-100个对象。

通过字节码处理的数量可通过syscheckinterval中编辑,超过这个数量就切换到解释器工作。系统特性在$ZOPE/z2.py中设置为500(在最新版本的Zope中)。但我觉得PloneZPT比一般的Zope执行更多的处理。当前的Plone.org中这个值为750

使用Apachemod_proxy缓存静态内容

Apache来提供静态内容可以极大的提高Plone的性能。同时Plone使用Zope作为快速的、强大的web服务器,但还是没有使用Apache缓存内容快速可扩充。在Plone.org中,使用了下面的Apache配置。

Apache这样编译:

./configure /
"--prefix=/usr/local/apache" /
"--with-layout=Apache" /
"--enable-module=so" /
"--enable-module=proxy"

mod_gzip配置:

# http://www.remotecommunications.com/apache/mod_gzip/::
# MOD_GZIP configuration (after loadmodule-part of httpd.conf)
mod_gzip_on Yes
mod_gzip_minimum_file_size  1002
mod_gzip_maximum_file_size  0
mod_gzip_maximum_inmem_size 60000
mod_gzip_item_include mime "application/x-httpd-php"
mod_gzip_item_include mime text/*
mod_gzip_item_include mime "httpd/unix-directory"
mod_gzip_dechunk Yes
mod_gzip_temp_dir "/tmp"
mod_gzip_keep_workfiles No
mod_gzip_item_include file "/.php3___FCKpd___23quot;
mod_gzip_item_include file "/.txt___FCKpd___24quot;
mod_gzip_item_include file "/.html___FCKpd___25quot;
mod_gzip_item_exclude file "/.css___FCKpd___26quot;
mod_gzip_item_exclude file "/.js___FCKpd___27quot;
 
#Logfile format adjusted to awstats (not implemented on plone.org, though)
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"
mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n
Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct."
combined_gzip

virtual host(虚拟主机)配置如下:

<VirtualHost *>
# Virtual Host Monster handling
ServerName plone.org
ServerAlias www.plone.org
ServerAdmin webmaster@plone.org
ProxyPass / http://localhost:8080/VirtualHostBase/http/plone.org:80/plone.org/VirtualHostRoot/
ProxyPassReverse / http://localhost:8080/VirtualHostBase/http/plone.org:80/plone.org/VirtualHostRoot/
 
#
# gzip handler
#
mod_gzip_item_include handler proxy-server
mod_gzip_on Yes
 
CacheRoot "/tmp/proxy/plone.org"
CacheSize 5000
CacheGcInterval 2
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
CacheDirLength 2
#
# Expire - by request
#
 ExpiresActive On
 ExpiresByType image/gif A86400
 ExpiresByType image/png A86400
 ExpiresByType image/jpeg A86400
 ExpiresByType text/css A86400
 ExpiresByType text/javascript A86400
 ExpiresByType application/x-javascript A86400
 
CustomLog /usr/local/apache/logs/plone-access_log combined
ErrorLog /usr/local/apache/logs/plone-error_log
</VirtualHost>

这不是唯一的方法,但可用

参考:http://www.zope.org/Members/softsign/ZServer_and_Apache_mod_gzip

增加ZODB Cache大小

Zope的默认数据库cache大小设置得非常低。Plone从增加缓存对象的数量中受益颇多。因此采用下面简单的优化方法:

l         登陆Zope管理接口ZMI

l         Control Panel(控制面板)

l         Database Management(数据库管理)

l         点击Cache parameters(缓存参数)标签

l         Target number of objects in memory per cache中,当前值可能是400。改为8000。(不用担心,典型的Plone对象没有那么大,所以即使在只有很少ram的低档的计算机上也可以工作的很好)。

l         Change按钮

现在,由于在Zope的不同区域,这个域的使用有许多不一致,可能不是在Zope所有的版本可用。在一个适中能力的400MHz笔记本上,修改这个域会有很大改善,Plone会显得更快,更优秀。

缓存槽位置(slots

最近有人调整了plone.orgRAM Cache Manager(内存缓存管理),有高速连接的人说速度有很大提高。这里概括了在Zope/CMF/Plone中的缓存思想,以及极大提高Plone.org性能的方法。

注:如果不熟悉槽位置,参考第五章

Plone有槽位置(slots),可在里面写入指向宏的路径表达式。以这些槽位置的同样顺序,表达式顺序执行,结果是将相应的HTML放在页面中。left_slots将内容放在页面左边一列,right_slots将内容放在页面右边一列,非常简单。路径表达式类似这样:here/calendar_slot/macros/calendarBox(这是Plone默认设置的right_slots)。在PageTemplate中使用python:path(here/calendar_slot/macros/calendarBox)会返回calendar widget。在Zope 2.6 Book中可找到更多的路径表达式使用方法。

ZMI中,如果拉下items to add选框,会看到RAM Cache ManagerRAM Cache ManagerZope的默认工具,更多的信息可参考Zope Book。放一个RAM Cache Manager在根目录中,可以启用模板来登记,以便缓存内容。可用不同的REQUEST变量作为缓存内容的键值。对plone.org的例子创建了cache_calendar RAM Cache Manager,它的REQUEST变量如下:

n         month

n         year

n         HTTP-ACCEPT_LANGUAGE

所以每次执行calendar_slot的时候,会为这些变量检查REQUEST,并和输出的表达式来匹配。这就可以缓存不同语言,不同年月设置的calendar

这非常棒,不是吗?缓存管理器保存了备份的HTML,当对象/模板变化后,会使缓存中的内容无效(或者可以通过手动/编程使缓存中的内容无效),但有些问题,事情不总是那么简单,不是么?

首先不能缓存宏(macros)。所以调用 here/calendar_slots/macros/calendarBox 永远不会被缓存管理器提取。所以最好明确调用如:here/calendar_slot

portal_skins/plone_templates/ui_slots/calendar_slot 是一个很好的样板HTML文档,不能仅仅直接包含来执行。所以必须定制这个模板,以便只有div显示。然后必须到Plone 根(包括portal_skins和其他工具)的Properties(特性)标签,改变路径表达式(path expression)为 here/calendar_slot。做几个请求,检查RAM Cache就会看到Hits(采样数)。去掉<html>标记和其他东西(因为不想让它们与执行的模板一起出现)PloneHTML会有很好的形式。

第二,here/calendar_slot缓存模板时带有对象的上下文信息,这种结果有些迷惑。如果在plone.org中实施 here/calendar_slot表达式,会在 / 下面实施calendar_slot。如果在http://plone.org/Members/runyaga/ 中,会在 /Members/runyaga 下实施calendar_slot,这是不同的条目。

所以所需要的不是:tal:replace=”here/calendar_slot”,在Propertiesleft_slots的应该是 “left_slots,portal/calendar_slot” portal应该定义在 plone_templates/main_template ,作为global portal here/portal_url/getPortalObject。这样每次calendar_slot都在 / 下执行。

我们在plone.org下的特定设置为:

navtree (导航树)

- cache_navtree
- AUTHENTICATED_USER
- HTTP_ACCEPT_LANGUAGE
- URL1

如果缓存 here/navigation_tree_slot 只会得到URL1定义的条目,以当前登陆用户选定的语言。匿名用户是没有登陆的用户。

News框(News Box

- cache_news
- HTTP_ACCEPT_LANGUAGE

我们只需根据语言缓存 portal/news_slot,因此缓存了i18n标签。

缓存页面

Plone缓存管理器

Plone有两个缓存管理器:

n         HTTP加速缓存管理器(HTTP Accelerated Cache Manager)通过给对象添加HTTP Cache头完成

n         RAM 缓存管理器(RAM Cache Manager)将对象缓存在内存中以便快速提取

这两个缓存管理器在Zope Book中有更多讨论。

缓存404错误页

在设置一个运行Windows NT的客户机时,注意到log中大量的404错误。可能是由于该客户机受到了大量蠕虫进行的后门探测,每次试图访问这些不存在的url,如 /system.exe ,服务器会产生一个404消息。通过在我家里的笔记本电脑(850Mhz ,运行windows XP)所做的基准测试,发现对这些不存在的url的申请每秒钟有4个。

每次得到错误的申请,Plone执行standard_error_message.py,它将调用default_error_message.pt。在ZODB中创建一个简单的页面,名称为default_404_message.pt可以极大提高生成404页的速度。要使404错误发生时,执行这个页面,需要在 skins/plone_templates/standard_error_message.py中添加下面几行,这几行解析Plone site的错误:

if error_type=='NotFound'
    return context.default_404_message()

使用abApache自带的一个基准测试工具,是一个简单的站点压力测试工具),在修改之前得到每秒3.9个请求,修改之后得到每秒37个请求。从某个角度,客户机似乎每秒钟得到了更多的假申请。如果在我的笔记本上收到24个请求,404错误会消耗掉10%的容量。该技术当然会有所帮助,如果由于某些原因,你需要生成404错误页的话。

打包Plone

Plone中对象的每个修改都存储在ZODB中,因此Plone有恢复能力,可以浏览并恢复对文件的修改。但这也意味着所有都存储在ZODB中,会增加ZODB大小。

如果数据库变得非常庞大,需要周期性的打包ZODB来清除这些变化数据。到 Control Panel -> Database,输入适当的清除对象时间,点击 Pack.。尽管打包需要一些时间(取决于数据库的大小),Plone还是继续工作的。

打包在Zope Book的第23章中有介绍。

备份Plone

什么时候备份

这主要依赖于站点修改的数量。如果站点变化较少,频度低(如每周一次)比频度高(如每晚一次)也许更合适。在确定备份策略时需要将打包数据库考虑在内。

备份什么

Plone站点的所有数据都存储在Zope对象数据库中(ZODB)。ZODB就是一个文件:Data.fs。要备份,就要制作这个文件的一个拷贝。如果不确信该文件的位置,打开ZMI,到Control Panel -> Database,可以看到一个如下图的图像,显示数据库的大小和位置。

在数据库的存储目录下,还有zope的日志文件。你也许愿意或不愿意备份它们。如果对文件系统代码进行了修改或计划迁移到PloneCMF,或Zope的新版本,PloneCMFProduct数据也需要备份。否则这些就不需要备份。

如果你定制的Plone使用关系数据库,或在文件系统中存储数据。在备份时把它们包括在内。这些不是标准安装的部分。

如何备份

拷贝上面提到的文件。大部分情况就只是Data.js文件。可以用pythonshell脚本完成。例如下面的脚本备份一个文件,并检查原始文件和备份文件的md5校验和。

#! /usr/bin/env python

import sys, md5, shutil

 

BLOCKSIZE = 1024*1024

def hexify(s):

return ("%02x"*len(s)) % tuple(map(ord, s))

 

def md5value(file):

f = open(file, "rb")

sum = md5.new()

while 1:

block = f.read(BLOCKSIZE)

if not block:

break

sum.update(block)

f.close()

return hexify(sum.digest())

 

def main():

args = sys.argv[1:]

if len(args) != 2:

sys.stderr.write("usage: %s src dest" % sys.argv[0])

sys.exit(2)

 

src = args[0]

dest = args[1]

shutil.copyfile(src, dest)

if md5value(src) != md5value(dest):

print "Error occured: md5 sums did not match"

 

if __name__ == "__main__":

main()

 

注:在Windows平台下,备份时需要停止Plone,在大部分其他平台是不需要的。

注:建议在进行本地拷贝cp之前不要使用rsyncscp通过网络备份,这样可以保证事务不会丢失。

备份在ZopeBook23章有介绍。但是在写下这些文字时这一章还有一些错误。注意我们不建议直接远程备份(rsyncingZODB数据库。


第十章 结构化文档

基本文本格式

斜体字

输入 *italics*               得到:italics

下划线文本

输入 _underline_          得到:underline

加粗文本

输入 **boldface**              得到:boldface

标题和段落

输入以下内容,注意格式:

My header
 
   If you enter a single line paragraph (e.g. like the one
above and then indent the first line of the next paragraph, 
the text in the one-line paragraph will be transformed into
a header.
 
   Note that the second paragraph in the section also has 
its first line indented.
 
   Be sure to leave a blank line between paragraphs.  This
paragraph's first line is indented, too.
 
   Subheading 1
 
      Use additional indentation to generate subheaders.
   Notice that the subheading's level of indenting is the
   same as the level for the previous paragraph, but that
   *this* paragraph is further indented.  It's the extra
   indenting of *this* paragraph that creates the subheading.
 
      Subheading 2
 
         Get smaller subheadings by indenting even more.
 
         Subheading 3
 
            Get even smaller subheadings by indenting even more.

得到如下效果:

未经格式化文本

未经格式化文本块

The next block of text will be formatted exactly the way I have typed it::

 

   This is all preformatted.

 

      Your formatting will be used until...

         ... you stop indenting text.

      None of the *structured text* **commands** _work_ here.

 

   This is still indented.

 

This is no longer preformatted.

得到如下效果:

嵌入的未经格式化文本

输入:

Some ordinary text here.  Some 'preformatted text here'.  More ordinary text.

得到如下效果:

列表

普通列表

输入:

* First item
 
* Second item.  Note that there is a blank line between
each list item.
 
   * Make lists within lists by using extra indentation
 
   * Second indented item.
 
* Third item in the main list.

得到如下效果:

数字编号列表

输入:

1 First item
 
2 Second item.  Again, note that there is a blank line 
between each list item.
 
3 Third item in the main list.

得到如下效果:

定义列表

输入:

First item -- More information about the first item.
 
Second item -- More information about the second item.
 
Third item -- More information about the third item.

得到如下效果:

链接

链接

输入:

"A link to CNN":http://www.cnn.com

得到如下效果:

电子邮件

输入:

"address@example.com":mailto:address@example.com

得到如下效果:

参考

输入:

I am going to refer to a footnote here [1].
 
Later in the text I will have a footnotes
section.
 
.. [1] My footnote.  The initial whitespace
controls indentation, then the two periods
followed by the space and the bracketed text
create the anchor

得到如下效果:

图像

输入:

"Text shown when the browser does not load the image":img:logo.jpg

得到如下效果:

还可使用绝对URL连接的图像,输入:

"Plone logo":img:http://www.plone.org/logo.jpg

同样可得到上面的图像显示效果。

表格

输入:

|------------------------------------|
| Fruit     | Nut        | Mammal    |
|====================================|
| Apple     | Peanut     | Squirrel  |
|------------------------------------|
| Orange    | Macadamia  | Woodchuck |
|------------------------------------|
| Banana    | Walnut     | Dolphin   |
|------------------------------------|
| This spans 2 columns!  | Cat       |
|------------------------------------|
| Pear      | This spans 2 columns!  |
|------------------------------------|
| This spans 3 columns!              |
|------------------------------------|

得到如下显示效果:


第十一章 Plone案例研究

建设ZopeZen

ZopeZen是一个使用Plone的网站,使用了定制的皮肤。这是一个讨论Zope的站点,最初有许多不同内建的其他Zope皮肤。这里的内容最初发表在ZopeZen.org上,发表时Plone的版本还是1.0 beta 2阶段。其中的一些文件和代码可能已经过时了。

One decision I made from the beginning was to make sure that I would have something that could be distributed. I had so many requests for the skin for ZopeZen that I made sure I was going have this ready from the start. Unfortunately as I hacked the original CMF apart last time, in a mad dash to get something usable it then became a mess to then package up.

安装Plone

这里安装Plone只是简单的设置一个新的例程。在Windows中,创建一个新文件夹,如e:/ZopeTest,然后在其中建立varExtensionsimportProduct目录。进入Product目录,从CVS中下载Plone,使用以下命令:

  cvs -d:pserver:anonymous@cvs.plone.sourceforge.net:/cvsroot/plone login

  cvs -z3 -d:pserver:anonymous@cvs.plone.sourceforge.net:/cvsroot/plone co CMFPlone

  cvs -z3 -d:pserver:anonymous@cvs.plone.sourceforge.net:/cvsroot/plone co ActivePak

然后到CMF,取得CMF-1.3。将它解压缩到Procuct目录下的CMF-1.3目录下。这样Products目录如下所示:

    E:/ZopeTest/Products>ls -al

        total 0

        -d----         0 15-Sep-102 16:42 .

        -d----         0 15-Sep-102 16:42 ..

        -d----         0 15-Sep-102 16:43 ActivePak

        -d----         0  9-Sep-102 22:20 CMFCalendar

        -d----         0  9-Sep-102 22:20 CMFCollector

        -d----         0 11-Sep-102 09:34 CMFCore

        -d----         0  9-Sep-102 22:20 CMFDefault

        -d----         0  9-Sep-102 22:20 CMFForum

        -d----         0 15-Sep-102 16:43 CMFPlone

        -d----         0  9-Sep-102 22:20 CMFTopic

        -d----         0  9-Sep-102 22:20 DCWorkflow

        -d----         0  9-Sep-102 22:20 ExternalEditor

        -d----         0  9-Sep-102 22:20 Formulator

        -d----         0  9-Sep-102 22:19 docs

如已经安装了PythonZope “Software Home”Software HomeZope安装时的libZServer路径,加上z2.py。只需以下方式启动Zope

    "E:/Python/python.exe" "E:/Zope25/z2.py" -D -X -w8080 INSTANCE_HOME="E:/ZopeTest"

该命令通过在Python目录中的Python在用户的Software home中运行z2.py。设置Zope监听8080端口,并将新创建的目录作为Instance Home进行传递。该设置会随系统不同而有所区别。可以顺序安装ZopeCMFPlone。或者可以使用installers,如Windows Installer来完成所有工作。

Almost starting to fiddle

Zope启动后,首先要添加一个Plone站点,默认使用的标准的Plone配置。

配置Plone,大部分工作就是添加一个新皮肤。Skins(皮肤)是一系列包含在portal_skins工具中的文件夹,它们定义了Zope寻找所需方法的顺序。这表示如果将需要的皮肤移动到前面,它会先被发现。因此如果要修改Plone logo,可以在custom中放一个文件名为logo.png的图像文件,它会首先被找到,Zope就会返回这个图像。

但我并不是通过web开发的爱好者,并且为了保证我的Plone皮肤可以方便的发布,在Product创建了一个单独目录ZopeZen。你可以在E:/ZopeTest/Products/CMFPlone/skins目录下建一个新目录,但我没有这么做,理由下面可以看到。在这个目录下,创建了一个文件__init__.py,包括下面语句:

from Products.CMFCore.DirectoryView import registerDirectory

registerDirectory(‘skins’, globals())

还建立了一个skins目录,在其中建立子目录,包括zz_imageszz_scripts等等。要添加这个新“产品”,需要重新启动Zope。然后到portal_skins工具,选择添加Filesystem Directory View,可以找到刚创建的目录,在我的例子中,列出了zz_scripts。选择并给它命名,如zz_scripts,对其他目录重复该步骤。

这样就可以在文件系统中编写代码,在Zope中作为skin来访问了。更重要的是在产品目录中,有很多好处。

在做其他事情之前,需要添加这些目路到skin路径中。在portal_skins中,点击Properties,对应每个skin名字,有一系列目录列表,将要增加的目录添加在列表里。如想让Plone Default看起来如zz_images中的样子,将它添加在custom之后,根据需要重复以上步骤。

Starting to fiddle

Plone前端看起来并不很漂亮,但经过了非常好的设计。大部分色彩、空白、布局和字体都移到了风格表(stylesheets)里。风格表里的关键特性设计成为一个特性对象因素。称为CMFPlone/skins/plone_styles/stylesheet_properties.props,成为定制Plone的起点。如修改mainBackground:string=WhitemainBackground:string:Green将会使站点有一个可爱的绿色背景。所有的变量都很好的命名,无需查找可以了解他们的意义。

将该文件放在创建的目录下,可以注意到skin开始显现。下面想要移动一些对象位置,并修改sytlesheet。仅仅修改特性对我还不够。这里有一些stylesheets,它涉及:

ploneBasic.css.dtml :最基本的部分,上、下,整体的字体

ploneCalendar.css.dtml :日历widget

ploneEditor.css.dtml :所见即所得编辑器,大部分人会保持不动。

ploneForum.css.dtml :论坛工具

plonePresentation.css.dtml presentation的风格表

plonePrint.css.dtml :打印的风格表

ploneStructure.css.dtml :关键的一个,tabs和通用的布局

ploneWidgets.css.dtml boxes

已经统一为plone.css.dtml

每个还有一个对应的以NS为扩展名文件,来支持Netscape 4.x。这时,我忽略NS4,并删除了所有到这些风格的链接,并且并不准备支持。一个非常好的特性是printpresentation风格表的使用。一个通用的风格是页面的可打印的版本,如Zope.org。使用stylesheets,并不是必需的,代替的方式是,在打印时,使用print stylesheet来制作漂亮的文档。

整体布局由css而不是表格完成,但一个完美系统中这样做有一些痛苦。

定制Plone

我有定制Plone的两大优势:要建设的可工作的原型和外观非常类似的站点。看起来最初设计Plone的家伙和我的想法有很多相似之处。这里我只详细描述我对skin做的一些修改,最少我希望能够讲述的清楚他是如何工作的。

修改tabs

我喜欢tabs,但我发现Plone上部的tabsWelcomeNewsSearch等)有点混乱,不适合我的喜好。我更喜欢简单的列表。我高兴的发现上部的tabscss定义和驱动。Css中需要重点注意的是ploneStructure.css(已改为plone.css)中的div.tabs部分。这里定义了hoverselected等的值。通过设置定义边框和事件,可制作复杂外观的tabs

但文字和动作来自哪儿?它们在portal_actions中定义,可在Zope管理接口的Plone Site中找到。每个动作有一些特性:nameidaction等。如果术语不是很明显,name是要显示的文字,action是要调用的urlpermission是显示所需的安全设置,category是在站点中显示的位置。所有categoryportal_tabs的都出现在页面上部。要修改tab,只要修改表单中的数据。

一个使我出差错的地方是actions中的TAL表达式。也许某些地方有文档讲述了这部分内容,但我没有找到在哪儿,但在actionworkflowCMF中的其他部分中到处都用到。本质上可以使它非常复杂,但也许你并不想这样做。也许只需要替换一些有用的全局变量,如:

string: $portal_url/search?portal_type%3Alist=Link

替换portal_url值,最终得到的结果就是搜索links的绝对链接(总能保证链接是绝对的),总之,我找到了代码中的完整变量列表:

object_url - the current objects absolute URL

      folder_url - the folders absolute URL

      portal_url - the portals (CMF or Plone instance) absolute URL,

 

      object - the current object

      folder - the current folder (container)

      portal - the portal (CMF or Plone instance)

 

      member - the member

      request - the REQUEST object

 

      nothing - None

      modules - an interface to the SecureModuleImporter

开始修改一点tabs,修改了Page Templateheader.pt将图像移到顶部,最后一起修改css。但既然我要完全修改header,这不是什么问题。

修改slot

slot是在页面左右两侧显示信息的box。基本概念是每个box是在一个独立page template中的slot。,如果看一下Products/CMFPlone/skins/plone_templates/ui_slots,有一个page template文件列表,这里是一个例子,about_slot.pt

<table metal:define-macro="aboutBox" ...

这里真正的关键是一个宏aboutBox,如果看一下根Plone对象的特性,可看到left_slots,里面可找到一行:

here/about_slot/macros/aboutBox

这表示寻找对象about_slot,并且在里面找宏aboutBox。所以Plone搜索left slots特性,并重复对象,按顺序一行行处理。

通过将它添加为对象的特性,可以简单的添加和修改box的显示。可以非常容易的添加或修改Plone例程的box。对我来讲,添加了3个新box,修改了一个。可能不会比info_box.pt更简单了,它只有一个metal定义了宏的名字。

另一个很好的特性是,可给一个文件夹加入特性,就可根据文件夹来控制box的显示。默认Plone在成员部分的右侧没有box。这是由于在Members文件夹,right_slots特性是空的。我喜爱这一点,只在右侧显示站点的宽泛的部分,如calendar,链接和信息等。不用重复看到这部分,所以只在主页显示这些内容。

修改zpt

所有其他的修改都是为了让站点更漂亮(webloggy)。这对我很重要,但也许对其他人并不重要。实际上这里并没有什么特殊,只是许多页面模板(Page template)。另一个重大修改是home page。默认的home page只显示最近新闻的列表。我看了Plone的标准新闻列表,决定对一些地方进行修改。

首先,需要一个对象图像,象SquishdotSlashdot。第二,想提高性能。由于是第二次写这篇文章,发现非常简单。我有一个Python脚本getNewsAndReplies以词典列表形式发现回复最多的10条新闻。这是一个包括一些其他代码的目录查询。在一次调用中非常重要,这样可以对他进行缓存。在标准的Plone中,有一个目录查询功能来取得返回信息,需要调用十次Python脚本。这是小小的改进。

我还使用Python脚本得到图像的正确标记tag,但我考虑去除它,它没有什么用。

缓存

这里我简单提一下caching缓存。在主页上用到了两个非常昂贵的方法:getNewsAndRepleiesgetNewOrRandom来在右侧列出新闻或随机(如果没有新的)。通过缓存这两个方法,可以有一点儿性能提升。不幸的是可以缓存页面模板宏,表示不能缓存象整个链接box的东西。这只是小事情,但我找到了方便的解决方法。

如果不熟悉如何进行缓存(这里指RAM Cache),这里简单解释。首先到ZMI,在Plone根目录下添加RAM Cache Manager。而后就可以到所有对象,点击cache标签。几乎所有对象,除了包括所有定制内容的文件系统视图。我们必须定制对象,因此选择要进行缓存的对象,选择Customise。在portal_skins/custom下产生一个对象的克隆。你会注意到该对象有一个cache标签,现在可以选择先前添加的RAM Cache ManagerRAM Cache Manager保存对象的输出,当有人再调用它时,就返回保存的输出。

缓存不是唯一可以提高性能的方法,需要研究DTML使用的css,以及发送的整个HTML大小。但现在先把性能问题放下,以后再继续解决。

一些hack(删改)

为了让站点想我想得那样,必须进行一些hack和补丁。由于ZopeZen是一个产品,简单的方式就是将这些放在ZopeZen__init__.py文件里。当产品被引入的时候(Zope启动的时候),这些就会被应用。

日历上的新闻

第一个hack不好,但本来想让右侧的日历显示新闻而不是事件(默认情况下显示)。我认为这对一个网站非常合适。只有带有startend方法的对象才会在日历中显示,而News Item(新闻)并没有这两个方法。因此修改了News Item,增加了startend方法:

   from Products.CMFDefault.NewsItem import NewsItem

 

        def start(self):

           """ Return our start time as a string. """

            return self.created()

 

        def end(self):

            """ Return our end time as a string. """

            return self.created()

 

        NewsItem.start = start

        NewsItem.end = end

现在到portal_calendar工具,可选择News Item作为一个项目。不幸的是我还要修改日历的页面模板,以让日期不显示,但这只是小小的skin修改。

Plone文件夹打开Syndication

我是syndication的狂热追捧者,希望有一天能够编写Plone/CMF客户端应用。使用RSS可使这个变得简单,但syndication工具有些奇怪,不能将他在整个站点打开。如果在tool中打开该功能,必须将portal_syndication工具中的Action(动作)设为可见,然后在每个目录打开。我想在任何时候都打开它。

因此我们修改了Plone文件夹:

        from Products.CMFPlone.PloneFolder import PloneFolder

        from Products.CMFDefault.SkinnedFolder import SkinnedFolder

 

        # syndication is now turned on by default on all plone folders

        def manage_afterAdd(self, *args, **kwargs):

           SkinnedFolder.manage_afterAdd(self, *args, **kwargs)

            try: self.portal_syndication.enableSyndication(self)

            # should be a better catch, but for the moment

            # this will do

            except: print "Error enabling syndication"

         PloneFolder.manage_afterAdd = manage_afterAdd

基本上在上面的修改中,给Plone 文件夹的manage_afterAdd方法增加了一个特性。这是一个hook,设计成在增加文件夹时进行重载,但在该事例中,已经有一个我成为SkinnedFoldersmanage_afterAdd。你可以注意到在ZopeZen的所有文件夹中都有一个xml logo

这就是两处修改,我个人认为站点广泛的syndication应该作为一个选项,站点管理员可重载内容所有者的决定,并且为每个文件夹打开或关闭syndication

定制策略

ZopeZen是一个skin,我希望其他人会在他们的站点中使用。所以我们需要制作一个定制策略。一个策略是个脚本,在Plone站点创建时运行。这可使用户在创建站点时可设置一些特性,例如打开什么动作,权限的设置等等。这些东西在旧的ZopeZen中有些繁杂,需要用户创建外部方法来执行。

首先需要在__init__.py中设置定制策略:

       from Products.ZopeZen import CustomizationPolicy

 

        def initialize(context):

            CustomizationPolicy.register(context, globals())

其次需要在ZopeZen产品中增加一个文件CustomizationPolicy,实际的代码非常长,不在这里重复了。首先要设置在前面初始化中调用的登记函数。

        from Products.CMFPlone.Portal import addPolicy

 

        def register(context, app_state):

            addPolicy('ZopeZen', ZopeZenCustomizationPolicy())

函数addPolicyPlone add 脚本中增加了策略,当添加Plone站点时,ZopeZen会出现在下拉列表里,而后调用我的定制策略。

那么这个策略都做什么,主要包括:

²        去除所有新闻动作(这首页的要求)

²        增加一个Link动作,列出所有站点内的链接

²        修改left_slotsright_slots,以显示不同的box

²        设定ZopeZen皮肤

²        News Item上打开Discussions(讨论)

等等,因此实际的代码首先调用标准Plone定制策略:

      from Products.CMFPlone.CustomizationPolicy import DefaultCustomizationPolicy

 

        class ZopeZenCustomizationPolicy(DefaultCustomizationPolicy):

        """ Customises plone for ZopeZen """

 

        def customize(self, portal):

            # do the base Default install, that gets most of it right

            DefaultCustomizationPolicy.customize(self, portal)

 

            # now do the ZopeZen customiztation policy

而后,我进行需要的所有任务。大部分任务仅仅是读取相关的API,设置正确的值。这里不再详述。

迁移


附录A 资源

网站

Zope Labs http://www.zopelabs.com/ )非常有用的Zope/CMF参考资料和代码实例

Plone HOW-TO’s http://plone.org/documentation/howto/ )包括最新信息

Mailing lists http://plone.org/development/lists )除了实时聊天以外最好的沟通方式

Python Cookbook http://aspn.activestate.com/ASPN/Python/Cookbook/ )对Python新手非常有用

开发

Collective http://sf.net/projects/collective )是社区性的开发联盟,有丰富Python技巧的人可访问并发布模块,许多模块没有发布,只能通过CVS访问。

Archetypes http://sf.net/projects/archetypes )是生成Plone数据类型的最好方式。TTWTypes http://www.zope.org/Members/comlounge/TTWType/ )是另外一个无需编程构建内容对象的方法。

Zope CVS http://cvs.zope.org/ )是查找如CMFStaginsPageDesign等产品资料的宝藏。许多CVS里的内容文档都不完善,需要使用源代码来了解细节。

学习资源

The Pavoda Videoshttp://movies.bluedynamics.org/plone_videos )是Pavoda sprint制作的一组视频,包括Plone很多主题:CMF CollectionCMF Member Groupthe Control Panel、安装和添加新内容。有英文版,日文版和德文版。

The Zope Bookhttp://www.zope.org/Documentation/Books/ZopeBook/index_html )是Zope 应用服务器的完整文档,Plone就是基于Zope的。Zope Book会帮助用户和开发人员更好的理解Plone的工作方式。

 

 


附录B 常见问题和解答

常见问题

静态元素没有进行缓存,为什么?

Alan RunyanZope的一个重点就是获取(Acquisition,经常听到一句话说,但没人期望混乱的获取。这通常意味着有些人没有意识到获取的是什么。一个常见的例子是当在Plone/CMF/Zope上编写一个皮肤,而没有对资源制定绝对URL的时候。常见的例子是样式表。如果不指定css的绝对URL,例如用site.css代替了http://site/site.css/site.css,站点工作正常,这很好。但是在访问http://site/about/ 时,如果依赖于相对URL,就会试图获取http://site/about/site.css,而不是http://site/site.css ——使得浏览器缓存了类似的资源。注意相对URL和获取方法。现在你也可以期待混乱的获取。

允许讨论是什么意思?

CMF中可以附带对任何内容对象的讨论列表,如果一个对象允许讨论,在内容底部会出现一个添加评论(Add comment)按钮。

 

附录C 商业化Plone

附录D 关于Plone

附录E 词汇

Action:动作,在Plone的术语中,动作是在站点中提供导航元素的配置方法。一些例子包括Search(搜索),Browse Folder(浏览文件夹),Logging in(登录)等。第五章有详细介绍。

Actions(Portal)Portal Actions门户动作):门户动作影响整个web站点,与Content Types(内容类型)更多影响本地设置不同。

Acquisition(获取):获取是Zope继承对象特性的架构。Zope对象用获取来构建层次化结构,并充分使用了获取功能。What is Acquistion? Acquisition Algebra

Anonymous Role(匿名角色):这是Zope安全架构中的标准角色。匿名角色是在访问者登录站点之前分配的角色。

Authenticated User(鉴权用户):鉴权用户是登录到Zope系统的用户,根据Zope Book,如果当前没有用户登录,匿名用户被认为是鉴权用户。

Authentication(鉴权):Zope采用的辨别用户的过程。

How-To

国际化和本地化

取得所需软件

取得下面的软件包:

n         Localizer1.0及以上版本)

n         TranslationService0.3及以上版本)

n         相关的.po文件(消息目录,message catalogs

 

安装LocalizerTranslationService

n         zope产品目录中解压上面的两个软件包

n         重新启动Zope

n         Plone Site目录中加入Localizer对象

n         Plone Site目录中加入Translation Service对象,名称必须是:translation_service

 

添加Plone语言文件

n         Localizer对象中加入MessageCatalog,名称为Plone

n         在刚刚加入的MessageCatalog对象Plone中,转到Languages标签,添加要使用的语言的语言文件

n         仍然在刚刚加入的MessageCatalog对象Plone中,转到Import/Export标签

n         在页面底部,有一个Import部分

n         选择要加入的语言

n         点击Browse按钮,找到下载的.po文件所在目录

n         选择正确的语言文件

n         点击Import

n         这样就导入了语言目录,重复以上四步可增加其他要支持的语言

 

translation service指向语言目录

n         translation_service对象中,修改Default参数的值为Localizer/Plone,点击Change

修改Plone Site的默认字符

Plone Siteportal_properties中,选择site_properties。将default_charset参数修改为utf-8,点击Save Changes

 

完成了,如果将浏览器的默认语言修改为Plone Site支持的语言,在访问Plone Site时就可以得到本地化的用户接口。

 

http://www.localizer.org/

http://www.zope.org/Members/efge/TranslationService

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/plone-i18n/i18n/

 

 

修改Zope管理接口(ZMI)的默认字符

ZMIRoot FolderProperties中,加入

Namemanagement_page_charset

Type String

Value gb2312 utf-8

 

 
原创粉丝点击