2

Here is my custom control:

<?xml version="1.0" encoding="UTF-8"?>

<xbl:xbl xmlns:xhtml="http://www.w3.org/1999/xhtml"
         xmlns:xforms="http://www.w3.org/2002/xforms"
         xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:ev="http://www.w3.org/2001/xml-events"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:xxi="http://orbeon.org/oxf/xml/xinclude"
         xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
         xmlns:fr="http://orbeon.org/oxf/xml/form-runner"
         xmlns:saxon="http://saxon.sf.net/"
         xmlns:xbl="http://www.w3.org/ns/xbl">

    <metadata xmlns="http://orbeon.org/oxf/xml/form-builder">
        <display-name lang="en">Custom Controls</display-name>
    </metadata>

    <xbl:binding id="fb-input-country-selector" element="xforms|country-selector">
        <metadata xmlns="http://orbeon.org/oxf/xml/form-builder">
            <display-name lang="en">Country Selector</display-name>
            <icon lang="en">
                <small-icon>/forms/orbeon/builder/images/dropdown.png</small-icon>
                <large-icon>/forms/orbeon/builder/images/dropdown.png</large-icon>
            </icon>
            <datatype>xforms:string</datatype>
            <template>
                <xforms:select1 id="" appearance="minimal" ref="" xmlns="">
                    <xforms:label ref=""/>
                    <xforms:hint ref=""/>
                    <xforms:help ref=""/>
                    <xforms:alert ref="$fr-resources/detail/labels/alert"/>
                    <xforms:item>
                        <xforms:label>[Select...]</xforms:label>
                        <xforms:value/>
                    </xforms:item>
                    <xforms:itemset nodeset="doc('oxf:/apps/xforms-controls/services/countries.xml')/countries/country">
                        <xforms:label ref="name"/>
                        <xforms:value ref="us-code"/>
                    </xforms:itemset>
                </xforms:select1>
            </template>
        </metadata>
    </xbl:binding>
</xbl:xbl>

The problem is that the data items are not grabbed from the XML, but if I introduce the template itself in the form structure, it works.

Anyone have any ideea?

Alin Roman
  • 287
  • 2
  • 15

1 Answers1

3

Creating XBL components is tricky. At least the first time you do it. A few things:

  1. To avoid confusions, I recommend you define components in your own namespace. In the example below, I used xmlns:my="http://www.example.com/".
  2. The content of fb:template is how using the component looks like, not its implementation. So, it should look like:

    <fb:template>
        <my:country-selector>
            <xforms:label ref=""/>
            <xforms:hint ref=""/>
            <xforms:help ref=""/>
            <xforms:alert ref=""/>
        </my:country-selector>
    </fb:template>
    
  3. The implementation is inside xbl:template.

  4. So the component can be found at runtime, you need to place it in a directory xbl/my/country-selector/country-selector.xbl. The my part of the directory is mapped to the namespace by you adding the following property in your properties-local.xml:

    <property as="xs:string"  name="oxf.xforms.xbl.mapping.my"
                              value="http://www.example.com/"/>
    

    (Often, we use the same name for the directory and the prefix, but they don't need to be the same. E.g. the fr:* components are in a directory called orbeon.)

  5. So Form Builder shows your component in the sidebar, you need to add a property like:

    <property as="xs:string"  name="oxf.fb.toolbox.group.other.uri.*.*"
              value="oxf:/xbl/my/country-selector/country-selector.xbl"/>
    

And here is the full source for country-selector.xbl:

<xbl:xbl xmlns:xh="http://www.w3.org/1999/xhtml"
         xmlns:xforms="http://www.w3.org/2002/xforms"
         xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:ev="http://www.w3.org/2001/xml-events"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:xxi="http://orbeon.org/oxf/xml/xinclude"
         xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
         xmlns:my="http://www.example.com/"
         xmlns:saxon="http://saxon.sf.net/"
         xmlns:fb="http://orbeon.org/oxf/xml/form-builder"
         xmlns:xbl="http://www.w3.org/ns/xbl"
         xmlns:xxbl="http://orbeon.org/oxf/xml/xbl">

    <metadata xmlns="http://orbeon.org/oxf/xml/form-builder">
        <display-name lang="en">Custom Controls</display-name>
    </metadata>

    <xbl:binding id="my-country-selector" element="my|country-selector" xxbl:mode="lhha binding value">
        <fb:metadata>
            <fb:display-name lang="en">Country Selector</fb:display-name>
            <fb:icon lang="en">
                <fb:small-icon>/forms/orbeon/builder/images/dropdown.png</fb:small-icon>
                <fb:large-icon>/forms/orbeon/builder/images/dropdown.png</fb:large-icon>
            </fb:icon>
            <fb:datatype>xforms:string</fb:datatype>
            <fb:template>
                <my:country-selector>
                    <xforms:label ref=""/>
                    <xforms:hint ref=""/>
                    <xforms:help ref=""/>
                    <xforms:alert ref=""/>
                </my:country-selector>
            </fb:template>
        </fb:metadata>
        <xbl:template>
            <xforms:select1 appearance="minimal" ref="xxf:binding('my-country-selector')">
                <xforms:item>
                    <xforms:label>[Select...]</xforms:label>
                    <xforms:value/>
                </xforms:item>
                <xforms:itemset nodeset="doc('oxf:/forms/orbeon/controls/service/countries.xml')/countries/country">
                    <xforms:label ref="name"/>
                    <xforms:value ref="us-code"/>
                </xforms:itemset>
            </xforms:select1>
        </xbl:template>
    </xbl:binding>
</xbl:xbl>
avernet
  • 30,895
  • 44
  • 126
  • 163
  • Which Orbeon version have you tested this with? I'm trying this with Orbeon 4.5 with MySQL persistence layer and it doesn't seem to be working. Do you have any idea if something has changed in later Orbeon versions? – Christina May 27 '14 at 09:33
  • @Christina I posted this back in 2012, so this must have been tested on a pre-4.x release. What problem are you seeing when you try this? – avernet May 27 '14 at 17:11
  • Orbeon can't resolve my custom namespace so steps 4 and 5 above don't work. If I use the orbeon namespace for the xbl component and place it under xbl/orbeon/country-selector/country-selector.xbl everything works fine. – Christina May 28 '14 at 10:17
  • @Christina What do you mean by "Orbeon can't resolve my custom namespace"? What are you doing, and what is the error you're getting? – avernet May 29 '14 at 01:04