[7]構造を持たないフォルダ
設計としてはフォルダであって,ユーザにはフォルダのように見えないフォルダを利用したいことがあるでしょう。RichDocumentがそのようなフォルダの好例です。
RichDocumentは「コンテナ」として振る舞うことができるので,ファイルや添付ファイルを内部に設置できます。RichDocumentはOrderedBaseFolderを継承しています。しかし,ユーザに取ってはフォルダであるように見えません。
Plone 2.1のフォルダには,ユーザインターフェース上の機能がいくつか追加されています。
- 「コンテンツ」タブ(Plone 2.0とは違い,Plone 2.1ではフォルダでないオブジェクトには「コンテンツ」タブはありません。「アクションメニュー」が新設され,利用する機会が減ったためです)
- 上位フォルダにオブジェクトを追加するメニューに代わり,フォルダに新規オブジェクトを追加する「新規アイテムを追加」メニューが採用された
- 親フォルダの「コンテンツタブ」を表示しているとき,フォルダをクリックすると,「コンテンツ」タブに遷移する
Ploneはis_folderishスクリプトを使って,オブジェクトが「フォルダ」であるかどうかをチェックします。object/is_folderish(および,オブジェクトに対応するカタログのメタデータ - このメタデータは,効率化のためにCMFPlone/CatalogTool.pyのExtensibleObjectIndexWrapperに実装されています)がTrueの場合,オブジェクトが「構造を持つフォルダ」であることを示します。ただし,ここで言う「フォルダ」とはユーザインターフェース上でフォルダに見える,という意味です。
デフォルトでは,CMFPlone/interfaces/NonStructuralFolder.pyに定義されているINonStructuralFolderマーカをインターフェースに持たない限り,すべてのフォルダは「構造」を持ちます。RichDocumentはこのマーカをインターフェースに持っています:
__implements__ = ATDocument.__implements__ + (IRichDocument, INonStructuralFolder,)
このようにすると,フォルダはフォルダでないように振る舞います。
また,RichDocumentではフォルダ内部のオブジェクトが「デフォルトビュー」になることはないため,ISelectableBrowserDefaultに定義されているcanSetDefaultViewという関数を利用して,デフォルトビューを設定出来ないようにしています:
def canSetDefaultPage(self):
return False
以下のURLにあるHow Toの翻訳です。
http://plone.org/documentation/tutorial/richdocument/nonstructual-folders