Providing URL Parameters for Multiple Document Data Sources

You’re no doubt used to seeing URLs to open a document that look like this: http://www.server.com/db.nsf/myPage.xsp?action=openDocument&documentId=0123456789ABCDEF0123456789ABCDEF in XPages. The documentId and action URL parameters are used by each document data source by default. In this post, I’ll show how you can use the requestParamPrefix property to define a separate set of URL parameters for an additional data source.

By default, a document data source will use the documentId and action parameters to determine the document to open and the edit mode. However, if you have more than one document data source on a page, this may not be the behavior that you want.

For example, I have a database with a simple XPage that has two document data sources for the Person form.

<xp:dominoDocument var="document1" formName="Person"
  action="openDocument">
</xp:dominoDocument>
		
<xp:dominoDocument var="document2" formName="Person"
  action="openDocument">
</xp:dominoDocument>

If I open the page with a standard URL, both display the same document.

http://www.server.com/db.nsf/TwoDataSources.xsp?documentId=9E9324F079A7F31885257D06007ADF9C&action=openDocument

requestParamPrefix_1_SameDocument

If I change the action parameter to editDocument, then both change to edit mode. Sounds like a great way to generate a save conflict!

ignoreRequestParams

Of course, this isn’t really what I want. One option to work around this is to set the ignoreRequestParams property of the document data source to true and compute the documentId property (and, optionally, the action property).

<xp:dominoDocument var="document2" formName="Person"
  action="openDocument"
  documentId="#{javascript:return '0123456789ABCDEF0123456789ABCDEF';}"
  ignoreRequestParams="true">
</xp:dominoDocument>

This is the method that I am in the habit of using and it works well when putting the ID in a scope variable and using that for the computed property value.

The ignoreReuqestParams property tells the data source to ignore the documentId and action properties in the URL and leaves it up to you to manage them.

(Note: Even if you compute the documentId, it will not matter if you don’t set ignoreRequestParams to true; the URL parameters will still override the property value.)

requestParamPrefix

However, there is another way to handle this situation without computing the data source properties — the requestParamPrefix property.

You can set this on a data source and it will look for a separate copy of the documentId and action parameters and use them for that specific data source.

For example, if I set the requestParamPrefix to doc2_, then it will look for URL parameters named doc2_documentId and doc2_action and use those for this data source.

You can add the parameter directly in the page source or find it in the properties panel under All Properties > data > data > [data source]. (This assumes the data source is at the page level. If it’s on a panel, then that would be your starting point to find the data source properties.)

requestParamPrefix_2_requestParamPrefix

Now, I can open two different documents on the same page with a URL like this:

http://127.0.0.2/BlogTesting.nsf/TwoDataSources.xsp?documentId=9E9324F079A7F31885257D06007ADF9C&action=openDocument&doc2_documentId=01F564DFFEE4307A85257D06007AED1D&doc2_action=editDocument

requestParamPrefix_3_SeparateDocuments

With this approach, you do not need to set ignoreRequestParams to true. In fact, if you do, then the URL parameters will be ignored — even if they contain the specified prefix.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: