Gestern abend bin ich ueber dieser Einfuehrung zu Ruby on Rails gehangen, speziell mit der Frage im Kopf, wo bei Helma die Vermittlungshuerden bzw. Eindruckbremser liegen. Offensichtlich ist natuerlich das implizite Object/Relational Mapping. Feine Sache, kann man ohne weiteres in ein zwei Tagen fuer Helma implementieren. Aber das ist gar nicht der groesste Brocken, nein nein nein. Es gibt Probleme, die schwerer wiegen und gleichzeitig viel tiefer drinnen liegen. Allen voran die Zwangshierarchisierung. Ich hab mich gegen die Einsicht gestraeubt, von wegen nice URLs und so, aber genau die stellen einen major Roadblock fuer die Bauphase dar. Nice URLs meinetwegen, aber bitte nur vorn draufgepappt, nicht tief drin im object mapping! Ebenso die Vermanschgerung von object model (aka business logic) und controller/web code, und zwar gleichermassen innen (Java-Code) wie aussen (JS). Generell das Problem, dass JavaScript in seiner gegenwaertingen Form kein standardmaessiges code layout hat, sprich include/import etc, und wir uns halt ein eher suboptimales/unflexibles erfunden haben. Und noch ein paar kleinere Sachen drumherum (z.b. Scaffolding: warum gibt es kein InspectableHopObject als Prototyp zum Subclassen fuer die Bauphase?).
Betrachtet jedenfalls meine Augen als geoeffneter, die Vision fuer Helma 2 als schaerfer denn zuvor. Und ich bin so froh, dass endlich mal wer daherkommt und meine Ideen von vor 10 8 Jahren validiert und korrigiert. Ein wunderbares Gefuehl, endlich was von wem abschauen zu koennen.
du weißt gar nicht, wie geil helma ist. ich ärgere mich seit wochen mit hyperwave rum. die typen benutzen auch serverseitiges javascript, aber mit total komischem objektmodell und undurchschaubarer methapher. Hier mal ein Beispiel, um ein News-Item zu posten.
function newNewsItem() {
var sequence="10";
if (request.object.HW_ObjectName) {
var coll=request.object.NewsCollection;
// copy rights of of news collection
out = server.object( { objectidentifier: coll } );
rights = out.object.Rights;
} else {
writeln('Attribute "NewsCollection" is not defined for ' + request.objectpath +".");
return;
}
var out=hw_readFormValues();
if (out.error.error()) {
writeln ("Error reading form.");
} else {
//check submit button
if (out.formValues["save"]) {
var today = new HW_API_Date();
var itemText=out.formValues["item_text"];
var itemTitle=out.formValues["item_title"];
if (itemText == "") {
writeln ("No text entered. Go back and correct it!");
return;
}
var name="item" + today.time;
itemObj = new HW_API_Object(
new HW_API_Attribute("Type", "Document"),
new HW_API_Attribute("DocumentType", "text"),
new HW_API_Attribute("Title", itemTitle ),
new HW_API_Attribute("TitleBase64", encodeBase64(itemTitle) ),
new HW_API_Attribute("BodyBase64", encodeBase64(itemText) ),
new HW_API_Attribute("MimeType","text/html"),
new HW_API_Attribute("Sequence", sequence),
new HW_API_Attribute("NewsItem", "yes"),
new HW_API_Attribute("HW_ManageLinks", "none"),
new HW_API_Attribute("HW_ObjectName", name),
new HW_API_Attribute("Rights", rights)
);
content= "<HTML><HEAD><META HTTP-EQUIV=Content-Type CONTENT=\"text/html; charset=ISO-8859-1\"></HEAD>\n";
content += "<BODY><h2>News Item\n";
content += "You cannot edit this with the usual Hyperwave edit. Use the 'edititem' action.</BODY></HTML>";
out = server.insertDocument( { object: itemObj,
parentidentifier: coll,
content: new HW_API_Content (content) });
if (out.error.error()) {
writeln ("You do not have he right to post news items.");
} else {
redirect("/"+coll);
}
} else {
if (out.formValues["cancel"]) {
redirect("/"+coll);
} else {
writeln (place("newsitempage"));
}
}
}
}