Client project: XPages CMS for company website

My company PHL Consult completed another client project last week involving XPages. The purpose of the project was to modernize an existing Lotus Domino company website by creating a new XPages solution with a related Lotus Notes client CMS for article editing and related content handling (such as menus, graphics, and meta data) – and by using XPages to allow the website to utilize CSS for cross browser compatibility.

The client is Mediaplus.dk and this is an interesting company that takes advantage of Lotus Notes and Domino to offer a CRM solution called Mediaplus CRM targeted at supermarket and grocery store suppliers.

The Mediaplus.dk website

The design for the website was created by Thomas Arendt from Make Your Mark. Based on his design guide I was then responsible for creating the necessary CSS to allow the design to be implemented. The CSS extends the IBM OneUI v2 CSS (although you need to look in the HTML and CSS source to tell).

The CMS includes functionality to improve search engine ranking by providing a sitemap for e.g. Google Webmaster Tools, by using meta tags such as description and robots and by providing useful page titles. These are all small but useful extensions to a website if you want to improve search engine rankings.

Client project: XPages CMS and web shop with card payment

A project for one of my clients went live last week. It’s a portal on heart failures and defibilator products with a related web shop where you can buy automated external defibrillators (AEDs) and accessories. The portal is in Danish.

My company PHL Consult was responsible for the implementation of the portal while Supermouse design studio was responsible for the design.

The portal is built entirely on Lotus Domino XPages and features a content management system (CMS) and a web shop.

The CMS is controlled from the Lotus Notes client.

The web shop is integrated with the client’s existing backend product catalog, CRM and ordering system which runs as standard Lotus Notes client only applications on an internal Lotus Domino server. Furthermore, the web shop is integrated with a payment card gateway from the Danish provider DIBS. The use of a payment card gateway effectively shields off the PCI requirements on e.g. encryption of card numbers from the shop and the client.

XPages custom 404 and error page

This post is about creating a custom error page for handling errors (both controlled errors and not controlled errors) in XPages.

For handling errors in non-XPages requests a non-XPages 404/error page has to be added. To create a custom non-XPages error page, see the Help topic “Custom Web server messages” in Domino Administrator or have a look at this great article by Julian Robichaux on Lotus Domino custom web error pages.

First step for handling errors in XPages requests is to create the  XPage to be used. This XPage can be styled as you wish and you will probably reuse your overall site design – for instance by reusing custom controls that controls the look and feel of your web pages.

To catch controlled errors such as “page not found” errors (to “simulate” a HTTP 404 response) you can use a try/catch statement to redirect to the new XPage in case of “page not found” related errors on your XPage. This can be used to catch errors with data sources where the document id can not be found. The following example code from the documentId part of dominoDocument data source redirects to a custom XPage in case an article id can not be found:

try {
	var tempView:NotesView = database.getView("webpages-by-id");
	var tempDoc:NotesDocument = tempView.getDocumentByKey(param.id);
	return tempDoc.getUniversalID();
} catch(e) {
	context.redirectToPage("error.xsp")
}

The new XPage can also be used instead of the default error page to catch not controlled errors (errors/exceptions in your code). See this article on XPages error management in the Lotus dev wiki. In short, you need to add a computed field that display the value of the request scope variable “error”. The following example code displays the error message in a panel that is only displayed f the scoped variable “error” is present:

<xp:panel id="displayErrors">
	<xp:this.rendered>
		<![CDATA[#{javascript:if (requestScope.containsKey("error")) {
		return true;
		} else {
		return false;
		}}]]>
	</xp:this.rendered>
	<p>
		<b>Description of error:</b>
		<xp:br></xp:br>
		<xp:text escape="true" id="displayError" value="#{requestScope.error}"></xp:text>
	</p>
</xp:panel>

If you want to provide more detailed error messages on this error page, you can add the following computed field:

<xp:text escape="true" id="computedField">
	<xp:this.value>
		<![CDATA[#{javascript:var stackTrace ="";
		var trace = requestScope.error.getStackTrace() ;
		for( var i = 0; i < trace.length; i++){
		stackTrace += trace[i] + '\n';
		}
		return stackTrace;
		}]]>
	</xp:this.value>
</xp:text>

Please consider whether these detailed error messages are something that you would like to present to the users.

A better approach to displaying detailed error messages to your users would be to use logging in your application and then log the detailed error messages and instead present a user friendly error page. Matt White has integrated the OpenLog OpenNTF project with XPages in the TaskJam OpenNTF project. I will definitely have a look at this in the very near future.

XPages cheat sheet

David Leedy has just announced that his XPages cheat sheet will be available for handout at Lotusphere 2011. I can confirm that it is a useful cheat sheet because David involved me in a 2 hour review of the cheat sheet. It was great fun and I am pleased to have been involved in putting the cheat sheet together.

Now I just need someone from the Lotus community to grab me a copy of the handout at Lotusphere that can replace my self-printed copy. Anyone? 🙂

Below is a sneak peek at the cheat sheet courtesy of David Leedy. You will have to wait for Lotusphere 2011 for the real thing:

Update January 21: David has released the XPages cheat sheet a little earlier. Go grab your copy!

Presentation: My view on XPages

I was asked by one of my customers to present my view on XPages and my experience with XPages to their development team. The development team had no experience with XPages but instead with classic Lotus Domino development. I gave the presentation on January 6 and the majority of the presentation consisted of live demos of XPages functionality to show the team how easy it is to use modern web technologies such as Ajax for a Lotus Domino web application.

The presentation is available on Slideshare:

The presentation makes most sense when seen live together with the live demos. Maybe a topic for a video podcast someday? 🙂

Update: Erik Brooks pointed out in the comments that with 8.5.2 it is now possible to call Lotusscript agents from XPages – thereby making reuse of existing backend Lotusscript code possible. The App Dev wiki has more information on the use of Agent.runWithDocumentContext(). I have updated my presentatio on Slideshare to reflect this. Thanks Erik.

HTTP request consumer in XPages

Chris Toohey recently posted an example of a simple HTTP request consumer using a traditional (classic) Lotus Notes/Domino agent. I had a need for a similar solution in XPages – and since Chris never posted his follow-up post on the XPages version I had to do it myself 🙂

The HTTP request consumer is used by a 3rd party callback service to report back the status of (in my case) a HTTP form post submitted earlier by my app to that service.

The XPages solution is a simple XPage that uses the afterRenderResponse event to gather fields returned and display a related response to the user – including displaying a useful error message to the user in case the callback service misses important fields. The HTTP request parameters (form fields) are retrieved using param.get(‘<field>’). The HTTP request parameters can be GET parameters (e.g. http://hostname.com?p1=v1&p2=v2) or POST parameters.

Basic code example for the afterRenderResponse event:

try {

var exCon = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = exCon.getResponse();
response.setContentType(“text/html”);
writer.write(“” + “\n”);
writer.write(“” + “\n”);
writer.write(“” + “\n”);
writer.write(“” + “\n”);

// Read the HTTP request parameters
var _param1 = param.get( ‘test1’ );
var _param2 = param.get( ‘test2’ );

// then do whatever is needed with the HTTP request parameters – e.g. print the contents of the parameters in the response.
writer.write(“<p>Parameter 1: ” + _param1 + “</p>\n”);
writer.write(“<p>Parameter 2: ” + _param2 + “</p>\n”);

writer.write(“” + “\n”);
writer.write(“” + “\n”);
writer.endDocument();
facesContext.responseComplete();

} catch(e) {

_dump(e);

}

My first two months as self-employed consultant

This is a followup to my first two weeks as self-employed consultant at PHL Consult.

2 months have now passed since I started as full-time consultant at PHL Consult – and I am really enjoying it! It has been exciting to focus on my own business and see the immediate results of actions that I take. I have been in discussions with several potential customers and potential business partners about projects where I can offer my services. Some of these discussions has turned into real work for me and I am happy to say that I now have more than just the one customer I started with 2 months ago. The new customers and new projects are primarily focused around Domino administration (setting up new servers, upgrading existing servers) and around modern web development using XPages.

Almost all of my meetings with new and potential customers have been set up through my social network. This really shows that networking is very important for establishing business contacts. One customer, however, contacted me because they found PHL Consult through a Google AdWords ad when using Google to search for a Lotus Domino consultant. I have set up some Google AdWords ads because Google sent me a free trial of ads for $100. So maybe I should consider using AdWords when my free trial has been spent.

Starting a full-time business also require that I take care of administrative tasks. I have had meetings with my accountant to discuss the structure of my business and have decided to go with a one-man business setup (instead of setting up for instance a limited liability company). I have also talked with insurance companies in order to establish necessary company insurances to cover professional liability and business property such as my IT hardware.

I participated in the 44th DanNotes Lotus user group conference in early November. It was great to meet many of the Danish Lotus customers, Lotus business partners and Lotus consultants. I am also still an active member of the Danish Notesnet group of Lotus specialists.

My first 2 weeks as a self-employed consultant

I started as self-employed full-time consultant on October 18 – and today the first 2 weeks has passed. So how did they go?

I have started working on my first XPages project for my first client. The project is currently in the design and early implementation phase and I have therefore been to a design workshop with Supermouse who is responsible for the information architecture and UI design. I find it very interesting to learn more about XPages and to apply it to a real project.

I was invited as special guest to IBM Hackday 8 at IBM in Copenhagen. It was a fun day with a lot of mobile app discussions including looking at Titanium Appcelerator and how it can be used to develop iPhone and Android applications.

I went to my first all-day Notesnet.dk monthly meeting – and it was nice to meet many of the Notesnet.dk members. I hope to have the opportunity to work with some of my Notesnet.dk colleagues someday on shared projects.

I took part in the recording of episode 24 for one of my favorite podcasts: This Week in Lotus. It was great fun to record the podcast together with Stuart McIntyre, Darren Duke and Joyce Davis.

All in all, I have enjoyed the first 2 weeks as self-employed consultant at PHL Consult.

Welcome to the opening of PHL Consult

It’s October 18! Today is my first day as a full time consultant in my own company PHL Consult – where I am going to primarily work with Lotus Notes and Domino based solutions. Feel free to take a look around the new offices 🙂

For my first project for a client I am going to work with XPages. I look forward to the challenge of both learning a lot more about XPages and of implementing the web site for the client.

Let me know if I can provide you with my assistance. Thanks.