FSS.social
13Mai 130

Social Connections V in Zürich am 28.06.2013

am Montag, den 13. Mai 2013

Am 28.06.2013 findet in Zürich im IBM Client Center die 5. Social Connections Konferenz statt. Die Agenda lässt interessante und vielseitige Vorträge für die Zielgruppen Administration, Entwicklung und Management vermuten. Der Besuch der Veranstaltung ist inklusive eines Abendprogramms kostenfrei.

25Okt 120

Designer Client: Installation des Upgrade Pack 1 für 8.5.3 wenn man bereits eine ältere extended Lib verwendete

am Donnerstag, den 25. Oktober 2012

Wer bei seinem Notes-Designer bereits eine ältere Version der Extended Lib installiert hat, kann bei der Installation des Update Packs 1 eine kleine Überraschung erleben. Wenn das Installationsprogramm eine ältere Version der extended Lib entdeckt, bricht es die Installation ab und verweist auf seine Log-Dateien.

Anbei eine kleine Beschreibung wie man alle alten Elemente der Extended Lib aus dem Designer entfernt.

Schritt 1: Über den Client die Extended Lib deinstallieren
Im Designer wählt man den Menü-Eintrag "
FileApplicationApplication Management" aus und deinstalliert alle Einträge die mit XPages Extension Library, Domino Access Services und Wink zu tun haben
Um die Deinstallation abzuschließen sollte man Notes neu starten.

Schritt 2: Alte Dateien manuell löschen
Anschließend sollte man die folgenden Verzeichnisse überprüfen und die Dateien löschen in deren Dateinamen "
domino.das", "domino.services", "wink" oder "extlib" steht.

- frameworksharedeclipsefeatures

- frameworksharedeclipseplugins

- datadominoworkspaceapplicationseclipsefeatures

- datadominoworkspaceapplicationseclipseplugins

- dataworkspaceapplicationseclipsefeatures

- dataworkspaceapplicationseclipseplugins



Link zu einer englischen Beschreibung der Installation inkl für verschiedene Betriebssysteme

25Sep 120

Mehrsprachige Anwendungen unter XPages

am Dienstag, den 25. September 2012

Laut IBM braucht man nur die Lokalisations-Option (bei den XPage Optionen) aktivieren, angeben in welchen Sprachen die Anwendung zur Verfügung stellen soll und erhält nach einem Clean für alle XPages und Customer Controls Elemente Properties Dateien, die man dann einem Übersetzer in die Hand drücken kann.

Anbei ein Screenshot von den Optionen (hier für Englisch/Deutsch wobei Englisch die Standardsprache bzw Orginalsprache ist)

XPages Mehrsprachig-1
Zunächst eine Warnung: Deaktiviert man die Option "Enable localization" werden alle übersetzten Properties-Dateien gelöscht. Entfernt man eine der Sprachen, werden die zugehörigen Dateien der Sprache gelöscht.

In der Praxis extrahiert die Lokalisationsroutine so gut wie möglich alle Texte wie z.B. Labels, Fehlermeldungen etc. Sie wird jedoch keine Texte aus berechneten Feldern oder Texte aus Javascript-Bibliotheken extrahieren.
Hier muß der Entwickler selbst noch einmal Hand anlegen und den Code mittels Javascript aus einer eigenen Property-Datei auslesen. (Beschreibung hierzu folgt)

Als Ergebnis der Extraktion enthält man dann properties-Dateien die wie folgt aussehen können:
<font color="blue"><blockquote><htmlblock>viewColumnHeader11/@value=[de| For Person/Team ]
switchFacet2/xe\:this.facets[1]/xp\:panel[2]/text()[2]=[de| \u00A0 ]
lnkCancel/xp\:eventHandler[1]/xp\:this.action[1]/xp\:actionGroup[1]/xp\:confirm[1]/@message=[de| Cancel adding a new member? ]</htmlblock></blockquote><font color="black">
Also ein paar Dateien bei denen sich so mancher Übersetzer erst einmal verwirrt die Augen reiben dürfte.

Bei kleinen überschaubaren Anwendungen, die nur aus einer Handvoll XPages/Customer Controls besteht ist dies sicher eine mögliche Variante.
Allerdings sollte man auch hier prüfen ob wirklich alle Texte eingefangen wurden und ob bei der Übersetzung nicht versehentlich ein Leerzeichen zu viel gelöscht wurde.

Sobald die Anwendung wesentlich komplexer wird z.B. aus vielen verschachtelten Customer Controls besteht, artet das Übersetzen schnell in eine Form von Schnitzeljagd für Entwickler aus und man fragt sich in welcher der vielen Properties-Dateien das eine oder andere Label noch einmal stand.

Übersetzung hausgemacht:
Alternativ zur obigen Lokalisierungsvariante kann man auch eigene Properties-Dateien erstellen

XPages Mehrsprachig-2

und diese als Datei-Resourcen seiner Anwendung hinzufügen.

XPages Mehrsprachig-3

XPages Mehrsprachig-4
Aus diesen Datei liest man nun die Texte für Labels, Fehlermeldungen, etc

Bei einem Label könnte folgender Javascript-Code stehen: <font color="blue"><blockquote><htmlblock>var message = strings.getString('greeting');
return message</htmlblock></blockquote><font color="black">
In einer Datei steht die passende Begrüßung auf Englisch (strings_en.properties) <font color="blue"><blockquote><htmlblock>greeting=Welcome</htmlblock></blockquote><font color="black">
und in einer anderen die Begrüßung auf Deutsch (strings_de.properties) <font color="blue"><blockquote><htmlblock>greeting=Willkommen</htmlblock></blockquote><font color="black">

Will man beim Willkommen noch den Namen des aktuellen Benutzers mit ausgeben, muss man zwei Stellen anpassen.
Einmal in den properties-Dateien: <font color="blue"><blockquote><htmlblock>greeting=Welcome {0} !</htmlblock></blockquote><font color="black">
Und dann muss man noch dafür sorgen, dass im Javascriptcode das "{0}“ durch den Namen ersetzt wird.
<font color="blue"><blockquote><htmlblock>var message = strings.getString('greeting');
message = I18n.format(message, @UserName());
return message</htmlblock></blockquote><font color="black">

Das Dateisuffix "_en" oder "_de" steht für die entsprechende Browser-Länderkennung. XPages kümmert sich dann selbst darum dass die passende Properties-Datei herangezogen wird.
Die Datei ohne Suffix z.B. strings.properties ist die Datei die gezogen wird, wenn für die Länderkennung keine eigene properties-Datei existiert.

Anbei noch zwei Links zu zwei ausführlichen englischsprachigen Artikeln zum Thema Übersetzung.
Eine Beschreibung wie man über die XPage Optionen eine Übersetzung vornimmt
Eine Beschreibung wie man über Javascripts auf eigene Properties-Dateien zugreifen kann

 

10Jul 120

XPages Einmal das Datum ohne Zeit bitte

am Dienstag, den 10. Juli 2012

Manchmal sind es die kleinen Dinge, die einen aufhalten. Zum Beispiel der Wunsch nur das Datum ohne Zeitangabe in einem Feld abzuspeichern.

Glaubt man anfangs noch, dass es ausreicht dem Datepicker zu sagen, dass man nur am Datum interessiert ist,
stellte man fest, dass die Option den Datepicker nicht daran hindert noch eine Zeitangabe anzuhängen.

Im Internet fand ich ein Stück Code mit dem man beim Speichern der XPage dafür sorgen kann, dass der Code wieder rausfliegt.



// kleine Korrektur bei den Datumsfeldern Datum + Zeit => Zeit

if (currentDocument.getDocument().hasItem("Beginn")) {

var dtb:NotesDateTime = currentDocument.getItemValueDateTime("Beginn");

dtb.setAnyTime();

currentDocument.getDocument().replaceItemValue("Beginn",dtb)

}

3Jul 120

XPages und die Validierung

am Dienstag, den 3. Juli 2012

XPages bietet von Hause aus eine ganze Reihe von Validierungsmöglichkeiten an.

Neben den üblichen Prüfungen ob ein Feld gefüllt wurde oder ob es einer regular expression genügt, kann man auch eigene Javascript-Routinen einbinden, die sich komplexere Prüfungen annehmen.

Hierzu kann man über die Eigenschaften einen neuen Validator namens validateExpression hinzufügen.
Der (serverseitige) Javascriptcode wird bei Expression hinzugefügt.
Wenn der Javascriptcode ein "false" zurückliefert wird die Fehlermeldung zurückgegeben die man unter "message" eingetragen hat.

XPages Validierung

Man kann zudem auch eigene ("Fehler-") Mitteilungen ins <font color="blue"> Display-Errors Control <font color="black"> schmuggeln.
Dazu gibt es bei Tommy Valand ein kleinen Code-Schnippsel (Link zur Orginalseite)
<font color="blue"><blockquote><htmlblock>
function addFacesMessage( message, component ){
try {
if( typeof component === 'string' ){
component = getComponent( component );
}

var clientId = null;
if( component ){
clientId = component.getClientId( facesContext );
}

facesContext.addMessage( clientId, new javax.faces.application.FacesMessage( message ) );
} catch(e){
/*Debug.logException(e);*/
}
} }
</htmlblock></blockquote><font color="black">

Ruft man mit serverseitigem Javascript die obige Funktion wie folgt auf <font color="blue">
addFacesMessage("Die Datenbank xyz wurde nicht gefunden,","IDEinesFeldes")
<font color="black"> wird die Meldung im Display-Error Control angezeigt.

Anbei noch ein paar interessante Links rund um das Thema::
Hier findet man eine Beschreibung der Validierungsmöglichkeiten Link zu www-10.lotus.com
Hier ist noch eine Alternative von Tommy Valand zum Display Control. Link zu Tommy Valands Blog
Hier findet man eine größere Liste mit regularen Expressions Link zu regexlib.com

 

14Mai 120

Xpages: Wenn der IE 9 die XPage nicht im Dokumentmodus IE7 öffnen soll

am Montag, den 14. Mai 2012

Browser sind ab und zu für Überraschungen gut.
So öffnet der IE 9 XPages im Dokumentmodus "
Internet Explorer 7 Standard" also quasi in einem Kompatibilitätsmodus.

Soll der IE 9 überredet werden, seine aktuelle Rendering-Engine zu verwenden, so muss der jeweiligen XPage der Parameter "
X-UA-Compatible" mitgegeben werden.
Hierfür gibt es den Wert
IE=edge

Schreibt man den folgenden Code ins
BeforeRenderingResponse-Event, so lässt der IE 9 das mit dem Kompatibilitätsmode sein.

var exCon = facesContext.getExternalContext();
var response = exCon.getResponse();

response.setHeader("X-UA-Compatible", "IE=edge");

23Apr 120

XPages: runWithDocumentContext – wie man Lotus Script Funktionen in XPages nutzen kann

am Montag, den 23. April 2012

Wenn eine Lotus Notes Datenbank webfähig gemacht werden soll,
stellt sich die Frage, ob sich nicht zumindest ein Teil der Lotus Script-Codes weiter verwenden lässt.

Bzw. ob wirklich alles noch einmal in Java Script programmiert werden muss.

Ab 8.5.2 gibt es die Möglichkeit einem Agenten das aktuelle Dokument im Speicher zu übergeben.
Der Agent kann dann seinerseits Felder in dem aktuellen Dokument verändern und an den Aufrufer zurückgeben.

Ein Beispiel:
In einer XPage liegt hinter einem Weiterleiten-Button folgender Code:

(serverseitiger Javascript-Code, antragDoc ist hier der Name der aktuellen Dokument-Resource)


var agent:NotesAgent = database.getAgent("(weiterleiten)");


agent.runWithDocumentContext(antragDoc.getDocument());

antragDoc.save();
Dem Agent wird das aktuelle Dokument übergeben. Sobald der Agent mit dem Dokument fertig ist, wird dieses gespeichert.

Beim Agent "(weiterleiten)" wurde unter Security "Run as Webuser" eingestellt.
Der Code des Agenten ist in Lotus Script geschrieben und könnte wie folgt aussehen.


Sub Initialize


Dim db As NotesDatabase

Dim agent As NotesAgent

Dim session As New NotesSession

Dim actDoc As NotesDocument

Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set actDoc = session.DocumentContext

Call Weiterleiten(actDoc)
End Sub

Call Weiterleiten() ist eine Funktion in der nun beliebig Felder des Dokumentes gesetzt werden können.

Um die Veränderungen zu übergeben muss das Dokument NICHT gespeichert werden.

Sobald der Agent fertig ist, übergibt er dem Aufrufer das veränderte Dokument.

15Mrz 120

XPages: Abfragen von radiobuttons mit javascript (clientseitig)

am Donnerstag, den 15. März 2012

Nicht selten sind es die kleinen Änderungen, die plötzlich mehr Zeit verschlingen als erwartet.

Die Aufgabe:
Wenn man bei einem Radiobutton einen neuen Wert auswählt, soll über eine Dialogbox nachgefragt werden, ob man dies wirklich ändern will.
Überlegt es sich der Anwender noch einmal anders, so soll der neue Wert ignoriert werden.

Auf den ersten Blick sieht dies nach einer Aufgabe aus, die schnell erledigt ist.
Doch wie so oft liegt die Tücke im Detail.

Zunächst wartet bei den Events eine Überraschung:
Der IE (8 & 9) ignoriert unter XPages beim RadioButton das onChangeEvent()

Somit darf das onChangeEvent über das onClick Event nachgebildet werden.

Beim onClick-Event muss berücksichtigt werden, dass dieses bei der Auswahl eines neuen Wertes zweimal durchlaufen wird.
Einmal mit dem alten und einmal mit dem neuen Wert.

Den alten Wert der RadiobuttonGroup erhält man über folgenden Ausdruck:

alterwert = '#{javascript:getComponent("radioGroup1").getValue();}';

Beim Versuch den neuen Wert zu ermitteln, wartet dann die nächste Überraschung.
Einige empfehlen hier folgende Variante:


var elements = dojo.byId(id);
for(i=0;i if (elements[i].value == value) {
elements[i].checked = true;
}
}


Kleiner Schönheitsfehler: Dies klappt zwar mit dem Firefox einwandfrei aber der IE (8 & 9) hält von dieser Variante nichts. Das Element daß der IE zurückgibt enthält schlichtweg keine Elemente durch die man sich durchhangeln könnte.

Allerdings kann man sich recht elegant mit dojo.query den Wert des aktuell ausgewählten Radiobuttons holen:

elements = dojo.query('INPUT[type=radio][name=#{id:radioGroup1}]:checked');


neuerWert = elements[0].value;

Das Deaktivieren eines Radiobuttons ist mit dojo.query nicht mehr als ein Einzeiler:

dojo.query('INPUT[type=radio][name=#{id:radioGroup1}]:checked').forEach(function(n) {n.checked=false;});

Und auch das Setzen eines radiobuttons (z.B. den alten Wert) ist nicht mehr als eine Zeile

dojo.query('INPUT[type=radio][name=#{id:radioGroup1}][value='+alterwert+']').forEach(function(n) {n.checked=true;});

Die dojo.query-Varianten funktionieren mit Firefox und mit dem IE.

21Feb 120

XPages-Optimierung mit der Option „Use runtime optimized Javascript and CSS resources“

am Dienstag, den 21. Februar 2012

Content-Type: multipart/related; boundary="=_related 00359C42C12579AB_=" This is a multipart message in MIME format.

14Feb 120

Neues Redbook: Lotus Domino Development Best Practices

am Dienstag, den 14. Februar 2012

Braucht man wohl nicht viel zu sagen - außer: Danke Annett...