关于创建 Plone 插件的故事
前言
TL; TR:为了说明目的,本文件以“TL; TR:”开头的行后面是命令行,参考鸡蛋’adi.devgen’的 Plone-helper-scripts。如果执行’TL; TR:‘之后给出的命令,它将创建下一章解释的所有文件。有许多替代的辅助脚本工具,但是如果你想使用这个工具,你可以像命令行一样快速安装它:
pip install adi.devgen
最小的 Plone-Add-on 的结构
TL; TR:devgen addBase mynamespace.myaddon
就像 Plone 包含 200 多个 Python-egg 一样,Plone-Add-On 也是一个 Python-egg,而 egg 是一个命名空间的 Python 模块。任何一个鸡蛋都可供 ZOPE 的 Python 解释器使用。为了在 Plone 站点中安装一个 egg,它还需要一个所谓的 profile
。以下将解释这些术语。
Python 的模块
Python 模块是一个目录,其中至少包含一个必须命名为 __init__.py
的文件。该名称是 Python 解释器将该目录识别为模块的标志,意味着其路径可以导入其他 Python 脚本,例如假设我们有一个名为’myaddon’的目录,其中包含一个名为’myfile’的文件,该文件包含一个名为’myDefinition’的定义,你可以导入另一个 Python 文件的定义,如下所示:
from myaddon.myfile import myDefinition
Python 的蛋
Python-egg 是一个命名空间的 Python 模块,命名空间可以是任何名称,但最好不要采用它,以防你想与世界分享你的附加组件。
命名空间的原因最重要的是排除两个或多个模块可能具有相同名称的可能性(在此示例中称为 myaddon
),因为当 Python 脚本尝试导入路径时会导致冲突,而不是唯一的了。
在继续详细解释其目的之前,以下是目录结构和所涉及文件的概述:
mynamespace.myaddon
setup.py
mynamespace
__init__.py
myaddon
__init__.py
myfile.py
要为加载项命名空间,首先要创建一个名为“mynamespace.myaddon”的目录。
该目录必须包含’setup.py’文件,它使 egg 可以注册到 ZOPE 实例的 Python 解释器,这将在下一章[TODO]中进一步解释。
然后,在该目录中,创建另一个以命名空间命名的目录:‘mynamespace’现在,我们通过在其中添加关键字命名文件 __init__.py
,使该目录成为可导入的模块路径。它还必须包含以下行,这些行使命名空间魔法发生,在最后一段中解释:
[TODO: namespace-magic-lines]
Phew 差不多完成了,最后在这个新目录中我们放了上一章的模块:目录’myaddon’,包含’ init .py’和’myfile.py’以及’myDefinition’。
现在我们为 ZOPE 实例提供了一个可注册的蛋,并且可以使用此路径表示法引用其任何其他已注册蛋的方法:
from mynamespace.myaddon.myfile import myDefinition
你可能会看到魔术,前两个目录被省略,它不是 :
from mynamespace.myaddon.mynamespace.myaddon.myfile import myDefinition
Python 的解释
[去做:
- 解释 setup.py
- 添加前一章关于 buildout(=安装 Plone)以供参考。 ]
在 Plone 站点中安装插件
个人资料会使加载项显示在网站的附加组件控制面板上,因此管理员可以(在此处)为该网站激活它。
另外,由于 Plone-site 始终是 ZOPE-instance 的子代,而 ZOPE-instance 可以包含多个站点,我们可能不希望在其他 Plone 站点中安装我们的附加组件的无意识组件,因此我们将它们绑定到配置文件’。
TL; TR:devgen addProfile mynamespace.myaddon
这引出了我们真正有趣的部分,ZOPE-Component-Architecture,由以“.zcml”结尾的文件控制,代表“ZOPE-Component-Markup-Language”。有了它,你可以注册配置文件,将视图绑定到接口等等。实际上,它应该有一个自己的主要章节和每个目录的子章节,称为 profile
,skins
,browser
和 content
。