plone.registry - 当 IRecordModifiedEvent 被触发时,如何捕获注册表中的更改?

plone.registry - How do I capture a change in registry when IRecordModifiedEvent is fired?

我正在尝试复制一个示例,该示例在应该触发 IRecordModified 时检测注册表中的更改。

https://pypi.python.org/pypi/plone.app.registry#registry-events

我尝试使它适应我正在做的事情,但我放置的打印语句没有触发。

在我的registry.xml

<registry>
    <records interface="my.product.utils.db_settings.IDBSettings">
</registry>

在我的events.py

from my.product.utils.db_settings import IDBSettings

@adapter(IDBSettings, IRecordModifiedEvent)
def detectDBSettingsChange(settings, event):
    print "detectDBSettingsChange"

在包含控制面板的模块 db_settings.py 中,我有: 来自 plone.app.registry.browser 导入控制面板

class IDBSettings(Interface):
    db_string = schema.TextLine(title=u"Database String",
                                description=u"String for database connection",
                                default=u"Some value"
        )

class DBSettingsEditForm(controlpanel.RegistryEditForm):
    schema = IDBSettings
    label = u"Database settings"
    description = u"String setup"

    def updateFields(self):
        super(DBSettingsEditForm, self).updateFields()


    def updateWidgets(self):
        super(DBSettingsEditForm, self).updateWidgets()

class DBSettingsControlPanel(controlpanel.ControlPanelFormWrapper):
    form = DBSettingsEditForm

在我的 configure.zcml 实用程序中:

<include package="plone.app.registry" />
<browser:page
         name="database-settings"
         for="Products.CMFPlone.interfaces.IPloneSiteRoot"
         class=".db_settings.DBSettingsControlPanel"
         permission="cmf.ManagePortal"
         />

当我进入控制面板,更改值,然后保存时,detectDBSettingsChange 似乎不起作用,因为打印语句被忽略了。我是否处理了错误的事件来捕获注册表中的更改?

我认为您需要 docs. I'm not sure that the adapter in your events.py is sufficient. Perhaps you can use provideHandler Method like described in plone.registry

中描述的订阅者

您需要添加订阅者并像这样在您的 configure.zcml 文件中注册:

<configure xmlns="http://namespaces.zope.org/zope">

  <subscriber
      for="plone.registry.interfaces.IRecordModifiedEvent"
      handler="your.package.your_subscriber"
      />

</configure>

检查这个collective.fingerpointing package for a working example