[6]アクションとエイリアス
標準化したアクションとメソッドのエイリアスでURLを標準化することができます。しかし、それらはPlone2.0で使われていた方法とは少し違った働きをします。古い方法でも機能しますが、新しい方法は、もっと柔軟でATContentTypesの使用には必要です。
Plone2.1依存しているCMF1.5は二つの関連ある概念、アクションとメソッドエイリアスがあります。アクションはポータルタブやドキュメントアクションのようなリンクを定義する方法です。ドキュメントアクションは、「印刷」と「送信」などを定義して、標準のドキュメントにアイコンを追加します。特に、オブジェクトとフォルダのカテゴリのアクションは、Ploneの画面では、緑色の「コンテンツタブ」として表示されます。標準のアクションは、「表示」、「編集」、「プロパティ」と「共有」です。
Plne2.0では、カスタムビューアクションの定義はコンテンツタイプのビューテンプレートを定義する標準的な方法でした。しかし、「動的ビュー」の章で見てきたように、Plone2.1では、default_viewとsuppl_views変数を使って、Plone2.0よりうまく処理できます。そして、CMFDynamicViewFTIは魔法でこれを処理します。
メソッドエイリアスの概念では、「編集」、「プロパティ」や(「共有」タブの)local_rolesのような他のアクションでさえ、タイプでアクションを再定義するのは基本的には悪い作法です。メソッドエイリアスは、 間接的に別のレベルでURLを標準化するための方法です。これは、/path/to/object/editに移動する場合、常に正しいテンプレートをオブジェクトの編集に使用します。
ATContentTypesとCMFDynamicViewFTIのBrowserDefaultMixinは標準的なアクションとエイリアスを定義しています。まれに追加のアクションが必要になったり、さらにまれに標準的なアクションを変更しなればならないことがあります。アクションとエイリアスをportal_typesのFTIの「アクション」タブと「エイリアス」タブから閲覧、編集ができます。これはアクションとエイリアス変数を使って、自分のタイプの定義も同様に処理します。
ATContentTypes/content/base.pyに定義されているように、標準アクションとエイリアスは次の用になります。
actions = ({
'id' : 'view',
'name' : 'View',
'action' : 'string:${object_url}',
'permissions' : (View,)
},
{
'id' : 'edit',
'name' : 'Edit',
'action' : 'string:${object_url}/edit',
'permissions' : (ModifyPortalContent,),
},
{
'id' : 'metadata',
'name' : 'Properties',
'action' : 'string:${object_url}/properties',
'permissions' : (ModifyPortalContent,),
},
...
{
'id' : 'local_roles',
'name' : 'Sharing',
'action' : 'string:${object_url}/sharing',
'permissions' : (ManageProperties,),
},
)
aliases = {
'(Default)' : '(dynamic view)',
'view' : '(selected layout)',
'index.html' : '(dynamic view)',
'edit' : 'atct_edit',
'properties' : 'base_metadata',
'sharing' : 'folder_localrole_form',
'gethtml' : '',
'mkdir' : '',
}
アクションがメソッドエイリアスのURLを解決する方法に気を付けてください。アクションはタブとしてレンダリングされます。タブをクリックした時にそのアクションのURLが呼び出されます。このため、「編集」アクションはstring:${object_url}/edit を指しています。つまり、/path/to/objectで「編集」をクリックした場合は、/path/to/object/editにナビゲートされます。/editはメソッドエイリアスとして解釈されます。このエイリアスは、ページテンプレートのatct_editを指していて、Zopeは/path/to/object/atct_editをレンダリングするようになります。
カスタムの編集フォームを定義する場合は、自分のクラスで次のようにします。
aliases = updateAliases(ATDocument,
{
'edit' : 'my_edit',
})
ユーティリティメソッドのupdateAliasesはATContentTypes/content/base.pyに定義されています。
特定のターゲット
CMFDynamicViewFTIは二つの特別なメソッドエイリアスのターゲットを追加します。
- (選択レイアウト)
- (動的ビュー)
気付いたかもしれませんが、(デフォルト)メソッドエイリアスは(動的ビュー)として使用します。このエイリアスは(正確に次のように定義して利用しなければなりません)、コンテンツオブジェクトにページテンプレート[1]で指定せずに、直接ナビゲートするときに起こることを定義します。つまり、URLで/path/to/objectを指定した時に、オブジェクトのコンテンツタイプに従った(デフォルト)エイリアスが見えて、選択されているレイアウト、または、デフォルトページでオブジェクトがレンダリングされます。これは、標準ビューアクションが string:${object_url} だけを指している理由でもあります。
ビューエイリアスは、(選択レイアウト)の集合を指しています。つまり、デフォルトページの選択の状態に関係なく /path/to/folder/view に移動した時にそのフォルダのビューが表示されるます。
ファイルコンテンツに関する注意
にリンクした場合は、オブジェクトのimage_view テンプレートを使用せずに画像を描画しなければなりません。これは、(デフォルト)エイリアスにindex_htmlを指定して、index_html()メソッドでファイルコンテンヌタイプではコンテンツをダンプするように定義します。
/viewエイリアスはPlone内でファイルを閲覧するために使用します。ビューアクションでは、共通の((デフォルト)エイリアス(string:${object_url} のみ)ではなく、このメソッドエイリアス(string:${object_url}/view)を指していなければなりません。また、「表示」タブをクリックした時にファイルコンテンツをダンプしないようにしなければなりません。つまり、ATContentTypes/content/base.pyのATFileContentを次のように設定します。
actions = updateActions(ATCTContent,
({
'id' : 'view',
'name' : 'View',
'action' : 'string:${object_url}/view',
'permissions' : (View,)
},
{
'id' : 'download',
'name' : 'Download',
'action' : 'string:${object_url}/download',
'permissions' : (View,),
'condition' : 'member', # don't show border for anon user
'visible' : False,
},
)
)
aliases = updateAliases(ATCTMixin,
{
'(Default)' : 'index_html',
'view' : '(selected layout)',
})
いくつかの箇所では、ファイルをダンプせずにPlone内部に表示するために、Ploneが/viewエイリアスにリンクしていることが重要です。portal_properties/site_propertiesのプロパティのtypesUseViewActionInListingsは、これらのタイプのリストを定義しています。RichDocumentのImageAttachmentとFileAttachementタイプは、ATImageとATFileを単純に拡張したものですが、次のように登録されていなればなりません。
propsTool = getToolByName(context, 'portal_properties')
siteProperties = getattr(propsTool, 'site_properties')
typesUseViewActionInListings = list(siteProperties.getProperty('typesUseViewActionInListings'))
if 'ImageAttachment' not in typesUseViewActionInListings:
typesUseViewActionInListings.append('ImageAttachment')
siteProperties.manage_changeProperties(typesUseViewActionInListings = typesUseViewActionInListings)
[1] PloneとCMFの以前のバージョンでは、これは、__call__()メソッドを呼び出した結果として使用されていました。このメソッドでビューアクションを検索して、フォルダを扱う場合、一般的にはあなたの人生を台無しにしてきました。