diff --git a/news/230.bugfix.rst b/news/230.bugfix.rst new file mode 100644 index 00000000..85c0e569 --- /dev/null +++ b/news/230.bugfix.rst @@ -0,0 +1 @@ +Allow the ContentBrowserWidget to be used inside an object widget diff --git a/plone/app/z3cform/utils.py b/plone/app/z3cform/utils.py index a7a079b7..7898c7f4 100644 --- a/plone/app/z3cform/utils.py +++ b/plone/app/z3cform/utils.py @@ -4,6 +4,7 @@ from Products.CMFCore.interfaces import IContentish from Products.CMFCore.interfaces import IFolderish from Products.CMFCore.interfaces import ISiteRoot +from z3c.form.browser.object import ObjectWidget from z3c.form.interfaces import IForm from zope.component import providedBy from zope.component.hooks import getSite @@ -143,6 +144,11 @@ def dict_merge(dict_a, dict_b): def get_widget_form(widget): form = getattr(widget, "form", None) + if isinstance(form, ObjectWidget): + # ObjectWidget are container widgets, + # the proper form is the one they belong to + return get_widget_form(form) + if getattr(aq_base(form), "parentForm", None) is not None: form = form.parentForm return form diff --git a/plone/app/z3cform/widgets/contentbrowser.py b/plone/app/z3cform/widgets/contentbrowser.py index f97ac4df..ea1a3b70 100644 --- a/plone/app/z3cform/widgets/contentbrowser.py +++ b/plone/app/z3cform/widgets/contentbrowser.py @@ -12,6 +12,7 @@ from plone.base.navigationroot import get_navigation_root_object from plone.base.utils import get_top_site_from_url from Products.CMFCore.utils import getToolByName +from z3c.form.browser.object import ObjectWidget from z3c.form.interfaces import IEditForm from z3c.form.interfaces import IFieldWidget from z3c.form.interfaces import IForm @@ -152,9 +153,12 @@ def get_pattern_options(self): view_context = get_widget_form(self) # For EditForms and non-Forms (in tests), the vocabulary is looked # up on the context, otherwise on the view + if IEditForm.providedBy(view_context): if self.is_subform_widget(): view_context = self.form.parentForm.context + elif isinstance(self.form, ObjectWidget): + view_context = self.form.form.context elif not ISimpleItem.providedBy(context): view_context = self.form.context else: