понедельник, 7 апреля 2008 г.

Собственный виджет для поля.

Добавим в интерфейс еще одно поле Bool.

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

Добавленны стороки 12 - 15

Теперь если оставить остальной код без изменений (Собственная форма добавления
), при добавлении Mark мы получим следующюу форму:



Но хотелось бы что бы она имела немного другой вид:



Для этого нужно использовать собственный виджет:

1.from zope.app.form.browser.boolwidgets import CheckBoxWidget
2.from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
3.
4.class BoolWidget(CheckBoxWidget):
5. __call__ = ViewPageTemplateFile('widget.pt')

Класс BoolWidget наследуется от базового CheckBoxWidget, и реализует метод вызова шаблона.

1.<div xmlns:tal="http://xml.zope.org/namespaces/tal">
2.<p>
3. <input type="radio" id="checkbox.flag"
4. tal:attributes="id string:${view/name};
5. name string:${view/name}"
6. value="on" checked /> True
7.</p>
8.<p>
9. <input type="radio" id="checkbox.flag"
10. tal:attributes="id string:${view/name};
11. name string:${view/name}"
12. value="" /> False
13.
14.</p>
15.</div>

Здесь мы используем форму ввода radio вместо checkbox.

В классе добавления формы укажем что поле flag использует наш собственный виджет (строка 15):

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

В реализации нужно так же указать значение поля flag по умолчанию (строка 14)

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. flag = False
15.
16.from zope.component.factory import Factory
17.
18.markFactory = Factory(
19. Mark,
20. title=u"Create a new mark",
21. description = u"This factory instantiates new mark."
22. )

Остальной код оставляем без изменений.

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