The Binds - Eonic/ProteanCMS GitHub Wiki
In XForms, the <bind> element connects the form controls (UI components) to the data instance, allowing you to define the structure and rules for data processing.
The <bind> elements are traditionally placed directly after the <instance> element. This structure ensures that all binds are linked to their corresponding instance fields and can enforce validation, constraints, and other behaviors on the data.
<bind id="dPublishDate" nodeset="dPublishDate" required="false()" type="string"/>-
id:
dPublishDate– This identifies the bind and links it to a control in the form. -
nodeset:
dPublishDate– This links the bind to the corresponding field in the instance.
Each <bind> element can contain several attributes, which define how the data is processed and validated. Here's an explanation of the key attributes:
- A unique reference that connects the bind to a form control.
- An XPath expression that links the bind to a value in the instance. It can reference a node or attribute in the XML instance.
- Supports XPath expressions to dynamically reference parts of the XML structure.
- Binds can be nested, allowing the
nodesetvalue to be concatenated from parent binds.
- An XPath expression that determines if the field is mandatory.
-
required="true()": The field is required. -
required="false()": The field is not required (default if not specified). -
required="/nodename[@myvalue='yes']": The field is required only if the XPath condition is met (e.g.,nodename/@myvalueequalsyes).
Note: The
requiredattribute can evaluate complex XPath expressions that compare multiple fields and returntrueorfalse.
- An XPath expression that enforces validation rules on the field.
- Example constraints:
-
constraint="nodename/@value = ''": The field is valid only ifnodename/@valueis empty. -
constraint="nodename/@value > '10'": The field is valid only ifnodename/@valueis greater than 10. -
constraint="nodename/@value1 = nodename/@value2": The field is valid only if two values are equal.
-
Note: Remember to account for namespaces in your XPath expressions when working with XML instances.
- Automatically computes the value of the field based on an XPath expression. It can derive values from other parts of the instance.
- Example:
calculate="tblContent/cContentName"– The field will be populated based on the content of the specified node.
- Specifies the data type of the field. The most common types include:
string-
floatornumber dateemail-
xml-replace(for XML fragments) -
imgVerification(for image verification scenarios) fileUpload-
format:RegExp(for validating input using regular expressions) -
reValidateUser(for confirming a user’s password during sensitive operations)
Example:
type="string"defines a field that expects a string value.
type="format:^[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}$" should test for a GUID
The reValidateUser type is used when a form requires the user to re-enter their password before performing a sensitive operation, such as deleting content. It validates the password against the currently logged-in user’s credentials.
<?xml version="1.0" encoding="utf-8"?>
<Content type="xform" name="EditContent">
<model>
<instance>
</instance>
<submission id="EditContent" action="" method="post" event="return form_check(this)"/>
<bind nodeset="tblContent">
<bind id="cContentHeadline" nodeset="cContentName" required="true()" type="string"/>
<bind id="dPublishDate" nodeset="dPublishDate" required="false()" type="string"/>
<bind id="dExpireDate" nodeset="dExpireDate" required="false()" type="string"/>
<bind id="nStatus" nodeset="nStatus" required="true()" type="string"/>
<bind id="cDescription" nodeset="cDescription" required="false()" type="string"/>
<bind nodeset="cContentXmlBrief/Content">
<bind id="cContentHeadline" nodeset="Headline" required="true()" type="string"/>
<bind id="dPublishDate" nodeset="PublishDate" required="false()" type="string"/>
<bind id="cContentStrapline" nodeset="Strapline" required="false()" type="string"/>
<!--bind id="cContentHeadline" nodeset="Images/img[@class='thumbnail']/@alt" required="false()" type="string"/-->
<bind id="cContentThumbnail" nodeset="Images/img[@class='thumbnail']" required="false()" type="xml-replace"/>
</bind>
<bind nodeset="cContentXmlDetail/Content">
<bind id="cContentHeadline" nodeset="Headline" required="true()" type="string"/>
<bind id="dPublishDate" nodeset="PublishDate" required="false()" type="string"/>
<bind id="cContentStrapline" nodeset="Strapline" required="false()" type="string"/>
<bind id="cContentThumbnail" nodeset="Images/img[@class='thumbnail']" required="false()" type="xml-replace"/>
<bind id="cContentDetail" nodeset="Images/img[@class='display']" required="false()" type="xml-replace"/>
<bind id="cContentBody" nodeset="Body" required="false()" type="string"/>
</bind>
<bind id="dPublishDate" nodeset="dPublishDate" required="false()" type="string"/>
</bind>
</model>
</Content>
This section illustrates how binds are used within a typical XForm, covering multiple nodesets and nested bindings.
This guide provides a concise and clear overview of the <bind> element in XForms, its attributes, and how to use it effectively in form definitions.