[Seaside] How to approach building a Deltawerken application, Part 1

Stephan Eggermont stephan at stack.nl
Fri Sep 14 10:59:46 UTC 2012


Class categories

When building a Deltawerken application called AppName, create the following 
class categories:

AppName-Model
AppName-Model-Tests
AppName-Web
AppName-Announcements

Put the domain classes in AppName-Model
Drive the development of the domain classes from tests in AppName-Model-Tests
Put the Seaside related code in AppName-Web
The Announcements for navigating the site go in AppName-Announcements

Once either of those categories gets too large (when you need to scroll the list
of classes in the category), create a fitting new category and distribute the classes.
Now Beach-Parasol allows web testing with Selenium Webdriver, you probably
also want to create AppName-Web-Tests (http://ss3.gemstone.com/ss/Parasol.html)

Accessing the model

To access the model from the web, you either give (at least) one of the domain classes
a class (instance) var or add a separate model class. 

In Storyboard, SBUser has a class instance variable users. The class method users
returns these users, and when nil creates a collection of users with a default administrator.
During development, the class method resetUsers allows cleaning up.

The alternative would be to add a class SBModel with a class variable default.
SBModel>>default
	^default ifNil: [default := self new]

SBModel>>reset
  default := nil

Then add accessors for the entry points 
SBModel>users
	users ifNil: [users := OrderedCollection new.
		self addDefaultUsers].
	^users

Describing the model classes

To create editing or reporting forms, describe the model classes
and create an accessor returning an array of methodSymbols

SBStory>>fields
	^#( storyNameField #descriptionField typeField sizeField stateField historyField) 

At the class side, create a xxxField method for all needed fields.

SBStory has a storyName instance variable. The storyName is 
a required string.

SBStory>>storyNameField
	^DEStringField new
		label: 'Name';
		accessor: #( #storyName );
		validator: (DEStringValidator new
			required: true;
			errorMessage: 'Name is required'
			yourself);
		yourself   

SBMember has a user instance variable. In a report, its email is needed

SBMember>>emailField
	^SBUser emailField
		addToAccessor: #( #user );
		beReadonly;
		yourself 

Creating the application

Add a subclass of WAFileLibrary to AppName-Web. Put the css in mainCss,

SBFileLibrary>selectorsToInclude
	^#( mainCss )

Create a application entrypoint. In StoryBoard this is SBMain, a subclass of
WAComponent. It renders its children

SBMain>children
	^Array with: self loginForm with: self mainForm

Easiest is to create a copy, change class side description and initialize
Don't forget to add your filelibrary. The sessionClass is often not needed.
Change instance side title and the createLogin and createMainForm methods.

The createMainForm creates a DEPageChoice component. It needs to interact 
with the loginForm. When the register button is pressed, the loginForm sends 
the SBRegisterUser announcement. The addPage:announcement: makes sure 
that the page is shown when receiving the announcement. Deltawerken has 
default announcements for logging on and off 







More information about the seaside mailing list