15
Jun
2007

Der Fehler den eGroupware beim Bearbeiten der Kontakte mit Opera hat, hat mich dann doch etwas genervt. Nach etwas suchen fand ich den Fehler in der Datei “etemplate/js/etemplate.js”. Diese enhält die Funktion “set_style_by_class(t,c,p,v)” und in der wird mittels Style-Angaben das entsprechend Feld sichtbar oder unsichtbar gemacht. Der Haken an der Sache ist nur, dass Opera intern scheinbar mit “CLASS” als Attribut arbeitet und eGroupware nur auf “class” prüft:

etemplate/js/etemplate.js Zeile 209

if(node.attributes.item(j).nodeName == ‘class’) {
if(node.attributes.item(j).nodeValue == c) {
eval(‘node.style.’ + p + ” = ‘” +v + “‘”);
}
}

Zuerst hatte ich das Javascript selbst gefixt, aber im Hinblick auf Updates ist das nicht so prickelnd und entsprechend hab ich mich mal an ein Opera User Javascript gemacht, das wie Firefox’ Greasemonkey Veränderungen an einer Seite vornehmen kann ohne dass der Seitenbetreiber das einbauen muss:

eGroupware_edit_contacts_fix.js

if (location.hostname.match(/subdomain\.domain\.tld$/i)){
window.opera.defineMagicFunction(’set_style_by_class’, function(real,that,t,c,p,v) {
var elements;
if(t == ‘*’) {
// ‘*’ not supported by IE/Win 5.5 and below
elements = (document.all) ? document.all : document.getElementsByTagName(‘*’);
} else {
elements = document.getElementsByTagName(t);
}
for(var i = 0; i < elements.length; i++){
var node = elements.item(i);
for(var j = 0; j < node.attributes.length; j++) {
nodeName = node.attributes.item(j).nodeName.toLowerCase();
if(nodeName == 'class') {
if(node.attributes.item(j).nodeValue == c) {
eval('node.style.' + p + " = '" +v + "'");
}
}
}
}
});
}

Ich hab also nur den String, der auf “class” geprüft wird, kopiert, ein lowercase drübergehaun und schon funktioniert auch das Kontakte bearbeiten im Opera. Irgendwie find ich die Variante, die eGroupware da nutzt aber sehr merkwürdig. Wenn ich lustig bin schau ich mal, obs da ne sauberer Möglichkeit gibt.
Das User Javascript gibts natürlich zum Download.
Einfach in ein Verzeichnis schmeissen und dem Opera über Einstellungen (Alt-P) -> Erweitert -> Inhalt -> Javascript Options -> Pfad zu User Javascripts mitteilen. Vorher aber noch den Host in der ersten Zeile eintragen. Wie auch im Beispiel zu sehen, müssen dabei Punkte mit “\” escaped werden.

UPDATE 15.06 20:01

danke für den fix, habe ihn nach trunk und 1.4 commited. Ralf [aus dem Forum]

Wurde direkt in eGroupware übernommen. Ab 1.4 sollte der Fehler also auch mit Opera und ohne User Javascript nicht mehr bestehen.


Kommentar hinterlassen

Ja, ich möchte bei Kommentaren benachrichtigt werden!