Пользовательские редактировать представления в Plone 4 - PullRequest
4 голосов
/ 04 мая 2011

Я создал пользовательский тип контента ( Resume ) и хочу предоставить пользовательский вид редактирования. Мой сценарий использования очень прост, я просто хочу показать HTML-поле "отказ от ответственности" перед формой редактирования.

Прежде всего я скопировал:

Products/ATContentTypes/skins/ATContentTypes/atct_edit.cpt
Products/ATContentTypes/skins/ATContentTypes/atct_edit.cpt.metadata

в my / product / browser / as

my/product/browser/resumeedit.cpt
my/product/browser/resumeedit.cpt.metadata

Затем я определил новый браузер: раздел страницы в my / product / browser / configure.zcml :

  <browser:page
   for="..interfaces.IResume"
   name="resume_edit"
   class=".resumeview.ResumeEdit"
   template="resumeedit.cpt"
   permission="cmf.ModifyPortalContent"
   />

Класс резюме в my / product / browser / resumeview.py просто:

class ResumeEdit(BrowserView):
""" A customization of the Resume Edit form
"""
    __call__  = ViewPageTemplateFile('resumeedit.cpt')

Наконец, я изменил псевдоним по умолчанию для 'edit' в my / product / profile / default / types / Resume.xml :

  <alias from="edit" to="resume_edit" />

При установке, добавлении или редактировании типа контента Resume выбрасывается это исключение:

Unauthorized: The container has no security assertions.  Access to 'id' of (Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at 0x1e8b7a50) denied.

Это можно исправить, предоставив исправленную версию edit_macros.pt :

85c85
<             tal:attributes="action python:context.absolute_url()+'/'+template.id;
---
>             tal:attributes="action python:context.absolute_url()+'/'+path('template/getId|nothing');
203c203
<                    tal:attributes="value python:(last_referer and '%s/%s' % (context.absolute_url(), template.id) not in last_referer) and last_referer or (context.getParentNode() and context.getParentNode().absolute_url())"
---
>                    tal:attributes="value python:(last_referer and '%s/%s' % (context.absolute_url(), path('template/getId|nothing')) not in last_referer) and last_referer or (context.getParentNode() and context.getParentNode().absolute_url())"

Тем не менее, возникает следующее исключение (id-64121786 - это идентификатор моего резюме):

  Module zope.tales.tales, line 696, in evaluate
   - URL: file:/home/zope/env26/plone-devel/eggs/Products.Archetypes-1.6.5-py2.6.egg/Products/Archetypes/skins/archetypes/widgets/field.pt
   - Line 63, Column 4
   - Expression: <PythonExpr errors.get(fieldName)>
   - Names:
      {'args': (),
       'container': <Resume at /cms/id-64121786>,
       'context': <Resume at /cms/id-64121786>,
       'default': <object object at 0x8e094c0>,
       'here': <Resume at /cms/id-64121786>,
       'loop': {},
       'nothing': None,
       'options': {},
       'repeat': <Products.PageTemplates.Expressions.SafeMapping object at 0x126e7470>,
       'request': <HTTPRequest, URL=http://localhost:8081/cms/id-64121786/resume_edit>,
       'root': <Application at >,
       'template': <Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at 0x117da910>,
       'traverse_subpath': [],
       'user': <PloneUser 'admin'>,
       'view': <Products.Five.metaclass.SimpleViewClass from /home/zope/env26/plone-devel/src/my.product/my/product/browser/resumeedit.cpt object at 0x126d8c90>,
       'views': <Products.Five.browser.pagetemplatefile.ViewMapper object at 0x126d8fd0>}
  Module Products.PageTemplates.ZRPythonExpr, line 49, in __call__
   - __traceback_info__: errors.get(fieldName)
  Module PythonExpr, line 1, in <expression>
  Module AccessControl.ImplPython, line 688, in guarded_getattr
AttributeError: 'NoneType' object has no attribute 'get'

Как я могу решить эту проблему и предоставить свой собственный настроенный шаблон для вида редактирования моего типа контента?

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

Я бы предложил не копировать atct_edit.cpt.Все, что вам действительно нужно сделать, это настроить шаблон редактирования (который, похоже, вы знаете, как это сделать), а затем переопределить соответствующие части.См. Документацию здесь для получения дополнительной информации.

Кроме того, сначала я бы начал с полностью пустого шаблона редактирования.Затем вставьте в него какой-нибудь действительный XHTML, например Hello world! , и убедитесь, что вы можете загрузить шаблон редактирования, нажав кнопку редактирования.

3 голосов
/ 05 мая 2011

Вы должны использовать Viewlet для достижения этой цели.

Зарегистрируйте представление для каждого просмотра, сделайте некоторую проверку при отображении отображения вызовов, что вам нужно.

Так что вам не нужно заново создавать форму

3 голосов
/ 04 мая 2011

Чтобы ответить на ответ Алекса: альтернативным решением может быть также предоставление собственной формы редактирования через z3c.form / plone.autoform, если вы не возражаете против дополнительных зависимостей.См. это руководство для базового введения / идеи.

...