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