0

Marius Gedminas の優れたブログ投稿を使用して、サイト内のフォルダー用のカスタム トラバーサーを作成しました。

これにより、次のことを示すことができます。http://foo.com/folder/random_id

それ以外の:http://foo.com/folder/object.html?id=random_id

構成側はうまく機能します。random_ids をキャッチし、メッセージを検索して正しいメッセージを表示する準備ができています。

私の問題は、通常のページテンプレートを介してデータを表示する方法がわからないことです-元のコードのTODOポイントで;)

if name == 'mycalendar':
            mycalendar = ... # TODO: do something to get the appropriate object
            return mycalendar

通常、次のようなものを使用します。

class Test(BrowserPage):

    template = ViewPageTemplateFile('atest.pt')

    def __call__(self):
        return self.template()

しかし、カスタム トラバーサルのコンテキストでこれを正しく行う方法がわかりません。


更新:明確にするために、URLに何かを追加することは避けたい(いいえ: http://foo.com/folder/random_id/read )。

他のアドレスからビューを利用できるようにする必要はありません (いいえ: http://foo.com/folder/read )

使用したいビューの ZCML は次のとおりです。

<browser:page
  for="foo.interfaces.IFooFolderContainer"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>

私は(さらなるアドバイスに基づいて)次のように推測しています:

return getMultiAdapter((mycalendar, self.request), IPageTemplate, name=u'read')

または、返されるオブジェクト タイプ (この場合は dict) の既定のビューです。

<browser:page
  for="dict"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>
4

3 に答える 3

1

カスタム トラバーサーが何をしているかを示すと、質問に答えやすくなります。

基本的に、次のようなものが必要です。

def publishTraverse(self, request, name):
    if name in self.context:
        return MyMessageView(self.context[name], request)

    # fall back to views such as index.html
    view = queryMultiAdapter((self.context, request), name=name)
    if view is not None:
        return view

    # give up and return a 404 Not Found error page
    raise NotFound(self.context, name, request)

MyMessageView は次のような単純なものにすることができます

class MyMessageView(BrowserPage):
    __call__ = ViewPageTemplateFile('read.pt')

免責事項: 直接インスタンス化するビューがセキュリティ ラッパーによって保護されるかどうかはわかりません。機能テストで、必要に応じて匿名ユーザーがメッセージを表示できないことを確認してください。

于 2009-11-18T14:58:06.057 に答える
0

IIUC、あなたが望むのは、誰かが /folder/random_id を要求したときに「読み取り」ビューをレンダリングすることです。その場合は、トラバーサルが random_id を表すオブジェクト (IFolderContent など) を返すようにし、「ビュー」ページを IFolderContent の defaultView として指定するだけです。

URL の random_id オブジェクトにビューが指定されていないため、defaultView が必要です。

于 2009-11-18T12:43:45.440 に答える
0

カスタム トラバーサーで適切なオブジェクトにたどり着いた場合は、そのテンプレートにテンプレート名とユーザーの「コンテキスト」を追加するだけです。したがってhttp://foo.com/folder/random_id/my_template、テンプレートでは通常のことを行い<h1 tal:content="context/title" />ます。

于 2009-11-18T08:38:28.760 に答える