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が表示されるようになる。