後台開發:設計configlet

在plone中,後台的設定版面,稱為configlet,以下直接以範例來示範如何設計一個configlet

1.先開一個browserview, 在configure.zcml中,加入以下一段

  <browser:page
    name="mysiteClassSettingControlPanel"
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    permission="cmf.ManagePortal"
    class=".userdataschema.MysiteClassSettingControlPanelView"
    />

說明:

name: 網址的一部份

for: 設定是plone站點使用

permission: 設定權限,因為是後台,所以理當是cmf.ManagePortal

class: 看這個view會放在那裏,以本例,是放在 userdataschema.py裏面

2. 設計 interfaces 及 form

from plone.app.registry.browser.controlpanel import RegistryEditForm
from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper

from plone.z3cform import layout
from z3c.form import form
from plone.directives import form as Form

class IMysiteClassSetting(Form.Schema):
    classSetup = schema.Text(
        title=_(u"Class setup"),
        required=False,
    )


class MysiteClassSettingControlPanelForm(RegistryEditForm):
    form.extends(RegistryEditForm)
    schema = IMysiteClassSetting

MysiteClassSettingControlPanelView = layout.wrap_form(MysiteClassSettingControlPanelForm, ControlPanelFormWrapper)
MysiteClassSettingControlPanelView.label = _(u"Mysite class setting")

3.編輯 profiles/default/controlpanel.xml ,內容如下

<?xml version="1.0"?>
<object
    name="portal_controlpanel"
    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
    i18n:domain="mysite.userdata">

    <configlet
        title="Mysite class setup"
        action_id="ysite.userdata.classsetting"
        appId="mysite.userdata"
        category="Products"
        condition_expr=""
        url_expr="string:${portal_url}/@@mysiteClassSettingControlPanel"
        icon_expr="string:/favicon.ico"
        visible="True"
        i18n:attributes="title">
            <permission>Manage portal</permission>
    </configlet>

</object>

4.編輯 profiles/default/registry.xml,內容如下

<registry>
  <records interface="mysite.userdata.userdataschema.IMysiteClassSetting" />
</registry>

完成,接著重新啟動網站,再到後台「擴充模組」將該模組重新安裝一次,即可見到成果

接下來,如果要在程式中使用到後台的設定值,可以如下方式

python code,最簡單的方式是使用plone.api,如下:

from plone import api
api.portal.get_registry_record('mysite.userdata.userdataschema.IMysiteClassSetting.classSetup')

 若是在 template的 .pt檔中,則可使用TAL語法,如下:

python:context.portal_registry['mysite.userdata.userdataschema.IMysiteClassSetting.classSetup']

 

註:本篇範例中,classSetup,或mysiteClass,其中的class, 指的是課程,與類別(class)無關,請讀者細察。