2013-02-04 71 views
1

我有一個老式的產品有幾個類。在課堂上,我已經定義了meta_type,我也註冊他們__init__.py,即:zmi:重複添加產品列表

def initialize(context): 
    context.registerClass(
     ClassA.ClassA, 
     permission = "Add ClassA", 
     constructors = (ClassA.manage_addClassA, 
         ClassA.manage_addClassA), 
     icon = 'www/images/ClassA.gif' 
    ) 

,直到我從2.9更新了我的Zope 2.13這工作得很好。現在在zmi中,在「添加產品」下拉列表中,這些meta_types分別顯示兩次。

我試圖跟蹤此錯誤的來源:

  1. ObjectManager.py,filtered_meta_types
  2. ObjectManager.py,all_meta_types
  3. GETATTR(產品信息, 'meta_types',())

現在我不知道下一步要看的地方:)

這只是一個滋擾,它不會導致產品功能的任何問題。也許我應該更新它到一個新的zope產品,但我很好奇這個錯誤來自哪裏。

+0

確實好奇;我自己沒有見過。是否有一個帶'five:registerPackage'指令的'configure.zcml'文件? –

+0

感謝Martijn,它做到了:我只需要在configure.zcml中註釋掉它,重複就消失了。它沒有反過來:在'__init __。py'中註釋掉兩個重複項。也許你想發佈解決方案,以便問題被標記爲回答? :) – Rastaf

+0

你走了;擴展解釋爲什麼*你的初始化器被調用兩次。 –

回答

1

您需要從configure.zcml文件中刪除您的<five:registerPackage />註冊,因爲您的舊版軟件包使用Products.命名空間。

命名空間Products.一直自動加載; initialize(context)函數隱式地爲該名稱空間加載,因爲在它是官方名稱空間之前。

當Zope的開始支持包Products.命名空間,但是,在作出決定(聰明),使登記明確,而不是和<five:registerPackage />引入讓你使用舊的註冊掛鉤,如果你仍然需要它。

然而就你而言,這意味着你的initialize()函數被調用兩次;一次是因爲它是一個Products.包,一次是因爲你明確地註冊了它。