| 

.NET C# Java Javascript Exception

erweiterte Grails Templates

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


erweiterte Grails Templates

milkyman - 02.07.2009 15:12
Hallo zusammen.

Wie schon erwähnt, habe ich ein Projekt, das zu großen Teilen auf CRUD Funktionen setzt. Für dieses Projekte verwende ich das i18n-templates Plugin und habe die dort mitgelieferten Templates an vielen Stellen erweitert, dabei aber hoffentlich so allgemein gehalten, dass sie auch für andere Projekte verwendbar sind.

Ich will nicht behaupten, dass die aktuelle Version der finale Stand ist, aber zumindest habe ich keine nennenswerten offenen Punkte mehr. Daher möchte ich euch die Templates hier zur Verfügung stellen.

Ziel: Zum Einen eine erweiterte Views für euch - sofern ihr denn die CRUD-Views verwendet. Zum Anderen freue ich mich über Feedback zum aktuellen Stand. Was funktioniert noch nicht wie erwartet, wo könnte man noch was anders oder besser machen, welche Features vermisst ihr noch?

Ebenso bin ich aber an konstruktiver Kritik am Code interessiert. Letztlich habe ich noch keine große Groovy Erfahrung und wenn ihr was seht, was man auch einfacher lösen könnte, bin ich immer für Vorschläge zu haben.


Welche Anpassungen habe ich gemacht?

Anpassungen Controller:
-list mit stark erweiterter Filterung und Sortierung
-Messages insgesamt leicht optimiert
-list als Default View nach create und edit (statt show)
-Verwendung getComposite für Primärschlüssel
-choose und addTO für Assoziierung vorhandener Objekte (statt nur welche ganz neu anlegen zu können)

Anpassungen create:
-g:form mit controller
-Constraint editable auswerten, ggf. Property nicht anzeigen

Anpassungen edit:
-g:form mit controller
-Constraint editable auswerten, ggf. Property nicht anzeigen

Anpassungen show:
-Constraints display, password auswerten
-optionale Ausgabe von "subElement"s bei referencesDomains
-verlinkte Ausgabe von Strings mit Constraint "url"
-formatierte Ausgabe von Daten (steuerbar über Constraints Attribute dateFormat, default ist "dd.mm.YYYY")
-Constraints Attribute numberformat und numberFormatName berücksichtigen
-Ausgabe Checkbox bei boolschen Properties

Anpassungen list:
-Sortierung verbessert (nicht nur anhand ID bei referencedDomains)
-Filter hinzugefügt
-Icons Show, Edit, Delete hinzugefügt
-mehr als 6 Spalten anzeigbar
-keine ID-Spalte erzwungen
-Constraints display, password und listable auswerten
-Constraints Attribute cssStyle berücksichtigen
-auch nutzbar für Assoziierung bestehender Objekte
-formatierte Ausgabe von Daten (steuerbar über Constraints Attribute dateFormat oder dateFormatName, default ist "dd.mm.YYYY")
-rechtsbündige Ausgabe von Zahlen
-Constraints Attribute numberformat und numberFormatName berücksichtigen
-Ausgabe Checkbox bei boolschen Properties
-verlinkte Ausgabe (show) von referencedDomains
-verlinkte Ausgabe von Strings mit Constraint "url"
-class-Attribute für einfacheres CSS Customizing


Anpassungen renderEditor.template
-Constraints Attribute cssStyle berücksichtigen
-sortierte Ausgabe bei 1:n
-Constraint isRadio auswerten
-class-Attribute für einfacheres CSS Customizing
-direktes löschen von 1:n Objekten
-assoziieren von existierenden 1:n Objekten
-select nur bei Range < 50, sonst Textfeld, um MemoryError zu vermeiden


Update 1.4 vom 04.08.2009:
-Error messages in list view möglich
-optionale Integration des searchable plugin (search.css mit kopieren!)
wenn installiert und konfiguriert wird Input und Button zum suchen mit angezeigt
-i18n für alle Meldungen
-Detailverbesserungen anhand JIRAs zu den Templates
-List-View mit 0 Datensätzen -> Message statt leerer Tabelle
-n:m Integration bei create und edit
-Links zum hinzufügen/entfernen von 1:n bzw. n:m nur wenn sinnvoll

Update 1.5 vom 12.08.2009:
-n:m funktioniert nun vollständig, inkl. Löschen der abhängigen Seite
-Domains in packages möglich
-XHTML konform (Ausnahme: g:datepicker)
-Verwendung der main.css statt inline styles
-Darstellung von Enums als select oder radio
-Enums mit i18n Support (außer Sortierung)
-HTML-Encoding durchgängig vorhanden


Update 1.6 vom 09.11.2009:
-Bugfix für unidirektionale Relationen

Update 1.6a vom 21.12.2009:
-Bugfix für unidirektionale Relationen "mit sich selbst"

Wie werden die Templates verwendet?
1. "grails create-app" oder bestehende Anwendung verwenden
(vorher Backup machen!!!)
2. "grails install-templates"
3. "grails install-plugin i18n-templates"
4. "grails create-controller Base"
(den benötigten leeren BaseController generieren)
4. die dem Post anhängende Datei downloaden und von .svg in .zip umbenennen
5. Zur Installation ZIP entpacken und
5.a) Templates (artifacts und scaffolding) in src/templates kopieren
5.b) main.css und search.css in web-app/css kopieren
5.c) main.gsp in grails-app/views/layouts kopieren
6. Domain Klassen anlegen oder vorhandene verwenden
6.a) Bei vorhandenen Domains müssen ein "extends Comparable" und einige Methoden (siehe "TODO"s im Template DomainClass.groovy) ergänzt werden. Wer das searchable Plugin verwendet, kann die "searchable" Closure kopieren und entkommentieren.
6.b) Bei neuen Klassen muss mindestens in der getDefaultOrder() als return der Name einer vorhandenen Property gesetzt werden. Die anderen TODOs können optional modifiziert werden.
7. grails generate-all
8. Anwendung starten und überraschen lassen :)



Hier noch ein paar Beispiele für Constraints, auf denen viele der Erweiterungen basieren:

static constraints = {
name(blank:false, nullable:false, size:1..100, attributes:[cssStyle:"width:400px;"])
x(range:1..200, unique:'y')
y(range:1..200, unique:'x')
example1(nullable:true, default:null, range:0..30, attributes:[listable:false])
example2(editable:false)
example3(attributes:[isRadio:true, listable:false])
example4(editable: false, url:true, attributes:[listable:false])
example5(password:true, blank:false, nullable:false, size:1..32)
owner(attributes:[subElement:"groups"])
lastLogin(attributes:[dateFormat:"dd.MM.yyyy HH:mm", precision:"minute", years:"${2009..2015}"])
lastLogout(attributes:[dateFormatName:"myFormats.mySpecialLogoutFormat"])
numberOfXY(attributes:[numberFormat:"###,##0"])
numberOfZ(attributes:[numberFormatName:"myFormats.mySpecialFormatZ"])
id(display:false)
}


Viel Spaß beim Ausprobieren!

Bye,
Horst



Dateianh&auml;nge:
&ouml;ffnen | Download - grails_templates_hk_091107_v16a.svg (19.1&nbsp;KB)


Re: erweiterte Grails Templates

Bytelight - 22.07.2009 15:47
Hallo Horst,

da ich neugierig war, wei deine Templates wohl aussehen mögen, habe ich auch (genau nach Anleitung) ein Projekt erstellt. Besteht nur aus einer Domain-Klasse namens Catalog (mit 3 Eigenschaften).

Mit der Version 1.3 erhalte ich folgende Fehlermeldung:
Zitat

Grails Runtime Exception
Error Details
Error 500: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
Servlet: grails
URI: /Horst/grails/catalog/list.dispatch
Exception Message: Column not found: TODO in statement [select top ? catalog0_.id as id0_, catalog0_.version as version0_, catalog0_.description as descript3_0_, catalog0_.name as name0_, catalog0_.value as value0_ from catalog catalog0_ where 1=1 order by TODO asc]
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
Class: CatalogController
At Line: [69]
Code Snippet:
68: //flash.message += "${querySql}"
69: def result = Catalog.findAll(querySql + orderBySql, namedParams, [max:params.max.toInteger(), offset:params.offset.toInteger()])
70:

Was mache ich falsch?

Henri


Re: erweiterte Grails Templates

Mana204 - 10.05.2010 13:02
Hallo Horst,


habe deine Templates verwendet und bin echt begeistert, vielen Dank dafür.

Welcher Punkt mich allerdings allgemein bei Grails etwas stört ist, dass man
immer erst ein Objekt anlegen muss um die Referenz anzulegen, dies ist
sicher technisch auch notwendig aber es wäre ja schöner wenn man die Objekte
schonmal anlegt und dann ein gemeinsames Rollback bzw Speicherung fährt.

Hast du hier schon Erfahrungen sammeln können?

Gruß Matthias


Re: erweiterte Grails Templates

milkyman - 10.05.2010 18:26
Was meinst du mit "direkt auf die Bearbeitung zu springen (und nicht in die Liste)" ?

In welcher Reihenfolge willst du was machen? Beispiel wäre gut.

Bye,
Horst


Re: erweiterte Grails Templates

christian - 10.05.2010 22:38
Alles, was ich von Spring WebFlow gehört habe, war ziemlich abschreckend. Das ist XML-Programmierung in bester Struts-Manier. Das ganze Konzept passt auch nicht so richtig zum zustandslosen HTT-Protokoll. Wenn man schon solche Anwendungen bauen will, bietet sich Wicket an. Wenn man es RESTful machen will, könnte man auch alle Eingaben aus vorigen Schritten in versteckten Formularfeldern durchschleifen, aber Grails bietet dafür wenig Unterstützung.

Gruß
Christian


Re: erweiterte Grails Templates

Mana204 - 11.05.2010 09:05
Tschuldigung,

würde gerne eine flüssige Eingabemaske mit Grails erstellen, bei der zB ein Produkt Bilder hat.
Leider können die Bilder erst im Editiermodus an das persistierte Produkt gehangen werden.
Also erstelle ich bisher ein Produkt, speichere es, gehe auf die Listenansicht, und editiere es dann wieder.
Gerne würde ich die Listenansicht optional überspringen wenn ich weiss dass ich in jedemfall noch Bilder hinzufügen werde.
Um von der Create zur Edit-GSP zu springen benötige ich aber die ID an welche ich auch nach dem Abspeichern
scheinbar nicht rankommen, zumindestens weiss ich nicht wie.

Gruß Matthias


Re: erweiterte Grails Templates

milkyman - 11.05.2010 15:00
Ah ok, jetzt hab ich's verstanden.

Den CREATE vor dem EDIT wird man nicht verhindern können, aber wenn es dir nur darum geht die list view zu überspringen, das sollte gehen.

Schau mal in der save-Action des Controllers. Da steht am Ende der "redirect(action:list)". Wenn du den änderst, kannst du direkt auf die edit-View springen. Nach dem save müsste die domainInstance auch eine ID besitzen, die du verwenden kannst.


PS: Ich hab auch schon ein TODO bzgl. "Bilder in der Domain", d.h. Integration in CRUD (bei einer fixen Anzahl). Aber keine Ahnung, wann ich da mal zu komme.

Bye,
Horst


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "erweiterte Grails Templates" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.