Dexterity XML¶
A reference for Dexterity’s XML name spaces
Introduction¶
The schema (structure) of a Dexterity content type may be detailed in two very different ways:
In Python as a Zope schema; or,
In XML
When you are using Dexterity’s through-the-web schema editor, all your work is being saved in the content type’s Factory Type Information (FTI) as XML.
plone.supermodel
dynamically translates that XML into Python objects which are used to display and edit your content objects.
The XML model of your content object may be exported from Dexterity and incorporated into a Python package. That’s typically done with code like:
class IExampleType(form.Schema):
form.model("models/example_type.xml")
or:
from plone.supermodel import xmlSchema
IExampleType = xmlSchema("models/example_type.xml")
XML models in a package may be directly edited.
This document is a reference to the tags and attributes you may use in model XML files. This includes several form-control and security-control attributes that are not available through the TTW schema editor.
XML Document Structure¶
Dexterity requires that its model XML be well-formed XML, including name space declarations. The typical structure of a Dexterity XML document is:
<?xml version="1.0" encoding="UTF-8"?>
<model xmlns="http://namespaces.plone.org/supermodel/schema"
xmlns:form="http://namespaces.plone.org/supermodel/form"
xmlns:security="http://namespaces.plone.org/supermodel/security">
<schema>
<field type="zope.schema.TextLine" name="one">
<title>One</title>
... More field attributes
</field>
... More fields
</schema>
</model>
Only the default name space (…/supermodel/schema) is required for basic schema.
The supermodel/form
and supermodel/schema
provide additional attributes to control form presentation and security.
supermodel/schema fields¶
Most of the supermodel/schema field tag and its attributes map directly to what’s available via the TTW schema editor:
<field name="dummy" type="zope.schema.TextLine">
<default>abc</default>
<description>Test desc</description>
<max_length>10</max_length>
<min_length>2</min_length>
<missing_value>m</missing_value>
<readonly>True</readonly>
<required>False</required>
<title>Test</title>
</field>
The field type
needs to be the full dotted name (as if it was being imported in Python) of the field type.
Fieldsets¶
It’s easy to add fieldsets by surrounding embedding fields tags in a fieldset
block:
<schema>
...
<fieldset name="test"
label="Test Fieldset"
description="Description of test fieldset">
<field name="three" type="zope.schema.TextLine">
<description/>
<title>Three</title>
</field>
<field name="four" type="zope.schema.TextLine">
<description/>
<title>Four</title>
</field>
</fieldset>
...
</schema>
Vocabularies¶
Vocabularies may be specified via dotted names using the source
tag:
<field name="dummy" type="zope.schema.Choice">
<default>a</default>
<description>Test desc</description>
<missing_value/>
<readonly>True</readonly>
<required>False</required>
<title>Test</title>
<source>plone.supermodel.tests.dummy_vocabulary_instance</source>
</field>
Where the full Python dotted-name of a Zope vocabulary in a package:
from zope.schema.vocabulary import SimpleVocabulary
dummy_vocabulary_instance = SimpleVocabulary.fromItems([(1, 'a'), (2, 'c')])
Or, a source binder:
<field name="dummy" type="zope.schema.Choice">
...
<source>plone.supermodel.tests.dummy_binder</source>
</field>
With Python like:
from zope.schema.interfaces import IContextSourceBinder
class Binder(object):
implements(IContextSourceBinder)
def __call__(self, context):
return SimpleVocabulary.fromValues(['a', 'd', 'f'])
dummy_binder = Binder()
You may also use the vocabulary
tag rather than source
to refer to named vocabularies registered via the ZCA.
Internationalization¶
Translation domains and message ids can be specified for text that is interpreted as unicode. This will result in deserialization as a zope.i18nmessageid message id rather than a basic Unicode string.
Note that we need to add the i18n namespace and a domain specification:
<model xmlns="http://namespaces.plone.org/supermodel/schema"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="your.application">
<schema>
<field type="zope.schema.TextLine" name="title">
<title i18n:translate="yourapp_test_title">Title</title>
</field>
</schema>
</model>
supermodel/form attributes¶
supermodel/form provides attributes that govern presentation and editing.
after/before¶
To re-order fields, use form:after
or form:before
.
The value should be either '*'
, to put the field first/last in the form,
or the name of a another field. Use '.fieldname'
to refer to field in the
current schema (or a base schema). Use a fully prefixed name (e.g.
'my.package.ISomeSchema'
) to refer to a field in another schema. Use an
unprefixed name to refer to a field in the default schema for the form.
Example:
<field type="zope.schema.TextLine"
name="one"
form:after="two">
<title>One</title>
</field>
mode¶
To turn a field into a view mode or hidden field, use form:mode
. The
mode may be set for only some forms by specifying a form interface in the
same manner as for form:omitted
.
Example:
<field type="zope.schema.TextLine"
name="three"
form:mode="z3c.form.interfaces.IEditForm:input">
<title>Three</title>
</field>
omitted¶
To omit a field from all forms, use form:omitted="true"
. To omit a field
only from some forms, specify a form interface like
form:omitted="z3c.form.interfaces.IForm:true"
. Multiple interface:value
settings may be specified, separated by spaces.
Examples:
<field type="zope.schema.TextLine"
name="one"
form:omitted="true">
<title>One</title>
</field>
<field type="zope.schema.TextLine" name="three"
form:omitted="z3c.form.interfaces.IForm:true z3c.form.interfaces.IEditForm:false"
>
<title>Three</title>
</field>
The latter example hides the field on everything except the edit form.
widget¶
To set a custom widget for a field, use form:widget
to give a fully
qualified name to the field widget factory.
Example:
<field type="zope.schema.TextLine"
name="password"
form:widget="z3c.form.browser.password.PasswordFieldWidget">
<title>One</title>
</field>
Dynamic Defaults¶
To set a dynamic default for a field, use a defaultFactory
tag to
give a fully qualified name for a callable. The defaultFactory callable must
provide either plone.supermodel.interfaces.IDefaultFactory or
zope.schema.interfaces.IContextAwareDefaultFactory.
Example:
<field type="zope.schema.TextLine" name="three">
<title>Three</title>
<defaultFactory>plone.supermodel.tests.dummy_defaultFactory</defaultFactory>
</field>
Sample Python for the validator factory:
@provider(IDefaultFactory)
def dummy_defaultFactory():
return u'something'
For a callable using context:
@provider(IContextAwareDefaultFactory)
def dummy_defaultCAFactory(context):
return context.something
Note
The defaultFactory
tag was added in plone.supermodel 1.2.3,
shipping with Plone 4.3.2+.
validator¶
To set a custom validator for a field, use form:validator
to give a fully
qualified name to the field validator factory. The validator factory should be
a class derived from one of the validators in z3c.form.validator.
Example:
<field type="zope.schema.TextLine"
name="three"
form:validator="plone.autoform.tests.test_utils.TestValidator">
<title>Three</title>
</field>
Sample Python for the validator factory:
class TestValidator(z3c.form.validator.SimpleFieldValidator):
def validate(self, value):
super(TestValidator, self).validate(value)
raise Invalid("Test")
supermodel/security attributes¶
read-permission/write-permission¶
To set a read or write permission, use security:read-permission
or
security:write-permission
. The value should be the name of an
IPermission
utility.
Example:
<field type="zope.schema.TextLine"
name="one"
security:read-permission="zope2.View"
security:write-permission="cmf.ModifyPortalContent">
<title>One</title>
</field>