ATBlobの継承(SchemaExtender)

 やり方が分かったので、メモしておく。

FileFieldが出なかった原因

 FileFieldが表示されなかったのは、ATBlobクラスのスキーマ定義に含まれていなかったから。Plone4でカスタムコンテンツタイプ作ろうと思ったらハマった(その2) に書いたように、FileFieldは、SchemaExtenderという仕組みを使って、後から追加されている。

ATBlobと同じ仕組みでFileFieldを追加

 ということで、カスタムコンテンツタイプにも同じ仕組みを使ってやればよい。

具体的には、アドオンのconfigure.zcmlに、次のようなディレクティブを記述する。
 

  <adapter
    for=".interfaces.mycontenttype.IMyContentType"
    factory="plone.app.blob.subtypes.file.SchemaExtender" />


カスタムコンテンツタイプを作る際には、通常、そのコンテンツタイプに対応するInterfaceを作成するので、それを"for"属性にセットする。

  .interfaces.mycontenttype.IMyContentType


そして、カスタムコンテンツタイプに適用したいSchemaExtenderを、"factory"属性にセットする。plone.app.blobでは、File、Imageそれぞれに SchemaExtenderが定義されている。ここでは、File用のSchemaExtenderを使う。

    plone.app.blob.subtypes.file.SchemaExtender


この状態でPloneを再起動してアドオンをインストールすれば、IMyContentTypeインタフェースをimplementしているコンテンツに、file.SchemaExtenderが自動的に適用され、FileFieldが表示されるようになる。