關於建立 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”。有了它,你可以註冊配置檔案,將檢視繫結到介面等等。實際上,它應該有一個自己的主要章節和每個目錄的子章節,稱為 profileskinsbrowsercontent