我正在研究插件及其模式扩展程序、接口、适配器、提供程序。。。但我找不到如何扩展扩展模式。我会更好地解释我的情况:
我有三个加数:L,H和V,其中L是"基本"加数。所以H依赖于L的内容类型,因为它是L的扩展。内容扩展是使用prototypes.schemaextender包进行的。
现在我想实现V,它应该是H的扩展,以实现以下结构:
L→H→V
Addon"L":
此插件的内容类型定义为类Batch(ATFolder)。这个插件也有自己的模式和接口标记IcontentA。
批次.py
class Batch(ATFolder):
implements(IBatch)
schema =....
接口.py
class IBatch(Interfaces)
Addon"H">
这个插件从L中获得内容类并将其扩展为
批次.py
from archetypes.schemaextender.interfaces import IOrderableSchemaExtender
class BatchSchemaExtender(Object):
adapts(IBatch)
implements(IOrderableSchemaExtender)
配置.zcml
<adapter factory=".batch.BatchSchemaExtender " />
好的,现在我想用另一个插件来扩展内容的模式。我做过类似的事情:
Addon"L":
批次.py
class Batch(ATFolder):
implements(IBatch)
schema =....
接口.py
class IBatch(Interfaces)
Addon"H">
批次.py
from archetypes.schemaextender.interfaces import IOrderableSchemaExtender
class BatchSchemaExtender(Object):
adapts(IBatch)
implements(IOrderableSchemaExtender, IBatchH)
配置.zcml
<adapter factory=".batch.BatchSchemaExtender”
provides=”archetypes.schemaextender.interfaces.IOrderableSchemaExtender" />
接口.py
class IBatchH(Interface)
Addon"V":
批次.py
from archetypes.schemaextender.interfaces import IOrderableSchemaExtender
class BatchV(Object):
adapts(IBatchH)
implements(IOrderableSchemaExtender, IbatchV)
接口.py
class IBatchV(Interface)
配置.zcml
<adapter
for="L.interfaces.IBatch"
provides="archetypes.schemaextender.interfaces.IOrderableSchemaExtender"
factory=".batch.BatchV"
/>
正如你所期望的那样,它不起作用。。。但我不知道是否有可能扩展一个扩展类。我必须指出,每个类都有自己的init
、getFields
和getOrder
函数。如果我更改V插件上的自适应定义,我会得到一个错误。V插件中的每个函数都有一个`pdb.set_trace()定义,但实例不会停止。。。
编辑时间:我在这封邮件中发现:"你不能覆盖覆盖。你唯一的希望可能是z3c.unconfigure:
http://pypi.python.org/pypi/z3c.unconfigure">
为单个内容类型注册多个schemaextenders应该可以正常工作;我认为你在V的注册不正确。
在V中,你说
<adapter
for="L.interfaces.IBatch"
provides="archetypes.schemaextender.interfaces.IOrderableSchemaExtender"
factory=".batch.BatchV"
/>
相应的类有一行:
自适应(IBatchH)。
这可能是
adapts(L.interfaces.IBatch)
如果Plone启动时存在任何配置冲突,则需要向其他注册添加name="something_unique"以消除冲突。