سؤال

باستخدام ماريوس جيدميناس مدونة ممتازة, ، لقد قمت بإنشاء مرور مخصص لمجلد في موقعي.

هذا يسمح لي أن أظهر: http://foo.com/folder/random_id

بدلاً من: http://foo.com/folder/object.html?id=random_id

يعمل جانب التكوين بشكل رائع ، يمكنني التقاط العشوائية والبحث من خلال رسائلي للحصول على واحدة صحيحة ، جاهزة للعرض.

مشكلتي هي أنني غير متأكد من كيفية عرض البيانات عبر قوالب الصفحات المعتادة - عند نقطة 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"
/>
هل كانت مفيدة؟

المحلول

سيكون من الأسهل الإجابة على سؤالك إذا أظهرت ما تفعله Transerer المخصص.

في الأساس ، تريد شيئًا كهذا:

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')

إخلاء المسئولية: لست متأكدًا مما إذا كان العرض الذي تقوم به مباشرة سيتم حمايته بواسطة غلاف أمان ؛ تأكد من أن الاختبارات الوظيفية الخاصة بك تضمن لا يمكن للمستخدمين المجهولين عرض الرسائل إذا كان هذا ما تريده.

نصائح أخرى

إذا انتهى بك الأمر في كائن مناسب مع Traverser المخصص الخاص بك ، فيمكنك فقط التعامل مع اسم القالب والمستخدم "السياق" في هذا القالب. لذا http://foo.com/folder/random_id/my_template وفي القالب ، افعل الطبيعي <h1 tal:content="context/title" /> أمور.

iiuc ، ما تريده هو تقديم عرض "قراءة" عندما يطلب شخص ما /مجلد /عشوائي. إذا كان هذا هو الحال ، فكل ما عليك فعله هو جعل اجتيازك يعيد كائن (ifolderContent ، ربما) يمثل عشوائيًا وحدد صفحة "العرض" باعتبارها الافتراضية لـ IfolderContent.

هناك حاجة إلى DefaultView لأنه لا يوجد عرض محدد لكائن Random_ID في عنوان URL الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top