ワイルドなTypes Toolをてなづける
概要
PTK/CMFアーキテクチャへのかなり若い追加として、portal_typesツールはいくつかの重要な役割を担います。 この役割を理解することはCMFデベロッパやサイト構築者にとって、「禅」のキー・ピースとなります。
当初、typesツールは「クラシック」なPTKのWizardsフォルダのシンプルな代替物として計画されました。Wizardsは通常マルチページのフォームで、コンテント・オブジェクトやフォルダを構築するためにユーザーからメタデータやコンテントを集めるものでした。オブジェクトを構築するためにロジックを分離すること(Wizardでは、正しくはオブジェクトのクラスから)は、それを編集するために使われるロジックから(通常はクラス自身の中で)という意味ですが、メンテナンス性が貧弱なものになります。また、WizardsはThrough-The-Webオブジェクトとして配布されなければならなかったのです。それはPTK/CMFベースのサイトの更新時に痛みを伴うものでした。
types toolに格納されているtype informationオブジェクトのオリジナルバージョンは、シンプルなポリモーフィックなインターフェースを通してインスタンスを構築するのに必要なプロパティを少し持っています。
CMF Siteのためにaddable content typesのレジストリを作ったことは、他の役割を不要のものにしました。
portal_skinsツールを作ることでポータルワイドなUIコンポーネントでスキンすることに成功したので、我々はサイト構築者やアプリケーションデベロッパに特定のコンテントオブジェクトのためのUIコンポーネントをカスタマイズ可能にさせたくなりました。type informationオブジェクトは今度は論理的なactionsとそれを制御するskinメソッドの間でマッピングするための論理的なコンテナとなりました。
コンテントオブジェクトに関するポリシーの決定をそれらのクラスに埋め込むことは、そのようなオブジェクトを再利用することを難しくします。例えば、あるサイトのポリシーが(例えばコンテントをディスカッションの対象にできるかどうか)そのようなポリシーを上書きするためにサブクラス化することを強制され、それがうまく行かないような場合です。Type informationオブジェクトはそのような場合に素晴らしいpolicy configuration pointsを作ります。
1つ以上のtype informationオブジェクトは、同じ下位層に横たわるクラスをポイントできるので、異なる構築戦略や、UI、ポリシーセッティングを与えられても、type informationオブジェクトはサイト構築者にCMFのコンテントオブジェクトを複数の目的に利用させることができます。
このインターフェースを実装するオブジェクトは、CMFサイトの中でcontent type informationの中心的なレジストリとなります。
API:
# getType__roles__ = None # Public
def getTypeInfo( self, contentType ):
"""
Return an instance which implements the
ContentTypeInformation interface, corresponding
to the specified 'contentType'.
"""
# listTypeInfo__roles__ = None # Public
def listTypeInfo( self, container=None ):
"""
Return a sequence of instances which implement
the ContentTypeInformation interface, one for
each content type regisetered in the portal. If
the container is specified, the list will be
filtered according to the user's permissions.
"""
def constructContent( self, contentType, container, id ):
"""
Build an instance of the appropriate content
class in 'container', using 'id'.
"""
このインターフェースを実装するオブジェクトはファクトリとして機能したり、それがラップするクラスのコンフィギュレーションポイントとなります。
def Metatype( self ):
"""
Return the Zope meta_type for this content
object.
"""
def Type( self ):
"""
Return the "human readable" type name (note
that it may not map exactly to the meta_type,
e.g., for l10n/i18n or where a single content
class is being used twice, under different
names.
"""
def Description( self ): """ Textual description of the class of objects (intended for display in a "constructor list"). """
def isConstructionAllowed( self, container ):
"""
Does the user have the permission to construct
an instance of this type in container?
"""
def allowType( self, contentType ):
"""
Can objects of contentType be added to
containers whose type object we are?
"""
def constructInstance( self, container, id ):
"""
Build a "bare" instance of the appropriate type
in container, using id as its id. Return
the URL of its "immediate" view (typically the
metadata form).
"""
def allowDiscussion( self ): """ Can this type of object support discussion? """
def getActionById( self, id ): """ Return the URL of the action whose ID is id. """
def getIcon(self): """ Returns the portal-relative icon for this type. """
portal_typesインターフェースを実装するのに加えて、このタイプのインスタンスはObjectManagersです。それはtype informationオブジェクトの他にhelperオブジェクト(Pythonスクリプト)を保持します。それらは新しいtype informationオブジェクトを追加するためのUIやこれらのオブジェクトをZopeプロダクトにより登録されたデフォルトの値とともにポピュレートするためのサポートを提供します。(factory_type_informationプロトコルの実装を見て下さい。)
filter_content_types/allowed_content_types ... フォルダのようなものの場合、このtypeのオブジェクトは、その特定のtypeのコンテンツを制限するか?このクラスは、Zopeのproduct-dispatcher/factory-dispatcherメカニズムを直接呼ぶことにより、ContentTypeInformationインターフェースのオブジェクト構築部分を実装します。これらのtypeオブジェクトは設定がとてもシンプルで、Zopeプロダクトにより直接提供されるコンテント・オブジェクトを統合するためのとても簡単な方法を提供します。
このtypeのオブジェクトのクラスやファクトリーメソッドを保持するZopeプロダクトの名前。
manage_addProduct[ product ].factory( id )
呼出側が提供するならば、追加的な位置引数とキーワード引数が渡されます。 ScriptableTypeInformation? (STI)
コンストラクタメソッドやスクリプトを保護するパーミッション
インスタンスを構築するために呼ばれるメソッドやスクリプトへのトラバーサルパス。このメソッドは最低でも2つの引数(containerとid)を受け付けなければならず、すでにコンテナに追加されている、インスタンスを返さなければならず、それを中にラップします。
Using Scriptable Type Information type objects How-toも見て下さい。
このセクションでは、types toolが機能するいくつかの種類のカスタマイゼーションを示します。
インストールされるとファクトリーが自動的にAddリストに表示されるZopeのプロダクトとは異なり、CMFサイトは新しいプロダクトタイプを有効にするための明示的な設定を必要とします。同じように、特定のCMFサイトは特定のコンテントタイプの作成を抑圧します。希にそのtype informationオブジェクトを削除することによって行ったりします。
あなたのサイトの/newsフォルダの中にはNewsItemsしか作れないように制限する必要があるとします。開始点としてCMFDefault/Folderを使って新しいtypeオブジェクトを作り、Filter content types?チェックボックスをチェックして、Allowed content typesリストでNewsItemだけを選びます。
typeオブジェクトのActionタブにあるそれぞれのactionのNameプロパティを変更して、actions_boxに現れるラベルと国際化します。国際化スキンメソッドを選ぶためにActionプロパティを変更します。
あなたのオブジェクトに対するカスタムなスキンメソッドを作って、Actionsタブを使ってバインディングします。(スキンメソッドはオブジェクトの既存のアクションの名前を再利用するので再バインディングは必要ないです。)
| Last edited Thu, 14 Sep 2006 11:49:33 +0900 | Edit this page |