Conditional Fields in Dexterity Schema

That's really easy.
Register a custom form and override the widget:

<browser:page
    name="edit"
    for="my.site.content.foo.IFoo"
    layer="my.site.interfaces.IMySiteLayer"
    class=".foo.FooEditForm"
    permission="cmf.ModifyPortalContent"
    />
# -*- coding: utf-8 -*-
from plone.dexterity.browser import edit

class FooEditForm(edit.DefaultEditForm):

    def updateWidgets(self):
        super(FooEditForm, self).updateWidgets()
        parent = self.context.__parent__
        if getattr(parent, 'whatever', None):
            self.widgets['description'].mode = 'hidden'

The same works with addforms as well but is a bit different:

<adapter
    for="Products.CMFCore.interfaces.IFolderish
         my.site.interfaces.IMySiteLayer
         plone.dexterity.interfaces.IDexterityFTI"
    provides="zope.publisher.interfaces.browser.IBrowserPage"
    factory=".foo.AddView"
    name="foo"
    />
<class class=".foo.AddView">
    <require
        permission="cmf.AddPortalContent"
        interface="zope.publisher.interfaces.browser.IBrowserPage"
        />
</class>

and the form:

from plone.dexterity.browser import add

class AddForm(add.DefaultAddForm):
    portal_type = 'foo'

    def updateWidgets(self):
        super(AddForm, self).updateWidgets()
        if getattr(self.context, 'whatever', None):
            self.widgets['description'].mode = 'hidden'

class AddView(add.DefaultAddView):
    form = AddForm
3 Likes