idの自動設定

 Ploneで作成したコンテンツのshort name(=id属性)は、デフォルトでは、コンテンツ作成時にTitle属性から自動的に作られる(詳しくは、Normalizing ids を参照)。通常はこれで問題ないが、id属性はURLの一部となるので、コンテンツに設定したフィールドの値と関連付けたいことがある。


 manage_afterAddメソッドを使ったり、いろいろと方法があるようだが、今のところ最も簡単そうなのは、カスタムコンテンツタイプにpost_validateメソッドを追加する、次のやり方だと思う。

class MyContent(BaseContent):
    implements(IMyContent)

    meta_type = "MyContent"
    schema = MyContentSchema

    ・・・

    def post_validate(self, REQUEST, errors):
        """ コンテンツの作成、編集の際に呼び出される。
            この例では、REQUEST中のdocumentId属性の値を、そのままid属性にセットする。
            1回のリクエストで、post_validateは何度か呼び出される。
      最初に呼び出された時点では、コンテンツ内の値は更新されていないので、注意が必要。
        """
        self.setId(REQUEST['documentId'])

        # 下のようにすると、コピペしたオブジェクトではエラーになる。
        #self.setId(self.getDocumentId()) 


 ただし、この例では、同じid属性を持つコンテンツがすでに存在する場合は、エラーになってしまう。運用条件によっては、あまり問題にならないだろうが、この対処方法はそのうち調べることにする。