Zope 2: Как правильно "браузер: страница", чтобы сделать страницу доступной везде?

Предположим, у меня есть пример приложения со следующими классами:

##
## impelementation/SampleApp.py
##
class SampleApp: # inherits from required classes
    """ """
    implements(ISampleApp)
    # ...
    index_html = PageTemplateFile('templates/index.pt')


##
## implementation/SampleAppUser.py
##
class SampleAppUser: # inherits from required classes
    """ """
    implements(ISampleAppUser)
    # ...
    index_html = PageTemplateFile('templates/user_index.pt')

manage_addSampleAppUserForm = PageTemplateFile('manage_addSampleUserUserForm.pt')

Теперь я хотел бы иметь возможность ссылки на форму входа (manage_addSampleUserUserForm.pt) из любого места в приложении, включая его страницу индекса (index.pt).

Я попробовал следующий подход, но он не работает:

index.pt:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns="http://xml.zope.org/namespaces/tal">
  <head><title>SampleApp</title></head>
  <body>
     <h2>Title</h2><hr/>
     <a href="#" title="Sign In"
         tal:attributes="href here/signin.html">Sign In</a>
  </body>
</html>

configure.zcml:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:five="http://namespaces.zope.org/five"
       xmlns:browser="http://namespaces.zope.org/browser">

  <five:registerPackage package="." initialize=".initialize" />

  <browser:page
          name="signin.html"
          class="bahmanm.sampleapp.implementation.SampleAppUser.SampleAppUser"
          template="templates/manage_addSampleUserForm.pt"
          permission="zope.Public"
  />

</configure>

Во время запуска экземпляра Zope жалуется:

ZopeXMLConfigurationError: File "/home/bahman/sampleapp/sampleapp.devistan/src/bahmanm/sampleapp/configure.zcml", line 10.2-15.5
    TypeError: page() takes at least 4 arguments (5 given)

Я также попытался добавить for="*" но при переходе на страницу индекса приложения Zope высветила следующую ошибку:

2013-01-08 15:43:26 ERROR Zope.SiteErrorLog 1357647206.080.27220840385 http://localhost:8080/sampleapp/index_html
Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module Shared.DC.Scripts.Bindings, line 322, in __call__
  Module Shared.DC.Scripts.Bindings, line 359, in _bindAndExec
  Module Products.PageTemplates.PageTemplateFile, line 130, in _exec
  Module Products.PageTemplates.PageTemplate, line 79, in pt_render
  Module zope.pagetemplate.pagetemplate, line 113, in pt_render
  Module zope.tal.talinterpreter, line 271, in __call__
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 405, in do_startTag
  Module zope.tal.talinterpreter, line 482, in attrAction_tal
  Module Products.PageTemplates.Expressions, line 225, in evaluateText
  Module zope.tales.tales, line 696, in evaluate
   - URL: index_html
   - Line 7, Column 3
   - Expression: <PathExpr standard:'here/signin.html'>
   - Names:
      {'container': <SampleApp at /sampleapp>,
       'context': <SampleApp at /sampleapp>,
       'default': <object object at 0x7fa1499cf4c0>,
       'here': <SampleApp at /sampleapp>,
       'loop': {},
       'nothing': None,
       'options': {'args': ()},
       'repeat': <Products.PageTemplates.Expressions.SafeMapping object at 0x7fa134030ba8>,
       'request': <HTTPRequest, URL=http://localhost:8080/sampleapp/index_html>,
       'root': <Application at >,
       'template': <PageTemplateFile at /sampleapp/index>,
       'user': <User 'admin'>}
  Module zope.tales.expressions, line 217, in __call__
  Module Products.PageTemplates.Expressions, line 147, in _eval
  Module zope.tales.expressions, line 124, in _eval
  Module Products.PageTemplates.Expressions, line 74, in boboAwareZopeTraverse
  Module OFS.Traversable, line 317, in restrictedTraverse
  Module OFS.Traversable, line 275, in unrestrictedTraverse
   - __traceback_info__: ([], 'signin.html')
  Module zope.component._api, line 120, in queryMultiAdapter
  Module zope.component.registry, line 238, in queryMultiAdapter
  Module zope.interface.adapter, line 532, in queryMultiAdapter
TypeError: __init__() takes at most 2 arguments (3 given)

Что я делаю неправильно? Честно говоря, я считаю, что я делаю много неправильных вещей:-), поскольку я просто стреляю вслепую, читая apidoc Zope 3 и читая код других продуктов (например, SilvaForum).

Буду очень признателен за любую подсказку / помощь. ТИА,

1 ответ

Решение

Страницы браузера - это отдельные компоненты. Они не являются частью целевого типа контента, а являются отдельным компонентом в целом.

Если вам нужен только шаблон (без представления), просто полностью опустите директиву класса:

<browser:page
    name="signin.html"
    for="*"
    template="templates/manage_addSampleUserForm.pt"
    permission="zope.Public"
    />

Там нет необходимости создавать PageTemplateFile экземпляр вручную для этого.

Не совсем понятно, что вы хотите сделать со своей ссылкой в ​​шаблоне. `here/signin.html" не похоже на допустимое выражение TALES. В простом Zope нет простых инструментов для генерации абсолютных URL-адресов относительно корня сайта; возможно, вы просто хотите /signin.html и не использовать выражение TAL?

Другие вопросы по тегам