Partial update without validation

Hvis du bruger Server Side Validation og benytter Partial Update så kan du få problemer hvis ikke du sætter kryds i ‘Process Data Without Validation

Eksempel Forestil dig en XPage med følgende indhold:
  • Et required indtastningsfelt (Server Side validation er enabled) – samt et Error Message felt der viser evt. fejl
  • En knap der via SSJS ændre indholdet af et andet felt via en Partial Update.
Når du klikker på knappen, så sendes siden til serveren hvor den først valideres. Hvis valideringen fejler, så skrives fejlen i Error feltet og resultatet sendes tilbage til browseren. Men i det der kun laves en partial update, så bliver Error message feltet ikke opdateret. Men andre ord: Der sker ingenting….

Designer Perspective

I 8.5.3 er der kommet nye ‘Perspectives’ i designer klienten. Du kan skifte til et andet perspecive ved at vælge: ‘Window, Open Perspective

‘Domino Designer’ er den du kender, ‘Forms/Views’ er til traditionel Notes udvikling – her er alle de overflødige vinduer fjernet, og endelig er der ‘XPages’ perspektivet.

Hvis din outline ikke bliver opdateret efter du har skiftet perspektiv, så skal du blot give den fokus (klik i vinduet) og tast F9 for at opdatere (mon ikke det bliver automatisk i en senere version)

 

OneUI version 2.1

Fra Notes 8.5.3 er der kommet OneUI 2.1

For at bruge det, så skal du i dit theme skrive:

<theme extends="oneuiv2.1" ...

Eller hvis du ønkser en af de forskellige farvekombinationer: Blue, Gold, Green, Onyx, Orange, Pink, Purple, Red eller Silver: oneuiv2.1_<colorname>

OneUI 2.1 introducere et helt nyt look and feel (klik for at se i fuld størrelse):

Til sammenligning, så ser OneUI 2 sådan ud:

Links

Server Side Java Script – lidt for meget op ad bakke…

Find the bug

Server Side Java Script: Næsten umuligt at debugge 🙁

Se dette eksempel – en simpel @DbColumn i et computet text felt

@DbColumn( @DbName, "(view)", 1)
Her er der en kritisk fejl:
  • Der mangler paranteser efter @DbName()

Men der kommer ingen fejlbeskeder – @DbColumn funktionen returnerer blot ‘undefined’. Samme fejl som hvis jeg havde angivet et ikke eksisterende view – eller lavet en DbLookup med en illegal key. I Log.nsf kommer denne fejl som ikke hjælper meget:

21-11-2011 15:00:25   HTTP JVM: com.ibm.xsp.webapp.FacesServlet$ExtendedServletException: com.ibm.xsp.exception.EvaluationExceptionEx: Error while executing JavaScript computed expression
21-11-2011 15:00:25   HTTP JVM: CLFAD0134E: Exception processing XPage request. For more detailed information, please consult error-log-0.xml located in d:/Lotus/Domino/Data/domino/workspace/logs

Der står ikke hvor eller hvad fejlen er – men blot en henvisning til en lokal log fil på serveren som jeg ikke har adgang til.

Konklusion:
  • Med SSJS arbejder du ‘i blinde’ – ofte får du inge hjælp til hvad der er galt
  • I bedste fald kan du fejlsøge med print() statements – men i det viste eksemple vil det ikke hjælpe meget.
  • Personligt vil jeg derfor holde SSJS til et minimun – dvs. kun til simple onliners. Alt andet vil jeg fremover lave i Lotus Script (eller evt. i Java)

Felt validering

Anbefaling: Brug Server Side validators. Koster lidt performance (roundtrip to the server) men giver bedre UI, mere konsistent kode og generelt flere muligheder.

Validators findes på feltet under ‘All properties, Data‘ – her kan både simple (f.eks. required field) og advanced/custom valaidators tilføjes til feltet.

Server-side validering enables ved at sætte ‘Client Validation=Off’ på Application Properties for XPages:

Required fields, best practice – vis et ‘required’ ikon efter ledeteksten:
  • Ledetkester, give dem en class/style=required
  • Tilføj denne linie til dit stylesheet:
    required {background:url('required.gif') no-repeat right top; padding-right:15px;}
  • Importer dette billede som image resource: 
Læs disse inden du går igang:

Til validering af datoer kan du måske finde hjælp i denne XSnippet

Favorite icon

Du kan angive et ‘Favorite Icon’ to steder:

  • På den enkelte XPage. Dette gøres under All Properties hvor du kan angive et ‘Page Icon
  • Alternativt kan du gøre det i dit Theme. Hermed vil ikonet blive brugt på alle dine XPages. Følgende kode er fundet på ‘Accessing an Image Resource as a Favicon on XPages
    <control>
    <property>
    <name>pageIcon</name>
    <value>favicon.ico</value>
    </property>
    </control>
  • Billeder kan evt. konverteres til .ICO med denne Online Image Converter

Brug LotusScript på dine XPages

Hvorfor bruge LotusScript på XPages når SSJS eller Java preformer langt bedre?

  • LotusScript kan debugges – det kan SSJS ikke.
  • Genbrug af eksisterende LotusScript biblioteker og forretningslogik
Du kan bruge LotusScript på flere måder:
  1.  Lav en LotusScript agent og kør den på dit XPage dokument – f.eks. ved save eller load. Se hvordan i dette indlæg: XPages and Calling Agents Using an In-Memory Document
  2. Lav et AJAX kald til en LotusScript agent (mere info om retur værdier her)
Eksempel: QuerySave agent
  1. Lav en ny LotusScript agent.
  2. I agent properties: Sæt target = “none” og check i ‘Run as Web User
  3. Check rettigheder på server dokumentet: Signer skal være inkluderet i ‘Sign agents or XPages to run on behalf of the invoker’
  4. Brug session.documentContext for at få fat i ‘In Memory XPage dokumentet’
    Set doc = session.documentContext
Sådan kaldes agenten; nedenstående kode er indsat i event ‘querySaveDocument’ på en XPage eller Custom Control:
var agentName:String = "save";
var agent:NotesAgent = database.getAgent(agentName);
if (agent != null) {
	agent.runWithDocumentContext(currentDocument.getDocument(true));
}

Bemærk at getDocument(true) kaldes med en parameter – det er for at sikre at dokumentet er opdateret med brugerens ændringer.

Eksempel: Kald LotusScript med AJAX

En anden mulighed er at køre din LotusScript agent med et AJAX kald. Her et eksempel hvor agenten køres ved klik på en knap og resultatet skrives i subject feltet på formen:

  • Indsæt et ’subject’ felt på din XPage
  • Indsæt en knap og skriv følgende kode i knappen OnClick event (Client Side Java Script):
    dojo.xhrGet({
    	url: "ajax?openagent",
    	preventCache: true,
    	handleAs: "text",
    	load: function(data) {
    		var targetNode = dojo.byId("#{id:subject}");
    		targetNode.value = data;
    	},
    	error: function(data) {
    		alert("There has been an error: " + data);
    	}
    });

Ovenstående kode kalder en agent med navnet ‘ajax’ Agenten returnere data via almindelige Print statements. Retur værdien overføres tilsidst til subject feltet. Se også dojo.xhrGet.

Links:

Lav XPage agenter

I stedet for at lave en LotusScript agent (f.eks. til at returnere xml eller data til et Ajax kald) så kan man lave en Server Side Java Script ‘agent’ på en XPage. Fordelene er mange

  • Langt bedre performance
  • Adgang til scoped variables
  • Nem integration til Java
For at lave en XPage agent, så skal du gøre følgende:
  1. Lav en ny XPage
  2. Sæt ‘Rendered=False’
  3. Lav din SSJS kode under ‘Events, Page, afterRenderResponse
Wissel har forklaret det hele i denne post: Web Agents XPages Style samt i Rendering your own output in XPages revisited

Agent output

Alle print statements i en Lotus Script agent, bliver skrevet direkte til browseren som html. Så hvis du i din agent skriver

Print "Hello World"

og kalder agenten via en url (http://server/database/agent?OpenAgent) så får du dette svar:

<html>
<head>
</head>
<body text="#000000">
Hello World
</body>
</html>

Hvis du ikke ønsker alt det autogenerede html kode, så skal du blot sætte din egen Content-type:

Plain text/html

Print |CONTENT-TYPE:text/html; charset=UTF-8|
Print ||

XML

Print |CONTENT-TYPE:text/xml|
Print ||
Print |<?xml version="1.0" encoding="UTF-8" ?> |

 

XPages undervisning

Hvis du skal i gang med XPages, så kommer du ikke udenom:

TLCC har en del online Notes 8.5 kurser. Har kun prøvet den gratis introduktion – og den virkede ok. Hele kursus forløbet koster $1899,- men enkelt moduler kan købes for mindre. NotesIn9 har lavet et review/demo af kurserne.

Du bør også se disse: