So this is article is to expand a little on the post I shared on Friday about my demo failure at IBMConnect. I will demonstrate why the problem occurred and what you can do about it. ALL thanks go to Simon Reid who pointed me at the reason once I had found the fix.
The Problem
I had a demonstration http://demo.xomino.com database which shows how some jQuery plugins can be used in XPages. The links within the menu “were” constructed as follows:
isExternal:=@If(@Right(Link; "http")!=""; @True; @False); theLink:="<a href=\""+@If(isExternal; Link; "/"+@WebDbName+Link)+"\">"+LinkTitle+"</a>"; "<p>" + theLink+"</p>"+@NewLine
The point of this was to open up a link to an external site correctly and point a link to this database appropriately. The use of “/”+@WebDbName is to ensure that the database would still work when it was download and put on someone else’s server.
Works like a charm in the web
FAILED in XPinc
The Reason
As Simon Stated in his reply to my previous post – the XPiNC browser adds a /xsp/ to the front of the url.
To prove this I created a very simple link in an XPage:
<a href="javascript: alert(location.href)>Click Me</a>
And when I clicked the link in the XPiNC browser I got this…
And look at that “/xsp/xomino/jQinX.nsf” – there it is the xsp added to the URL
that is NOT what @WebDBName returns (/xomino/jQinX.nsf) and that is the root cause of the fail.
The Solution
There are a number of solutions and it really depends on what works for you – the fact that you are reading this you know about the issue and you need to work out which solution is best for you – here are some options if you need XPiNC support:
- Don’t user @WebDbName to get the database path – plain and simple.
- If you are able to – compute the links to the other XPages using the link control. I personally despise the link control because it is limiting and does not slot well into jQuery plugins – but it is an option.
The following code creates a link to the LongPress demo page – this works in XPiNC and on the Web
<xp:link escape="true" text="Long Press Link" id="link2" value="/xLongPress.xsp" title="Long Press Link"></xp:link>
The link created looks like this in XPiNC
<a id="view:_id1:_id2:_id52:link2" href="/xsp/xomino%5CjQinX.nsf/xLongPress.xsp" class="xspLink" title="Long Press Link">Long Press Link</a>
And looks like this in a browser
<a id="view:_id1:_id2:_id52:link2" href="/xomino/jQinX.nsf/xLongPress.xsp" class="xspLink" title="Long Press Link">Long Press Link</a><br>
Unfortunately I want my links in documents in a view so that I can look them up – so I can’t use the xp:link
Here are some other options
- Use links which are not relative to the databasePath on the server. In my case I changed the menu links to be relative to each other “xPageSlide.xsp” rather than /xomino/jQinX.nsf/xPageSlide.xsp
- Use jQuery or dojo to do some form of XPiNC detection and manipulate the links after they have been sent to the page. You could do this by detecting if /xsp/ was the start of your location.path variable and adding it to all the link you cared about – this is dangerous and risky – not favorite which is also why I have no example.
Conclusion
The XPiNC browser adds /xsp/ to the front of all URLs – be aware of it
The solution depends on your needs – but for normal links to other XPages use the xp:link control which will do the link figuring out on it’s own
If I had not presented this and FAILED at IBMConnect I would not have had the conversation about it – and would not have learned something very important like this – AWESOME!
General Comment
How you deal with failure says a lot about your personality – if it drives you to be better then good for you.
This failure is a learning experience which was handled on stage by laughter, and I hope by this blog post as a learning experience for all 🙂