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.'

(これはforInterface、plone.registry READMEで説明されているように、メソッドに期待されます。レコードはありません。)

もちろん、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)

ただし、アップグレード手順を作成することをお勧めします(もちろん、ユーザーは製品を再インストールする必要があります)。

upgrades.py:

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

upgrades.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

forInterface の 2 番目のパラメーターとして False を渡す場合:

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 に答える