The @ClientType formula provides an interesting behaviour: If you add the value to a label, the result will be as expected. It returns “Web” in Browser and returns “Notes” in XPiNC.
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:label value="#{javascript:@ClientType()}" id="label1" />
</xp:view>
But if you add it to a computed field on a form and use this form in a datasource, the result in XPiNC is not „Notes„, it is „None“ instead. In the following example, the form „Test“ has a computed field named „ClientType„. The value of the field is @ClientType.
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="Test"
computeWithForm="onload">
</xp:dominoDocument>
</xp:this.data>
<xp:label value="#{javascript:@ClientType()}" id="label1" />
<xp:br />
<xp:label id="label2">
<xp:this.value>
<![CDATA[#{javascript:
document1.getItemValueString("ClientType")
}]]>
</xp:this.value>
</xp:label>
</xp:view>
[The computeWithForm property of the datasource has to be set to „onload“ or „onsave„. If set to „onboth“ this will not work.]
This behaviour gives you control about the subforms which are used in the form, depending of the client and/or technology. Just add a computed subform to your form and add a @Formula like this:
@If( @ClientType="Web";"WebAccess"; @ClientType="Notes";"NotesAccess"; "XPiNCAccess" )
This allows you to add specific fields to a document, or can help to identify the way how the document was created. If you add a field in the querySave event on the XPage, you can identify if this document was created in the web by XPage or old-school web access of the form.
<xp:this.data>
<xp:dominoDocument var="document1" formName="Test"
computeWithForm="onsave">
<xp:this.querySaveDocument>
<![CDATA[#{javascript:
document1.replaceItemValue("ClientTypeXPage", "1"))
}]]>
</xp:this.querySaveDocument>
</xp:dominoDocument>
</xp:this.data>
By extending the subform computation, you can use a subform for every type of access:
@If( @ClientType="Web" & ClientTypeXPage="1";"XPageWebAccess"; @ClientType="Web";"WebAccess"; @ClientType="Notes";"NotesAccess"; "XPiNCAccess" )