Log message for revision 70910: - made some Zope 3 formlib fixes available
Changed: U Products.Five/branches/1.4/CHANGES.txt UU Products.Five/branches/1.4/formlib/configure.zcml UU Products.Five/branches/1.4/formlib/formbase.py UU Products.Five/branches/1.4/formlib/pageform.pt D Products.Five/branches/1.4/formlib/subpageform.pt -=- Modified: Products.Five/branches/1.4/CHANGES.txt =================================================================== --- Products.Five/branches/1.4/CHANGES.txt 2006-10-25 11:37:25 UTC (rev 70909) +++ Products.Five/branches/1.4/CHANGES.txt 2006-10-25 11:56:08 UTC (rev 70910) @@ -8,6 +8,9 @@ Bugfixes -------- +* formlib: Removed redundant subpageform.pt and backported pageform.pt fixes + from Zope 3. Added missing error view and i18n configuration. + * Made the __call__ method of ViewMixinForAttributes have the same signature as the original attribute. This aids some pathological request parameter marshalling. Modified: Products.Five/branches/1.4/formlib/configure.zcml =================================================================== --- Products.Five/branches/1.4/formlib/configure.zcml 2006-10-25 11:37:25 UTC (rev 70909) +++ Products.Five/branches/1.4/formlib/configure.zcml 2006-10-25 11:56:08 UTC (rev 70910) @@ -1,6 +1,20 @@ <configure + package="zope.formlib" xmlns="http://namespaces.zope.org/zope" - xmlns:zc="http://namespaces.zope.com/zc" + xmlns:i18n="http://namespaces.zope.org/i18n" i18n_domain="zope.formlib"> - <adapter factory="zope.formlib.form.render_submit_button" name="render" /> + + <i18n:registerTranslations directory="locales"/> + + <adapter + factory=".form.render_submit_button" + name="render" + /> + + <!-- Error view for 'Invalid' --> + <adapter + factory=".errors.InvalidErrorView" + permission="zope.Public" + /> + </configure> Property changes on: Products.Five/branches/1.4/formlib/configure.zcml ___________________________________________________________________ Name: svn:eol-style + native Modified: Products.Five/branches/1.4/formlib/formbase.py =================================================================== --- Products.Five/branches/1.4/formlib/formbase.py 2006-10-25 11:37:25 UTC (rev 70909) +++ Products.Five/branches/1.4/formlib/formbase.py 2006-10-25 11:56:08 UTC (rev 70910) @@ -15,39 +15,49 @@ $Id$ """ +import os.path + from datetime import datetime import Acquisition import zope.event +import zope.formlib import zope.app.event.objectevent from zope import interface from zope.formlib import interfaces, form, namedtemplate from zope.app.i18n import ZopeMessageFactory as _ -from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile +from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.Five.browser.decode import processInputs, setPageEncoding +_FORMLIB_DIR = os.path.dirname(zope.formlib.__file__) +_PAGEFORM_PATH = 'pageform.pt' +_SUBPAGEFORM_PATH = os.path.join(_FORMLIB_DIR, 'subpageform.pt') + + class FiveFormlibMixin(Acquisition.Explicit): # Overrides the formlib.form.FormBase.template attributes implemented # using NamedTemplates. NamedTemplates using ViewPageTemplateFile (like # formlib does by default) cannot work in Zope2. - + # XXX Maybe we need to have Five-compatible NamedTemplates? - - template = ZopeTwoPageTemplateFile('pageform.pt') - + + template = ViewPageTemplateFile(_PAGEFORM_PATH) + # Overrides formlib.form.FormBase.update. Make sure user input is # decoded first and the page encoding is set before proceeding. - + def update(self): processInputs(self.request) setPageEncoding(self.request) super(FiveFormlibMixin, self).update() + class FormBase(FiveFormlibMixin, form.FormBase): pass - + + class EditFormBase(FiveFormlibMixin, form.EditFormBase): # Overrides formlib.form.EditFormBase.handle_edit_action, to remove @@ -57,7 +67,7 @@ def handle_edit_action(self, action, data): if form.applyChanges( self.context, self.form_fields, data, self.adapters): - + zope.event.notify( zope.app.event.objectevent.ObjectModifiedEvent(self.context) ) @@ -68,51 +78,60 @@ ) else: self.status = _('No changes') - + + class DisplayFormBase(FiveFormlibMixin, form.DisplayFormBase): pass + class AddFormBase(FiveFormlibMixin, form.AddFormBase): pass - + + class PageForm(FormBase): interface.implements(interfaces.IPageForm) Form = PageForm + class PageEditForm(EditFormBase): interface.implements(interfaces.IPageForm) EditForm = PageEditForm + class PageDisplayForm(DisplayFormBase): interface.implements(interfaces.IPageForm) DisplayForm = PageDisplayForm + class PageAddForm(AddFormBase): interface.implements(interfaces.IPageForm) AddForm = PageAddForm + class SubPageForm(FormBase): - template = ZopeTwoPageTemplateFile('subpageform.pt') - + template = ViewPageTemplateFile(_SUBPAGEFORM_PATH) + interface.implements(interfaces.ISubPageForm) + class SubPageEditForm(EditFormBase): - template = ZopeTwoPageTemplateFile('subpageform.pt') - + template = ViewPageTemplateFile(_SUBPAGEFORM_PATH) + interface.implements(interfaces.ISubPageForm) + class SubPageDisplayForm(DisplayFormBase): - template = ZopeTwoPageTemplateFile('subpageform.pt') - + template = ViewPageTemplateFile(_SUBPAGEFORM_PATH) + interface.implements(interfaces.ISubPageForm) Property changes on: Products.Five/branches/1.4/formlib/formbase.py ___________________________________________________________________ Name: svn:eol-style + native Modified: Products.Five/branches/1.4/formlib/pageform.pt =================================================================== --- Products.Five/branches/1.4/formlib/pageform.pt 2006-10-25 11:37:25 UTC (rev 70909) +++ Products.Five/branches/1.4/formlib/pageform.pt 2006-10-25 11:56:08 UTC (rev 70910) @@ -1,8 +1,4 @@ -<html xmlns="http://www.w3.org/1999/xhtml" - xmlns:metal="http://xml.zope.org/namespaces/metal" - xmlns:tal="http://xml.zope.org/namespaces/tal" - xmlns:i18n="http://xml.zope.org/namespaces/i18n" - metal:use-macro="context/@@standard_macros/page"> +<html metal:use-macro="context/@@standard_macros/view"> <head> </head> @@ -15,31 +11,47 @@ tal:attributes="action request/URL" method="post" class="edit-form" enctype="multipart/form-data" id="zc.page.browser_form"> - + <script type="text/javascript"><!-- - function toggleFormFieldHelp(ob,state) { +function toggleFormFieldHelp(ob,state) { // ob is the label element - var field = ob.form[ob.htmlFor]; + var field = findWidgetDiv(ob); if (field) { - var viz = state && 'hidden' || 'visible'; - if (field.length == null) { - field.style.visibility = viz; + field.style.visibility = state && 'hidden' || 'visible'; + var help = document.getElementById("field-help-for-" + ob.htmlFor); + if (help) { + help.style.visibility = state && 'visible' || 'hidden'; + } } - else { - for (var i = 0; i < field.length; ++i) { - var e = field.item(i); - e.style.visibility = viz; +} + +function findWidgetDiv(label) { + var element = findFormField(label); + while (element) { + element = element.parentNode; + if (element.tagName == 'DIV' && element.getAttribute('class') == 'widget') + return element; } +} + +function findFormField(label) { + var name = label.htmlFor; + var field = label.form[name]; + // Multiple fields with the same name, such as radiobuttons + if (field) { + if (field.length) + field = field[0]; + return field; } - var help = document.getElementById("field-help-for-" + field.name); - if (help) { - help.style.visibility = state && 'visible' || 'hidden'; + // No field with the exact name; find one that starts with the name + for (var i = 0; field = label.form[i++];) { + if (field.name.substr(0, name.length) == name) + return field; } - } - } +} - //--> +//--> </script> <div id="viewspace" metal:define-slot="viewspace"> @@ -142,9 +154,6 @@ </div> </form> -<script type="text/javascript" metal:define-slot="trackChanges"> - zc_trackChanges(document.getElementById('zc.page.browser_form')); -</script> <script type="text/javascript" tal:define="extra_script view/extra_script | nothing" Property changes on: Products.Five/branches/1.4/formlib/pageform.pt ___________________________________________________________________ Name: svn:eol-style + native Deleted: Products.Five/branches/1.4/formlib/subpageform.pt =================================================================== --- Products.Five/branches/1.4/formlib/subpageform.pt 2006-10-25 11:37:25 UTC (rev 70909) +++ Products.Five/branches/1.4/formlib/subpageform.pt 2006-10-25 11:56:08 UTC (rev 70910) @@ -1,106 +0,0 @@ -<div metal:define-macro="form"> - - <h1 - i18n:translate="" - tal:condition="view/label" - tal:content="view/label" - metal:define-slot="heading" - >Do something</h1> - - <div class="form-status" - tal:define="status view/status" - tal:condition="status"> - - <div class="summary" tal:content="view/status" i18n:translate=""> - Form status summary - </div> - - <ul class="errors" tal:condition="view/errors"> - <li tal:repeat="error view/error_views"> - <span tal:replace="structure error">Error Type</span> - </li> - </ul> - </div> - - <div metal:define-slot="extra_info" tal:replace="nothing"> - </div> - -<!-- - <div class="form-controls" tal:condition="view/availableActions" - metal:define-slot="top_buttons"> - <input tal:repeat="action view/actions" - tal:replace="structure action/render" - /> - </div> ---> - - <table class="form-fields"> - <tr class="row" metal:define-slot="extra_top" tal:replace="nothing"> - <td class="label">Extra top</td> - <td class="label"><input type="text" /></td> - </tr> - <tbody metal:define-slot="formbody" tal:omit-tag=""> - <tr tal:repeat="widget view/widgets"> - <td class="label" tal:define="hint widget/hint" - metal:define-macro="labelcell"> - <label tal:condition="python:hint" - tal:attributes="for widget/name" - onmousedown="toggleFormFieldHelp(this,1)" - onmouseup="toggleFormFieldHelp(this,0)" - onmouseout="toggleFormFieldHelp(this,0)" - style="cursor: help"> - <span class="required" tal:condition="widget/required" - >*</span><span i18n:translate="" - tal:content="widget/label">label</span> - </label> - <label tal:condition="python:not hint" - tal:attributes="for widget/name"> - <span class="required" tal:condition="widget/required" - >*</span><span i18n:translate="" - tal:content="widget/label">label</span> - </label> - </td> - <td class="field" tal:define="hint widget/hint" - metal:define-macro="widgetcell"> - <div class="form-fields-help" - tal:content="hint" - tal:condition="hint" - tal:attributes="id string:field-help-for-${widget/name}" - onclick="this.style.visibility='hidden';" - i18n:translate="" - style="visibility: hidden; position: absolute;" - >Title of this content object.</div> - <div class="widget" tal:content="structure widget"> - <input type="text" /></div> - <div class="error" - define="error widget/error" - tal:condition="widget/error" - > - <!-- TODO Put this back, the Zope3 way. - <img src="alert.gif" alt="Error" - tal:replace="structure context/alert.gif" /> - --> - <span tal:replace="structure widget/error">error</span> - </div> - </td> - </tr> - </tbody> - <tr class="row" metal:define-slot="extra_bottom" tal:replace="nothing"> - <td class="label">Extra bottom</td> - <td class="label"><input type="text" /></td> - </tr> - </table> - - <div class="form-controls" tal:condition="view/availableActions" - metal:define-slot="bottom_buttons"> - <input tal:repeat="action view/actions" - tal:replace="structure action/render" - /> - </div> - -<script type="text/javascript" - tal:define="extra_script view/extra_script | nothing" - tal:condition="extra_script" - tal:content="structure extra_script" /> - -</div> _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins