2

アドオンとそのスキーマ エクステンダー、インターフェイス、アダプター、プロバイダーについて調査していましたが、拡張スキーマを拡張する方法がわかりません。私は自分の状況をよりよく説明します:

L、H、V の 3 つのアドオンがあります。ここで、L は「ベース」アドオンです。つまり、H は L の拡張であるため、L のコンテンツ タイプに依存します。コンテンツ拡張は、archetypes.schemaextender パッケージを使用して作成されました。

V を実装したいのですが、次の構造を実現するには H を拡張する必要があります。

L → H → V

アドオン「L」:

このアドオンには、クラス Batch(ATFolder) として定義されたコンテンツ タイプがあります。このアドオンには、独自のスキーマとそのインターフェイス マーカー IcontentA もあります。

バッチ.py

class Batch(ATFolder):
    implements(IBatch)
    schema =....

インターフェイス.py

class IBatch(Interfaces)

アドオン「H」</h2>

このアドオンは、L からコンテンツ クラスを取得し、それを拡張します。

バッチ.py

from archetypes.schemaextender.interfaces import IOrderableSchemaExtender

class BatchSchemaExtender(Object):
    adapts(IBatch)
    implements(IOrderableSchemaExtender)

configure.zcml

<adapter factory=".batch.BatchSchemaExtender " />

さて、コンテンツのスキーマを別のアドオンで拡張したいと思います。私は次のようなことをしました:

アドオン「L」:

バッチ.py

class Batch(ATFolder):
    implements(IBatch)
    schema =....

インターフェイス.py

class IBatch(Interfaces)    

アドオン「H」</h2>

バッチ.py

from archetypes.schemaextender.interfaces import IOrderableSchemaExtender

class BatchSchemaExtender(Object):
    adapts(IBatch)
    implements(IOrderableSchemaExtender,  IBatchH)

configure.zcml

<adapter factory=".batch.BatchSchemaExtender”
provides=”archetypes.schemaextender.interfaces.IOrderableSchemaExtender" />

インターフェイス.py

class IBatchH(Interface)

アドオン「V」:

バッチ.py

from archetypes.schemaextender.interfaces import IOrderableSchemaExtender

class BatchV(Object):
    adapts(IBatchH)
    implements(IOrderableSchemaExtender,  IbatchV)

インターフェイス.py

class IBatchV(Interface)

configure.zcml

<adapter
    for="L.interfaces.IBatch"
    provides="archetypes.schemaextender.interfaces.IOrderableSchemaExtender"
    factory=".batch.BatchV"
    />

ご想像のとおり、うまくいきません...しかし、拡張クラスを拡張できるかどうかはわかりません。各クラスには独自のinit,getFieldsおよびgetOrder関数があることに注意する必要があります。V アドオンのadapts 定義を変更すると、エラーが発生します。V アドオン内の各関数には `pdb.set_trace() 定義がありますが、インスタンスは停止しません...

編集: 私はこのメールを見つけました:

http://pypi.python.org/pypi/z3c.unconfigure "

4

1 に答える 1

2

1 つのコンテンツ タイプに対して複数の schemaextender を登録すると、期待どおりに機能するはずです。あなたの V への登録は間違っていると思います。

あなたが言うVで

<adapter
    for="L.interfaces.IBatch"
    provides="archetypes.schemaextender.interfaces.IOrderableSchemaExtender"
    factory=".batch.BatchV"
/>

対応するクラスには次の行があります。

適応します(IBatchH)。

これは可能性があります

adapts(L.interfaces.IBatch)

Plone の起動時に設定の競合がある場合は、競合を取り除くために name="something_unique" を追加の登録に追加する必要があります。

于 2015-04-21T12:23:27.280 に答える