2013-03-12 31 views
4

,我有一個控制面板頁面,可以在其中設置一些配置選項。它們存儲在plone.registry中。向plone.registry添加新記錄而不重新運行GenericSetup /在Plone附加產品中重新安裝產品

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的:控制面板適配器通過查詢界面,就像在獲取其__init__方法的不同領域。控制面板上的頁面我然後一個錯誤:

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

(這是預期爲forInterface方法中,作爲在plone.registry自述描述的記錄是不存在。)

當然,如果我通過GenericSetup(registry.xml)加入該域,然後我重新安裝產品/重新運行「控制面板」的步驟,一切都很好:

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

但我不希望強迫用戶重新安裝產品,只是因爲產品特定的控制面板中有一個新選項。所以我的問題:是否有一個建議的方式獲得一個新的記錄到plone.registry的新字段?

回答

4

如果你傳遞false作爲第二個參數forInterface:

registry.forInterface(IMultiLanguageExtraOptionsSchema, False) 

那麼如果從架構字段從註冊表中缺少它會不會引發錯誤,但將簡單地返回該字段的默認值。

+0

謝謝,添加'check = False'可用於顯示控制面板。但試圖保存(=設置一個新值)將導致AttributeError。 我現在的解決方案:在控制面板適配器內的set_blah方法中,我檢查註冊中心是否已經有相關名稱的記錄,如果沒有,我創建一個plone.registry.Record()(如README)並將其保存爲默認值。這發生在從窗體('self.setting.blah = value')傳入的值的實際設置之前 – pysailor 2013-03-13 08:44:55

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

爲例。

+0

謝謝,我也想到了一個升級步驟,但恕我直言但從用戶的角度沒有太大的區別,以重新安裝。我只記得「糟糕的過去的日子」(pre plone.registry),當它很容易地添加新的設置並且在沒有嘗試/除外或用戶交互的情況下進行初始化時。 – pysailor 2013-03-12 19:43:05

+0

+1爲好的答案。 @pysailor:你是指皮膚文件夾嗎? – 2013-03-13 06:40:07

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 
相關問題