[12]フォルダリスティングを表示する
パフォーマンスを考慮しつつ,フォルダの中のオブジェクトをリスト表示する方法について解説します
特に必要もないのにフォルダ内のオブジェクトを全部読み込むような処理をすると,Ploneサイトのパフォーマンスは著しく下がります。かつての「ナビゲーションツリー」が同様の処理をしており,Ploneのパフォーマンスを下げていました。Plone 2.1では,ExtendedPathIndexが導入され,このようなことがなくなりました。
フォルダの中にあるオブジェクトを取得する際には,contentValues() (または,もっと悪いケースではobjectValues()) 関数を呼び出す代わりに,カタログに対して問い合わせをすべきです。ExtendedPathIndexのおかげで,パスを引数に渡して,特定のフォルダの下にあるオブジェクトだけを取得することが出来るようになりました。また,「順番付きフォルダ(ordered folders)」の内部のオブジェクトも取得できます。
フォルダ内のオブジェクト一覧を得るためには,以下のようにします:
catalog = getToolByName(self, 'portal_catalog')
results = catalog.searchResults(path = {'query : '/'.join(self.getPhysicalPath()),
'depth' : 1,}
sort_on = 'getObjPositionInParent',
)
Page Templateやスクリプトからフォルダ内のオブジェクトを取得するためには,getFolderContentsというスクリプトを使うのが簡単でしょう。 RichDocumentでは,ウィジェットとビューの中のフォルダ内のオブジェクトを取得する必要がある場所でこのスクリプトを使っています。getFolderContentsは以下のパラメータを指定して呼び出します:
contentFilter
カタログのクエリに渡す追加のパラメータを辞書で指定します。たとえば,RichDocumentはcontentFilter={portal_type : (FileAttachment,)}のようなパラメータを渡して,widget_attachmentsmanagerでFileAttachmentだけを表示しています。
batch および b_size
Ploneの「バッチマクロ」を使う場合に渡します。folder_listingというテンプレートを参考にして下さい。
full_objects
カタログが返すカタログオブジェクトの代わりに,オブジェクトの実体を取得したい場合にTrueを渡します。パフォーマンス的には不利になりますが,必要な場合もあるでしょう。たとえば,カタログオブジェクトでは縮小された画像を表示できないので,richdocument_view_previewでこのオプションを利用しています。画像データを取得するためには,Zopeはいずれにしろオブジェクトの実体を取得しなければならないため,たいした問対にはならないはずです。
以下のURLにあるHow Toの翻訳です。
http://plone.org/documentation/tutorial/richdocument/folder-listings