直到现在我们也只是在提高留言薄的性能,而对它的用户界面并没做太多的改善。实际上,我们一直用 ZMI 来进行所有的留言薄管理,这对最终用户来说是完全不适合的。因此本章将专注于开发一个皮肤以便为留言薄实现用户界面,就象我们所看到的现实中的留言薄应用程序。尽管该包需要一点 Python 开发,但我认为这对于我们两个内容组件部分都可以说是个好的任务。
皮肤(等同于 Zope 2 中的 CMF)是一个用来实现对一个已存在的视图自定义界面的方法。这非常类似于 HTML 和 CSS(层级式样式表),对于 HTML 代码来说视图(页面模板,视图类)和样式表(CSS)就相当于在 HTML 结构元素上的皮肤。然而皮肤之下是有另一个抽象层的。
皮肤实际上是个层的堆栈。每一个层都包含了一些视图和资源。这样就可以让特定的视图和资源失效。举个例子,我们的样式表(CSS)也许定义在缺省层。然而,该样式表对于我们的需要来讲实在是太简单、太不适合了。所以我们可以创建一个新的层 board 并将一个新的样式表放在那里。当完成之后,我们定义一介在在缺省层后 board 层的皮肤,然后所有新的样式定义就会生效。
步骤 I: 准备
在我们创建新皮肤之前,我们需要做些准备。为了不同原来的视图和资源混淆,我们在 messageboard/browser 目录中创建一个名为 skin 的包;不要忘记生成 `init.py` 文件。然后创建一个空的 configure.zcml 文件:
1&">nbsp; <configure
2 xmlns="http://namespaces.zope.org/browser">
3
4 </configure>
现在用下面的语句将该配置导入到浏览器的 configure.zcml 中:
1 <include package=".skin" />
步骤 II: 创建一个新的皮肤
创建一个新的皮肤是非常容易的,用 ZCML 配置语句就可以完全实现。浏览器名字空间有个叫 skin 语句就可以让我们完成,因此添加下列语句到 skin 包的配置文件中:
1 <layer name="board"/>
2
3 <skin name="board" layers="board rotterdam default" />
第一个语句创建一个新的层,在那里我们将放入所有的新模板并生成唯一的皮肤。第二个语句创建一个名为 board 的皮肤,由三个元素层堆栈组成。最底的层是缺省层,被 rotterdam 覆盖,而它又被 board 覆盖。
你也许奇怪为什么 rotterdam 层会放在这里。rotterdam 层包含一些比较好的定义,象 favicon 和其他一些对我们也很有用的视图代码。除此之外,我们不会经常使用这个层。