4

在 Plone 附加产品中,我有一个控制面板页面,可以在其中设置一些配置选项。它们存储在 plone.registry 中。__init__控制面板适配器通过查询接口来获取其方法中的不同字段,例如:

class MultiLanguageExtraOptionsAdapter(LanguageControlPanelAdapter):
    implementsOnly(IMultiLanguageExtraOptionsSchema)

    def __init__(self, context):
        super(MultiLanguageExtraOptionsAdapter, self).__init__(context)
        self.registry = getUtility(IRegistry)
        self.settings = self.registry.forInterface(
            IMultiLanguageExtraOptionsSchema)

现在我在接口 IMultiLanguageExtraOptionsSchema 中添加一个附加字段并重新启动 plone。然后在控制面板页面上出现错误:

KeyError: 'Interface `plone.app.multilingual.interfaces.IMultiLanguageExtraOptionsSchema` defines a field `blah`, for which there is no record.'

(如 plone.registry README 中所述,这对于方法是预期的forInterface。该记录不存在。)

当然,如果我通过 GenericSetup (registry.xml) 添加该字段,然后重新安装产品/重新运行“控制面板”步骤,一切都很好:

<registry>
 <records interface="plone.app.multilingual.interfaces.IMultiLanguageExtraOptionsSchema">
   <value key="blah"></value>
 <records>
<registry>

但我不想强迫用户重新安装产品,仅仅因为产品特定的控制面板中有一个新选项。所以我的问题是:有没有推荐的方法来获取新字段的新记录到 plone.registry 中?

4

3 回答 3

7

您可以尝试/捕获 KeyError,然后确保已注册所有注册表设置:

try:
    self.settings = self.registry.forInterface(IMultiLanguageExtraOptionsSchema)
except KeyError:
    registry = getUtility(IRegistry)
    registry.registerInterface(IMultiLanguageExtraOptionsSchema)

不过,我建议编写一个升级步骤(这当然会迫使您的用户重新安装产品)。

升级.py:

def update_registry(context):
    registry = getUtility(IRegistry)
    registry.registerInterface(IMultiLanguageExtraOptionsSchema)

升级.zcml::

  <genericsetup:upgradeStep
      source="*"
      destination="1100"
      title="Update plone.app.multilingual setting registry"
      description=""
      profile="plone.app.multilingual:default"
      handler=".upgrades.update_registry"
      />

https://github.com/collective/collective.mailchimp/blob/master/collective/mailchimp/upgrades.py

https://github.com/collective/collective.mailchimp/blob/master/collective/mailchimp/upgrades.zcml

例如。

于 2013-03-12T17:46:04.947 回答
5

如果将 False 作为第二个参数传递给 forInterface:

registry.forInterface(IMultiLanguageExtraOptionsSchema, False)

那么如果注册表中缺少架构中的字段,它将不会引发错误,而只会返回该字段的默认值。

于 2013-03-13T05:45:55.290 回答
2

从注册表安全获取设置:

def get_registry_settings(interface, name):
    registry = getUtility(IRegistry)
    settings = registry.forInterface(interface, check=False)
    value = getattr(settings, name)
    if value == settings.__schema__[name].missing_value:
        value = settings.__schema__[name].default
    return value
于 2013-09-20T14:31:46.803 回答