FSS.social
11Jun 130

CKEditor und IE10

am Dienstag, den 11. Juni 2013

Ältere Versionen des CKEditors vertragen sich nicht mit IE10.
(Die Fläche, wo man normalerweise den Text bearbeiten kann, wird ausgegraut angezeigt)
Die Inkompatibilität wurde mit der CKEditor Version 3.6.6 behoben.

Bei Domino tritt die Inkompatibilität unter Domino 8.5.2 auf und ist mit 8.5.3 behoben.

22Mrz 130

Ein REST-Client für die Rest-Api Schnittstelle

am Freitag, den 22. März 2013

Der Rest-Client

Wer mit der Rest-Api-Schnittstelle arbeitet bzw. über sie auf IBM-Produkte zuzugreifen (wie zum Beispiel auf IBM Connections ), sollte einen Blick auf das Addon RestClient für den Firefox werfen.

Zum REST-Client Addon für Firefox

veröffentlicht unter: FSS.domino keine Kommentare
15Jan 130

Lotus Notes und das Versenden von HTML E-Mails

am Dienstag, den 15. Januar 2013

Wer E-Mails im HTML Format versenden will, sollte sich auf einige Überraschungen gefasst machen.
Zum einen muss ein E-Mail Client kein HTML unterstützen und selbst wenn er es tut, bleibt die spannende Frage welche Elemente er kennt und darstellen kann.


So gab es auch bei der Erstellung eines HTML-Newsletters für Lotus Notes (8.5.3) die eine oder andere kleine Überraschung.

So waren die Schriftgrößen in der HTML-E-Mail ein wenig kleiner als wie sie in einem
font-size vorgegeben worden waren und eine min-width Angabe wurde überlesen.

Beim Versuch den Newsletter mit einem
background:linear-gradient(#525252, #3E5564); (CSS3-Element) etwas hübscher zu gestalten, sorgte dafür dass gleich alle Style-Informationen von Notes ignoriert wurden.

Weiterführende Links:
Eine englischsprachige Seite bei der so einige Vorschläge zu HTML-Newsletter gemacht werden (nicht nur zum Notes-Client)
Ein Beispiel für eine kleine Java-Klasse zum Versenden von E-Mails.
Eine Seite die verschiedene E-Mail-Programm auf HTML-Kompatibilität abklopft:

5Nov 120

XPages und Mehrfachwerten

am Montag, den 5. November 2012

Hat ein Feld mehrere Werte so werden die Werte von XPages standardmäßig zunächst durch Komma getrennt angezeigt.

Sollen Werte eines Eingabefeldes zeilenweise (jeder Wert in einer eigenen Zeile) angezeigt werden,
so muss unter den Properties beim Eintrag <font color='blue'>multipleSeperator </font> der Wert durch den computed Ausdruck <font color='blue'><htmlblock>return("\n")</htmlblock> </font> ersetzt werden,

Xpages und Mehrfachwerte-1

Kleine Anmerkung:
Der Namespicker aus der Extension Library besteht allerdings bei seinem Eingabefeld auf Komma zum Trennen von mehreren Namen.

Möchte man dagegen bei der Anzeige einer Ansichtspalte mehrere Werte zeilenweise getrennt anzeigt werden,
lässt sich dies wie folgt umsetzen.

1) Zunächst müssen die Werte der Spalte als HTML-Code interpretiert werden.

Xpages und Mehrfachwerte-2
2) Danach sorgt man über einen eigenen Konverter, dass die Mehrfachwerte durch <br /> Tags voneinander getrennt werden.
getAsObject: <font color='blue'><htmlblock> return value </htmlblock></font>
getAsString: <font color='blue'><htmlblock> value.constructor == Array ? value.join('<br/>'): value;</htmlblock></font>

Xpages und Mehrfachwerte-3

Weiterführende Links;
Beschreibung von Konvertern
Code-Snippet für einen etwas komplexeren Converter für Mehrfachwerte

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

27Sep 120

XPages und die Previous-Next-Pager-Problematik

am Donnerstag, den 27. September 2012

Früher oder später wird jeder XPage-Entwickler im deutschsprachigem Raum gefragt, warum beim Pager ein "Previous" und "Next" steht. (statt ein "Zurück" und "Weiter")

Auch wenn man bei XPages an unzähligen Stellen Werte verändern kann, gehören zum Leidwesen der Entwickler die Beschriftung "Next" und "Previous" vom Pager nicht dazu.
Durchstöbert man das Internet nach Lösungen trifft man auf Vorschläge einen eigenen Pager zu erstellen und das obwohl man ja im Grunde nur ein paar Labels umbenennen wollte.

Inzwischen lässt sich das Problem auch lösen indem man das deutsche Sprachpaket einspielt.
Anbei das Ergebnis als man einem 8.5.3er Domino-Server mit Upgrade Pack 1 das deutsche Sprachpaket spendierte :

XPages Deutsch

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

 

3Aug 120

XPages: Datenbankzugriff mit den Rechten des Signers

am Freitag, den 3. August 2012

Wenn ein Benutzer eine XPage öffnet, so greift der Server mit den Rechten des aktuellen Benutzers auf die Daten zu.
Somit muss - wenn die XPage auf anderen Datenbanken zugreift - für aktuellen Benutzer auch die entsprechenden Rechte in den anderen Datenbanken eingerichtet sein.

Dies ist allerdings nicht immer erwünscht.

Optional kann man ab 8.5.2 mit den Rechten des Signers auf die Datenbank zugreifen.
Dies erreicht man in dem man das Datenbankobjekt mit Hilfe der Funktion
sessionAsSigner.getDatabase() erstellt.
Hier ein kleines Beispiel.


var myDB:NotesDatabase = sessionAsSigner.getDatabase("","");
myDB.openByReplicaID(database.getServer(),myReplicaID);

Mit dem Datenbankobjekt kann anschließend wie gewohnt weitergearbeitet werden.


var myView:NotesView = myDB.getView(viewName);
Nur beim Löschen von Dokumenten gibt es noch ein Problem.
(
Gemeldet in der Version 8.5.3)

31Jul 120

Wenn ein DbLookup nur ein null liefert

am Dienstag, den 31. Juli 2012

Ist man es unter Notes gewohnt, dass @Dblookup im Fehlerfall eine Fehlermeldung zurückgibt,
so erhält man unter XPages nur ein nichtssagendes und wenig hilfreiches null.

Falls man unter XPages rausfinden will, was ein DbLookup moniert. kann man das DbLookup vorrübergehend in einem session.evaluate ausführen lassen.

Und ein DbLookup Aufruf wie z.B.,

var ergebnis = @DbLookup(ReplicaID,viewName,key,"FeldName"); durch ein

var cmd = 'ret:=@DbLookup("";"'+ReplicaID+'";"'+viewName+'";"'+key+'";"FeldName");@if(@isError(ret);@Text(ret);ret)';
var ergebnis = session.evaluate(cmd);
ersetzen und schon findet man im ergebnis die Fehlermeldung.

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)

}