自定义 Plone

作者:Reuven M. Lerner

内容管理系统 (CMS) 市场持续迅猛增长,这不足为奇。几年前,CEO 可能还在考虑是否要为公司创建一个网站。而如今,问题已不再是是否要建立网站,而是如何管理运营网站的人员以及组织网站包含的信息。一个优秀的 CMS 可以轻松处理这一切,它能管理用户、用户组、权限和定时发布。

但正如任何有关键任务软件经验的人都知道,软件很少(即使有)能开箱即用,满足您的所有需求。Vignette 和 Documentum 等公司销售和维护自己的内容管理系统,并利用这一点向客户收取咨询和支持费用。CMS 客户更希望尽可能将权力掌握在自己手中,既可以避免支付咨询费,又可以在日常工作中拥有更大的自由度。

开源内容管理解决方案允许甚至鼓励用户修改自己的 CMS 软件,这并不令人意外。但通常情况下,修改系统意味着更改源代码,并非所有人都有准备或能力这样做。编写一个功能强大、灵活且易于非程序员自定义的 CMS 已被证明是一项困难且具有挑战性的任务,这很可能在未来几年内继续占据许多 CMS 供应商的时间。

Plone 是一款日益流行的开源 CMS,它使得在无需过多编程的情况下轻松自定义网站的外观和风格成为可能。Plone 并非凭空存在,而是构建于 Zope 的内容管理框架 (CMF) 之上,CMF 是一组用于创建内容管理系统的 API。正如我们上个月所见,Plone 可以轻松创建一个内置许多高级功能的网站,包括活动日历、新闻存档和搜索引擎。

但是,当您想要更改某些内容时会发生什么?如果您不喜欢 Plone 的默认外观和风格怎么办?幸运的是,Plone 在设计时就考虑到了多种方式和多个层级的修改。本月,我们将探讨修改 Plone 的一些方法。在此过程中,我们将了解很多关于 Zope 的 CMF 的知识,这将很好地过渡到下个月的 CMF 巡览。

基本更改

自定义 Plone 最基本的方法之一是修改其外观和风格。要做到这一点,您需要以站点管理员身份登录 Plone。假设您以标准默认方式配置了 Plone,则有两种方法可以实现此目的。更简单的方法是以站点管理员身份登录 Plone,输入您在使用基于 Web 的 Zope 管理界面 (ZMI) 时使用的用户名和密码。Plone 通常从其周围环境中继承用户名、密码和角色,因此您可以使用这些凭据登录 Plone。

不幸的是,登录 Plone 意味着您不会被 Zope 站点的其余部分识别为已登录。为了避免这个问题并能够同时管理 Zope 和 Plone,请通过站点的 /manage URL 登录。例如,如果您的站点位于 www.example.com,您可以尝试通过访问 www.example.com/manage 以管理员身份登录。

以站点管理员身份进入 Plone 站点后,您应该会在屏幕顶部看到一个菜单栏,位于主菜单框下方和“您在这里”行正上方。点击名为“Plone 设置”的菜单项。

进入 Plone 设置后,系统会要求您回答几个问题,例如 Plone 站点(或 Plone 称之为门户)的名称以及发送系统消息的电子邮件地址。其中一个选项允许您选择默认外观,默认安装中提供了大约十几种这样的外观。对站点默认外观的更改会立即生效,允许您查看然后更改您选择的任何外观。

顾名思义,您在此处选择的配色方案只是默认方案。系统上的所有用户都可以进入“我的偏好设置”菜单并更改自己的外观。因此,即使您希望您的站点具有 New Mozilla 的外观,具有更保守品味的用户也可以选择其他外观。

使用 CMF 控件

不幸的是,大多数 Plone 功能无法在 Plone 本身内部配置。相反,您必须使用 Zope 管理界面来修改 Plone,就好像它只是 CMF 的一个简单组件一样。这意味着使用许多 CMF 控件来更改默认的 Plone 外观和风格。

我通过将浏览器指向我创建 Plone 实例的位置之上的文件夹,从而访问了这些控件。也就是说,如果我通过 www.example.com/atf 访问我的 Plone 站点,我可以通过 www.example.com/manage 访问管理界面。管理界面显示了顶层文件夹中的所有对象,包括我的 Plone 实例。单击 Plone 对象(在我们的特定情况下为 atf)会显示一个长长的对象列表,其中大多数对象都以单词 portal 开头:portal_catalog、portal_calendar、portal_skins、portal_membership 和 portal_undo 等等。带有扳手图标的对象是 CMF 工具,允许您修改 Plone 实例的某些部分。例如,portal_actions 工具允许我们修改 Plone 站点内各个位置显示的类似盒子的按钮。这些按钮包括每个页面顶部的按钮,例如新闻和高级搜索,以及站点管理员想要通过 Web 编辑内容时出现的按钮。每个操作都由七个字段控制

  • 在框内向外界显示的操作名称。

  • 唯一标识符。

  • 用户单击框时应采取的操作,以 TALES 格式(来自 Zope 页面模板系统,用于 Web 模板)表示,通常指向 URL。

  • 按钮应可见的(可选)条件。例如,“粘贴”按钮应仅在当前剪贴板中有有效信息时出现,条件在 TALES 中表示为 folder/cb_dataValid。

  • 用户必须拥有才能看到此按钮的权限。例如,如果某个操作具有“查看”权限,则任何授权用户都可以看到操作框并能够单击它。相比之下,如果某个操作具有“修改文件夹内容”权限,则只有授权修改内容的用户才能看到该操作的按钮框。

  • 按钮应放置的类别,例如 portal_tabs(显示在屏幕顶部)或 object_tabs(在屏幕顶部)。

  • 最后,我们可以通过单击和取消选中复选框来显示或隐藏操作。

添加、删除和修改操作非常容易。但是,如果我们想要添加、删除或移动 Plone 站点左右两侧显示的 portlet 怎么办?这些项目在 Plone 中被称为插槽 (slots),它们通过修改 Plone 实例本身的属性进行自定义。也就是说,您必须单击您创建的 Plone 实例(在本例中为 atf),然后单击页面顶部的“属性”选项卡。

left_slots 和 right_slots 属性决定了侧边显示的内容。如果您最近安装了 Plone 实例,您会立即注意到每个插槽包含的行数多于屏幕顶部显示的插槽数。这是因为只有在有内容要显示时才会显示 portlet。例如,如果没有定义当前事件,Plone 就根本不会显示您的事件 portlet。因此,left_slots 的第三行中命名的 portlet 可能会显示为第一、第二或第三个,具体取决于第一和第二个是否包含任何当前内容。

在我自己的站点上,我能够通过简单地修改 left_side 和 right_side 属性的定义,将事件列表移动到左侧,将日历移动到右侧(并完全删除登录 portlet)。进行这些类型的更改既简单又快速,它们允许您仅在您的站点上包含您想要的功能。

最后,单击 ZMI 在您的 Plone 实例中显示的 portal properties 链接。它有一个 Plone 图标,而不是扳手图标,表明此工具是 Plone 特有的,而不是 CMF 中普遍可用的。单击此链接会弹出一个包含四个不同属性列表的列表(form_properties、navigation_properties、navtree_properties 和 site_properties),每个列表都允许我们更改 Plone 站点上的某些属性。

如果您单击 site_properties,列表可能会显得非常熟悉。这是因为 site_properties 列出了许多我们之前看到的相同设置。Plone 本身仅公开最常见和必要的设置;更复杂和高级的设置可通过 ZMI 获得。例如,从 ZMI 或 Plone 设置页面更改日期格式实际上并不重要;无论在哪种情况下,站点都会立即更改以反映新值。

自定义皮肤

通过更改属性定义和使用 ZMI,我们可以修改相当多的 Plone 站点内容。但是,如果您真的想更改 Plone 站点,则需要修改系统附带的页面模板 (ZPT)。说起来容易做起来难。默认的 ZPT 存储在文件系统中,例如 $ZOPE_ROOT/lib/python/Products/CMFDefault/skins(用于 CMF 内容)和 $ZOPE_ROOT/lib/python/Products/CMFPlone/skins/(用于 Plone 内容)等目录中。修改这些目录中的皮肤会影响所有 Plone 实例,这不是您想要的。

Plone 考虑到了这种可能性,并允许您将一个或多个 ZPT 复制到 Zope 的对象数据库 (ZODB) 中,您可以在其中像编辑任何其他 ZPT 一样编辑它。例如,在 ZMI 中,进入 portal_skins 工具,然后进入 portal_skins 中的 plone_templates 文件夹。plone_templates 看起来像一个普通的 Zope 文件夹(除了图标不同),但它反映的是磁盘上文件的内容,而不是 ZODB 中的内容。plone_templates 包含您在 Plone 中看到的大多数页面的 ZPT。plone_templates 中的 ui_slots 文件夹包含确定 portlet 外观的 ZPT。

如果您想修改 Plone 站点中每个页面顶部出现的页眉,您可以单击页眉图标。这将带您到一个页面,您可以在其中查看但不能修改页眉页面模板。为了修改页眉,您必须将其导出到 custom 文件夹,该文件夹仅存在于 ZODB 中。单击“自定义”,您可以看到 URL 已挂起在 ZMI 中,现在您位于 portal_skins/custom 中,而不是 portal_skins/plone_templates 中。此 custom 文件夹是所有自定义模板的中央存储库,您可以像编辑系统上的任何其他 ZPT 一样编辑它们。由于 custom 文件夹特定于 Plone 的每个实例,因此您可以确保您所做的任何更改只会影响您正在处理的内容。

如果说有什么值得注意的,那就是浏览页眉和页脚页面模板,看看为了确保 Plone 可以在不同的浏览器上工作而完成的大量自定义工作,主要是使用 JavaScript。考虑到每个浏览器对 CSS 和 JavaScript 的支持都有些不同,看到 Plone 作者为尽可能保持事物水平一致所付出的巨大努力,真是令人印象深刻。

当然,这意味着您可能会遇到一两个惊喜。我的父亲直到最近还在使用 Netscape 4,他称赞我的新网站,并批评他不使用更现代的浏览器。由于我长期以来一直使用最新版本的 Mozilla 和 Galeon,我从未见过此消息;我从未想到会出现这样的消息。如果每个应用程序都能如此聪明和认真地检查跨平台兼容性,那么 Web 将会变得更好。

结论

Plone 可能是使用 Zope 的 CMF 编写的最著名和最流行的应用程序,它功能强大且易于自定义。在 Plone 特有的自定义屏幕、我们可以使用 ZMI 进行的更改以及通过将页面模板导入到 ZODB 中的 custom 文件夹来进行的修改之间,我们可以在很多方面进行更改。我们还可以向 Plone 添加新的自定义皮肤,从而为发行版中已经有趣且多样的选项做出贡献。

当然,Plone 只是使用 Zope 的 CMF 构建的一个应用程序。下个月,我们将剥离另一个抽象层,直接查看 CMF,看看我们可以使用它创建哪些类型的应用程序。您将看到,CMF 吸引了 Zope 社区以及 Zope Corporation 本身的大量关注是有充分理由的。

资源

Reuven M. Lerner (reuven@lerner.co.il) 是一位专门从事开源 Web/数据库技术的顾问。他和他的妻子 Shira 最近庆祝了他们的第二个女儿 Shikma Bruria 的诞生。Reuven 的著作《Core Perl》于 2002 年初由 Prentice Hall 出版,第二本关于开源 Web 技术的书将于 2003 年由 Apress 出版。

加载 Disqus 评论