wiki.zope.jp
TamingTheWildTypesTool
   
RecentChanges WikiHelp WikiPractice JumpSearch

TamingTheWildTypesTool

ワイルドなTypes Toolをてなづける

概要

PTK/CMFアーキテクチャへのかなり若い追加として、portal_typesツールはいくつかの重要な役割を担います。 この役割を理解することはCMFデベロッパやサイト構築者にとって、「禅」のキー・ピースとなります。

Types ToolとTypeInformationObjectsの役割

オブジェクトの構築

当初、typesツールは「クラシック」なPTKのWizardsフォルダのシンプルな代替物として計画されました。Wizardsは通常マルチページのフォームで、コンテント・オブジェクトやフォルダを構築するためにユーザーからメタデータやコンテントを集めるものでした。オブジェクトを構築するためにロジックを分離すること(Wizardでは、正しくはオブジェクトのクラスから)は、それを編集するために使われるロジックから(通常はクラス自身の中で)という意味ですが、メンテナンス性が貧弱なものになります。また、WizardsはThrough-The-Webオブジェクトとして配布されなければならなかったのです。それはPTK/CMFベースのサイトの更新時に痛みを伴うものでした。

types toolに格納されているtype informationオブジェクトのオリジナルバージョンは、シンプルなポリモーフィックなインターフェースを通してインスタンスを構築するのに必要なプロパティを少し持っています。

CMF Siteのためにaddable content typesのレジストリを作ったことは、他の役割を不要のものにしました。

コンテントUIのスキン

portal_skinsツールを作ることでポータルワイドなUIコンポーネントでスキンすることに成功したので、我々はサイト構築者やアプリケーションデベロッパに特定のコンテントオブジェクトのためのUIコンポーネントをカスタマイズ可能にさせたくなりました。type informationオブジェクトは今度は論理的なactionsとそれを制御するskinメソッドの間でマッピングするための論理的なコンテナとなりました。

サイト特有のポリシーを保持する

コンテントオブジェクトに関するポリシーの決定をそれらのクラスに埋め込むことは、そのようなオブジェクトを再利用することを難しくします。例えば、あるサイトのポリシーが(例えばコンテントをディスカッションの対象にできるかどうか)そのようなポリシーを上書きするためにサブクラス化することを強制され、それがうまく行かないような場合です。Type informationオブジェクトはそのような場合に素晴らしいpolicy configuration pointsを作ります。

インスタンス空間でコンテントの振舞をカスタマイズする

1つ以上のtype informationオブジェクトは、同じ下位層に横たわるクラスをポイントできるので、異なる構築戦略や、UI、ポリシーセッティングを与えられても、type informationオブジェクトはサイト構築者にCMFのコンテントオブジェクトを複数の目的に利用させることができます。

インターフェース

portal_typesインターフェース

このインターフェースを実装するオブジェクトは、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'.
            """

ContentTypeInformation?インターフェース

このインターフェースを実装するオブジェクトはファクトリとして機能したり、それがラップするクラスのコンフィギュレーションポイントとなります。

API:

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. """

実装

TypesTool?

portal_typesインターフェースを実装するのに加えて、このタイプのインスタンスはObjectManagersです。それはtype informationオブジェクトの他にhelperオブジェクト(Pythonスクリプト)を保持します。それらは新しいtype informationオブジェクトを追加するためのUIやこれらのオブジェクトをZopeプロダクトにより登録されたデフォルトの値とともにポピュレートするためのサポートを提供します。(factory_type_informationプロトコルの実装を見て下さい。)

TypeInformation? (base class)

このクラスは、ContentTypeInformationインターフェースの共有部分を実装します。(それらの部分はオブジェクトの構築は扱いません。)

TypeInformation?オブジェクトはいくつかの共有プロパティを持ちます。

FactoryTypeInformation? (FTI)

このクラスは、Zopeのproduct-dispatcher/factory-dispatcherメカニズムを直接呼ぶことにより、ContentTypeInformationインターフェースのオブジェクト構築部分を実装します。これらのtypeオブジェクトは設定がとてもシンプルで、Zopeプロダクトにより直接提供されるコンテント・オブジェクトを統合するためのとても簡単な方法を提供します。

FTIオブジェクトは2つのユニークなプロパティを持つ。

product

このtypeのオブジェクトのクラスやファクトリーメソッドを保持するZopeプロダクトの名前。

factory
クラスのインスタンスを作成するファクトリーメソッドの名前(ZClassのために作られるZopeのファクトリーオブジェクトとは違います。)

呼出側が提供するならば、追加的な位置引数とキーワード引数が渡されます。 ScriptableTypeInformation? (STI)

このクラスは、ユーザーが提供するメソッド(通常Pythonスクリプト)を呼び出すことで、ContentTypeInformationインターフェースのオブジェクト構築部分を実装します。FTIオブジェクトよりもセットアップが難しいのは、これらのtypeオブジェクトはより柔軟なオブジェクト生成を行うからです。例えば、

STIオブジェクトは2つのユニークなプロパティを持ちます。

使用のシナリオ

このセクションでは、types toolが機能するいくつかの種類のカスタマイゼーションを示します。

コンテント・タイプの追加・削除

インストールされるとファクトリーが自動的にAddリストに表示されるZopeのプロダクトとは異なり、CMFサイトは新しいプロダクトタイプを有効にするための明示的な設定を必要とします。同じように、特定のCMFサイトは特定のコンテントタイプの作成を抑圧します。希にそのtype informationオブジェクトを削除することによって行ったりします。

News-Onlyフォルダを作る

あなたのサイトの/newsフォルダの中にはNewsItemsしか作れないように制限する必要があるとします。開始点としてCMFDefault/Folderを使って新しいtypeオブジェクトを作り、Filter content types?チェックボックスをチェックして、Allowed content typesリストでNewsItemだけを選びます。

Action URLの国際化

typeオブジェクトのActionタブにあるそれぞれのactionのNameプロパティを変更して、actions_boxに現れるラベルと国際化します。国際化スキンメソッドを選ぶためにActionプロパティを変更します。

カスタマイズされたUIのバインディング

あなたのオブジェクトに対するカスタムなスキンメソッドを作って、Actionsタブを使ってバインディングします。(スキンメソッドはオブジェクトの既存のアクションの名前を再利用するので再バインディングは必要ないです。)

デベロッパの為の文書

将来

Last edited Thu, 14 Sep 2006 11:49:33 +0900 Edit this page