пятница, 4 апреля 2008 г.

Собственная форма добавления

Собственная форма добавления:

У нас есть интерфейс:

1.# -*- coding: koi8-r -*-
2.from zope.interface import Interface
3.from zope.schema import TextLine
4.
5.class IMark(Interface):
6.
7. datax = TextLine(
8. title=u"Data",
9. description=u"Des",
10. required=False)

И есть его реализация:

1.# -*- coding: koi8-r -*-
2.__docformat__ = 'restructuredtext'
3.
4.from zope.interface import implements
5.from zope.app.container.contained import Contained
6.
7.from boom.interfaces import IMark
8.from persistent import Persistent
9.
10.class Mark(Persistent):
11. implements(IMark)
12.
13. datax = u''
14.
15.from zope.component.factory import Factory
16.
17.markFactory = Factory(
18. Mark,
19. title=u"Create a new mark",
20. description = u"This factory instantiates new mark."
21. )

Здесь мы добавляем в строке 17 фабрику, которая служит для создания нашего объекта.
Теперь нужно написать собственный класс добавления
:

1.from zope.component import createObject
2.
3.from zope.formlib.form import AddForm, Fields, applyChanges
4.from boom.interfaces import IMark
5.
6.from zope.formlib.namedtemplate import NamedTemplate
7.from zope.formlib.namedtemplate import NamedTemplateImplementation
8.from zope.app.pagetemplate import ViewPageTemplateFile
9.
10.class MarkAddForm(AddForm):
11.
12. form_fields = Fields(IMark)
13. label = u"Add BookMarker"
14.
15. template = NamedTemplate('mark.form')
16.
17.
18. def create(self, data):
19. mark = createObject(u'boom.mark')
20. applyChanges(mark, self.form_fields, data)
21. return mark
22.
23.form_template = NamedTemplateImplementation(
24. ViewPageTemplateFile('form.pt'))

Класс добавления наследуется от базового AddForm, в строке 12 мы указываем
что поля для формы нужно брать из нашего интерфейса.
В
15 строке мы указываем шаблон который будет использоваться для формы.
В строке
18 определяем метод который перекрывает создание объекта.
В строке
23 создаем объект который нужен для связки шаблона.

Конфигурация:

1.<configure
2. xmlns="http://namespaces.zope.org/zope"
3. xmlns:browser="http://namespaces.zope.org/browser">
4.
5. <interface
6. interface=".interfaces.IMark"
7. type="zope.app.content.interfaces.IContentType"
8. />
9.
10. <content class=".bookmarker.Mark">
11. <require
12. permission="zope.ManageContent"
13. interface=".interfaces.IMark"/>
14. <require
15. permission="zope.ManageContent"
16. set_schema=".interfaces.IMark"
17. />
18. </content>
19.
20.<browser:addMenuItem
21. factory="boom.mark"
22. title="Mark"
23. permission="zope.ManageContent"
24. view="boom.mark"
25. />
26.
27. <browser:page
28. for="zope.app.container.interfaces.IAdding"
29. name="boom.mark"
30. class=".form.MarkAddForm"
31. permission="zope.ManageContent"
32. />
33.
34. <adapter
35. factory=".form.form_template"
36. for=".form.MarkAddForm"
37. name="mark.form"
38. />
39.
40. <utility
41. component=".bookmarker.markFactory"
42. name="boom.mark"
43. permission="zope.Public"
44. />
45.</configure>

1-3: Объявление директив
5-8: Указываем что наш объект контентный
10-18: Указываем права для нашего объекта
20-25: Директива добавления
21 – указываем фабрику для создания объекта
24 – вид для добавления
27-32: Директива для класса добавления
29 — имя совпадающее с видом в директиве addMenuItem
34-37: Адаптер для класса добавления, определяет шаблон
40-43: Утилита определения фабрики

Шаблон form.pt

1.<html xmlns="http://www.w3.org/1999/xhtml"
2. xmlns:tal="http://xml.zope.org/namespaces/tal"
3. xmlns:metal="http://xml.zope.org/namespaces/metal"
4. metal:use-macro="context/@@standard_macros/view">
5.<body>
6.<div metal:fill-slot="body">
7.<form class="edit-form" enctype="multipart/form-data" method="post"
8. action="." tal:attributes="action request/URL">
9.
10. <h1 tal:content="view/label">Edit something</h1>
11.
12. <div class="summary" tal:condition="view/status"
13. tal:content="view/status">Status</div>
14.
15. <div class="row" tal:repeat="widget view/widgets">
16. <div class="label">
17. <label for="field.name" title="The widget's hint"
18. tal:attributes="for widget/name; title widget/hint"
19. tal:content="widget/label">Label</label>
20. </div>
21.
22. <div tal:condition="widget/error"
23. tal:content="structure widget/error">Error</div>
24.
25. <div class="field">
26. <input tal:replace="structure widget" />
27. </div>
28. </div>
29.
30. <span class="actionButtons" tal:condition="view/availableActions">
31. <input tal:repeat="action view/actions"
32. tal:replace="structure action/render"
33. />
34. </span>
35.
36.</form>
37.</div>
38.</body>
39.</html>

Выводит стандартные виджеты ввода, определение виджетов происходит
по полям указанным в классе добавления формы.

Комментариев нет: