Child pages
  • Solution Model

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Create objects and set their properties
  • Clone objects
  • Manipulate properties of existing objects
  • Revert objects to its original design-time state
  • Remove existing objects

Basic rules and functionality

With the Solution Model you can control different types of objects. Referring to these objects is done through so-called JS Objects and consist of constants, properties and/or functions.

The following list shows the objects which can be controlled by the Solution Model, its corresponding JS Object and from which JS Object it needs to be referenced from in order to use it:

Object

JS Object

Referenced from JS Object

Calculations

JSCalculation

 

Styles

JSStyle

 

Global variables

JSVariable

 

Global methods

JSMethod

 

Forms

JSForm

 

Form variables

JSVariable

JSForm

Form methods

JSMethod

JSForm

Beans

JSBean

JSForm

Buttons

JS Button

JSForm

Components

JSComponent

JSForm

Fields

JSField

JSForm

Labels

JSLabel

JSForm

Parts

JS Part

JSForm

Portals

JSPortal

JSForm

Tab panels

JSTabPanel

JSForm

Relations

JSRelation

 

Value lists

JSValueList

 

Media

JSMedia

 

Note
titleNote

A list of all these JS Objects and their corresponding constants, properties and functions can be found under the SolutionModel node of the Solution Explorer.

When creating objects you need to make sure that the same object with the same name does not already exists. In this case you need to choose another name or remove the existing object.

By default, changes made by the Solution Model are not persistent and are only valid for the current session in which these changes are made. However, by a special setting (servoyDeveloper scripting access?) the changes are being stored back into the workspace.

Examples

This section shows (simple) examples of how different objects can be controlled with the Solution Model. Per object you will find how to:

  • Create an object
  • Retrieve an existing object
  • Change a property of an object
  • Remove an existing object

Calculations

To create a new calculation with name myCalculation on table customers of server example_data which returns 1:

Code Block

var calculation = solutionModel.newCalculation('function myCalculation() { return 1; }', JSVariable.INTEGER, 'db:/example_data/customers');

To get the existing calculation myCalculation on table customers of server example_data:

Code Block

var calculation = solutionModel.getCalculation('myCalculation', 'db:/example_data/customers');

To output whether or not this calculation is a stored one:

Code Block

application.output('Stored calculation: ' + calculation.isStored();

To remove existing calculation myCalculation:

Code Block

solutionModel.removeCalculation('myCalculation', 'db:/example_data/customers');

Styles

To create a new stylesheet with name myStyle with a default style class for forms:

Code Block

var style = solutionModel.newStyle('myStyle' 'form { background-color: transparent; }';

To get existing stylesheet myStyle:

Code Block

var style = solutionModel.getStyle('myStyle')

To add a default style class for fields:

Code Block

style.text += 'field { background-color: blue; }';

To remove existing stylesheet myStyle:

Code Block

solutionModel.removeStyle('myStyle');

Global variables

To create a new global variable with name myGlobalVariable of type TEXT:

Code Block

var globalVariable = solutionModel.newGlobalVariable('myGlobalVariable', JSVariable.TEXT);

To get existing global variable myGlobalVariable:

Code Block

var globalVariable = solutionModel.getGlobalVariable('myGlobalVariable');

To change its default value to abc:

Code Block

myGlobalVariable.defaultValue = 'abc';

To remove existing global variable myGlobalVariable:

Code Block

solutionModel.removeGlobalVariable('myGlobalVariable');

Global methods

To create a new global method with name myGlobalMethod:

Code Block

var globalMethod = solutionModel.newGlobalMethod('function myGlobalMethod() { currentcontroller.newRecord(); }');

To get existing global method myGlobalMethod:

Code Block

var globalMethod = solutionModel.getGlobalMethod('myGlobalMethod');

To make it appear in the menu:

Code Block

globalMethod.showInMenu = true;

To remove existing global method myGlobalMethod:

Code Block

solutionModel.removeGlobalMethod('myGlobalMethod');

Forms

Forms are most commonly used with the Solution Model and have some additional functions. The following basic functions are available for this type of objects:

  • Create new forms
  • Get existing forms
  • Clone an existing form
  • Remove an existing form
  • Revert an existing form to its original design-time state

To create a new form with name myForm:

Code Block

var form = solutionModel.newForm('myForm');

To get existing form myForm:

Code Block

var form = solutionModel.getForm('myForm');

To disable its navigator:

Code Block

form.navigator = SM_DEFAULTS.NONE;
Note
titleNote

When changing an existing form which has already been loaded, you need to refresh it before the end of the method by using controller.recreateUI(). If the form is not refreshed then this will result in an error.

You also need to take the following into consideration:

  • when controller.recreateUI() is called on a form, all elements are recreated based on the solution Model for that form. Any other runtime changes to the elements will be lost, like a dynamically added tab with elements.myTabPanel.addTab().
  • Any reference to the elements on the form that is stored will become invalid, as the element is recreated.
  • Function controller.recreateUI() cannot be used while a Drag 'n' Drop operation is underway on the form.

To clone existing form myForm to cloned form myClonedForm:

Code Block

var form = solutionModel.getForm('myForm');
var clonedForm = solutionModel.cloneForm('myClonedForm', form);

To remove existing form myForm:

Code Block

var success = history.removeForm('myForm');
if (success) {
	solutionModel.removeForm('myForm');
}

To revert existing form myForm to its original design-time state:

Code Block

var success = history.removeForm('myForm');
if (success) {
	solutionModel.removeForm('myForm');
}
Note
titleNote

Before removing or reverting the form by using the Solution Model it's important to remove any active instances of this form from the history stack.

Note
titleNote

You can only revert a form when it exists as a physical form created in design-time. Reverting a form which is created by the Solution Model will result in an error.

Form variables

To create a new form variable with name myFormVariable:

Code Block

var formVariable = form.newFormVariable('myFormVariable', JSField.TEXT_FIELD);

To get existing form variable myFormVariable:

Code Block

var formVariable = form.getFormVariable('myFormVariable');

To change its default value to abc:

Code Block

formVariable.defaultValue = 'abc';

To remove existing form variable myFormVariable:

Code Block

form.removeFormVariable('myFormVariable');
Form methods

To create a new form method with name myFormMethod:

Code Block

var formMethod = form.newFormMethod('function myFormMethod() {controller.newRecord(); }');

To get existing form method myFormMethod:

Code Block

var formMethod = form.getFormMethod('myformMethod');

To make it appear in the menu:

Code Block

globalMethod.showInMenu = true;

To remove existing form method myFormMethod:

...


What it is

The Solution Model is the blueprint of your developed solution. You can modify its blueprint during runtime, but the object still needs to be actually built to become available to the user. Compare it to building a house and where certain rules apply when you want to make changes to the already built house.

For example, if you want to change the window frames of your house, you can just remove the existing frames and replace them by new ones. However, if you want to change the foundation of your house then you need to completely tear down your house, replace the foundation and then build up your house again. This same analogy also applies to the Solution Model.

In Servoy there are two separate layers; the Solution Model layer (blueprint) and the runtime layer (the built version of the blueprint). In Servoy you can change certain elements within the runtime layer without having to touch the Solution Model layer (like changing the position of a button or the font of a label). However, if these changes are not within the blueprint and the object needs to be recreated according to the blueprint, then these changes will be lost.

It's also possible to create new instances of a form within Servoy (by using the function application.createNewFormInstance()). But these are copies of the actual house, rather than copies of the blueprint? It is not possible for the Solution Model to grab the properties of these copies, but only from the original. So when you try to grab the new instance of a form by using the Solution Model, then it will retrieve the original form from which the new instance has been created and not the new instance itself.


Limitations

Even though the Solution Model allows a wide variety of objects that can be manipulated, there are some limitations. The following objects are (currently) not included:

  • Aggregations
  • Security
  • Databases and their structure
  • Solutions and modules
Note
titleNote

Manipulating solutions and modules are not applicable for the Solution Model because they are not relevant during deployment. At this point the colection of solutions and modules have become one flat solution. Therefore, no (references to) solutions and modules can be made with the Solution Model.


Functionality and basic rules

The Solution Model has certain types of functions:

Type

Purpose

Clone

Copies of a certain objects can be created

Create

These factory functions allow you to create specific objects which can be used at properties of other objects

Get

Allow you to retrieve obejcts which can be manipulated by the Solution Model

New

Allow you to create new objects which can be manipulated by the Solution Model

Remove

Allow you to remove existing objects

wrapMethodWithArguments

Allows you to get a method, wrap it with arguments and assign it to an event.

With the Solution Model you can control different types of objects. Referring to these objects is done through so-called JS Objects and consist of constants, properties and/or functions.

The following list shows the objects which can be controlled by the Solution Model, its corresponding JS Object and from which JS Object it needs to be referenced from in order to use it:

Object

JS Object

Referenced from JS Object

Calculations

JSCalculation

 

Styles

JSStyle

 

Global variables

JSVariable

 

Global methods

JSMethod

 

Forms

JSForm

 

Form variables

JSVariable

JSForm

Form methods

JSMethod

JSForm

Form parts

JSPart

JSForm

Beans

JSBean

JSForm

Buttons

JSButton

JSForm

Components

JSComponent

JSForm

Fields

JSField

JSForm

Labels

JSLabel

JSForm

Parts

JSPart

JSForm

Portals

JSPortal

JSForm

Tab panels

JSTabPanel

JSForm

Tabs

JSTab

JSTabPanel

Relations

JSRelation

 

Relation items

JSRelationItem

JSRelation

Value lists

JSValueList

 

Media

JSMedia

 

Note
titleNote

A list of all these JS Objects and their corresponding constants, properties and functions can be found under the SolutionModel node in the Solution Explorer of the Developer.

Components basically work as an umbrella for all objects which are referenced from the JSForm object. By retrieving an object as a component, you can change properties which are shared by all these objects or conveniently clone the object including its referenced objects and properties.

When creating objects you need to make sure that the same object with the same name does not already exists. In this case you need to choose another name or remove the existing object.

As explained as an analogy in a previous section, some changes made with the Solution Model have such an impact that on other existing objects, that some of them need to be destroyed and recreated again.

Note
titlenote

Changed objects which affect a visible form but is not that form or any object referenced from that form should result in removing (or reverting) the form and redisplay it. Changed objects of a form or any object referenced from that form should be recreated or removed (or reverted) and redisplayed. Check the examples below for more information.

By default, changes made by the Solution Model are not persistent and are only valid for the current session in which these changes are made.

Note
titleNote

As of Servoy version 6 a new method exists, called servoyDeveloper.save(). By running this method in the Debug Client or the Command Console of the Developer, changes by the Solution Model are being pushed back and saved into the worspace.


Examples

This section shows some (simple) examples of how different objects can be controlled with the Solution Model. Per object you will find how to:

  • Create an object
  • Retrieve an existing object
  • Change a property of an object
  • Remove an existing object


Calculations

During development, calculations can be created as stored or unstored. As soon as the name of a calculation corresponds with a database column, it automatically becomes a stored calculation. The same rule applies for the Solution Model.

To create a new calculation with name myCalculation on table customers of server example_data which returns 1:

Code Block

var calculation = solutionModel.newCalculation('function myCalculation() { return 1; }', JSVariable.INTEGER, 'db:/example_data/customers');

To get the existing calculation myCalculation on table customers of server example_data:

Code Block

var calculation = solutionModel.getCalculation('myCalculation', 'db:/example_data/customers');

To output whether or not this calculation is a stored one:

Code Block

application.output('Stored calculation: ' + calculation.isStored();

To remove existing calculation myCalculation:

Code Block

solutionModel.removeCalculation('myCalculation', 'db:/example_data/customers');


Styles

To create a new stylesheet with name myStyle with a default style class for forms:

Code Block

var style = solutionModel.newStyle('myStyle' 'form { background-color: transparent; }';

To get existing stylesheet myStyle:

Code Block

var style = solutionModel.getStyle('myStyle')

To add a default style class for fields:

Code Block

style.text += 'field { background-color: blue; }';

To remove existing stylesheet myStyle:

Code Block

solutionModel.removeStyle('myStyle');


Global variables

To create a new global variable with name myGlobalVariable of type TEXT:

Code Block

var globalVariable = solutionModel.newGlobalVariable('myGlobalVariable', JSVariable.TEXT);

To get existing global variable myGlobalVariable:

Code Block

var globalVariable = solutionModel.getGlobalVariable('myGlobalVariable');

To change its default value to abc:

Code Block

myGlobalVariable.defaultValue = 'abc';

To remove existing global variable myGlobalVariable:

Code Block

solutionModel.removeGlobalVariable('myGlobalVariable');


Global methods

To create a new global method with name myGlobalMethod:

Code Block

var globalMethod = solutionModel.newGlobalMethod('function myGlobalMethod() { currentcontroller.newRecord(); }');

To get existing global method myGlobalMethod:

Code Block

var globalMethod = solutionModel.getGlobalMethod('myGlobalMethod');

To make it appear in the menu:

Code Block

globalMethod.showInMenu = true;

To remove existing global method myGlobalMethod:

Code Block

solutionModel.removeGlobalMethod('myGlobalMethod');


Forms

Forms are most commonly used with the Solution Model and have some additional functions. The following basic functions are available for this type of objects:

  • Create new forms
  • Get existing forms
  • Clone an existing form
  • Remove an existing form
  • Revert an existing form to its original design-time state

To create a new form with name myForm:

Code Block

var form = solutionModel.newForm('myForm');

To get existing form myForm:

Code Block

var form = solutionModel.getForm('myForm');

To disable its navigator:

Code Block

form.navigator = SM_DEFAULTS.NONE;
Note
titleNote

When changing an existing form which has already been loaded, you need to refresh it before the end of the method by using controller.recreateUI(). If the form is not refreshed then this will result in an error.

You also need to take the following into consideration:

  • when controller.recreateUI() is called on a form, all elements are recreated based on the solution Model for that form. Any other runtime changes to the elements will be lost, like a dynamically added tab with elements.myTabPanel.addTab().
  • Any reference to form elements which have been manipulated on the form that is stored will become invalid, as the element is recreated.
  • Function controller.recreateUI() cannot be used while a Drag 'n' Drop operation is underway on the form.

To clone existing form myForm to cloned form myClonedForm:

Code Block

var form = solutionModel.getForm('myForm');
var clonedForm = solutionModel.cloneForm('myClonedForm', form);

To remove existing form myForm:

Code Block

var success = history.removeForm('myForm');
if (success) {
	solutionModel.removeForm('myForm');
}

To revert existing form myForm to its original design-time state:

Code Block

var success = history.removeForm('myForm');
if (success) {
	solutionModel.revertForm('myForm');
}
Note
titleNote

Before removing or reverting the form by using the Solution Model it's important to remove any active instances of this form from the history stack.

Note
titleNote

You can only revert a form when it exists as a physical form created in design-time. Reverting a form which is created by the Solution Model will result in an error.


Form variables

To create a new form variable with name myFormVariable:

Code Block

var formVariable = form.newFormVariable('myFormVariable', JSField.TEXT_FIELD);

To get existing form variable myFormVariable:

Code Block

var formVariable = form.getFormVariable('myFormVariable');

To change its default value to abc:

Code Block

formVariable.defaultValue = 'abc';

To remove existing form variable myFormVariable:

Code Block

form.removeFormVariable('myFormVariable');


Form methods

To create a new form method with name myFormMethod:

Code Block

var formMethod = form.newFormMethod('function myFormMethod() {controller.newRecord(); }');

To get existing form method myFormMethod:

Code Block

var formMethod = form.getFormMethod('myformMethod');

To make it appear in the menu:

Code Block

globalMethod.showInMenu = true;

To remove existing form method myFormMethod:

Code Block

form.removeFormMethod('myFormMethod');


Form parts

To create a new body:

Code Block

var part = form.newPart(JSPart.BODY, 20);

To retrieve the existing body part:

Code Block

var part = form.getPart(JSPart.BODY);

To change its background to white:

Code Block

part.background = 'white';

To remove the existing body part:

Code Block

form.removePart(JSPart.BODY);


Beans

To create a tree view with name myBean:

...

Code Block
form.removeButton('myButton');
Components
;


Components

Components basically work as an umbrella for all form elements. By retrieving a form element through a component, you can clone the element including its properties.

Or, If you want to change properties which are common to all elements, you can do this through components instead of having to retrieve each individual object separately.

Note
titlenote

To test to what type of object the retrieved component belongs to, you need to use the JavaScript operator instanceof. For example, if you want to find out if the component is a button, use: component instanceof JSButton

To retrieve component with name myButton:

...

Code Block
var media = solutionModel.getMedia('myMedia');

To change it its content:

Code Block
media.bytes = plugins.http.getMediaData('http://servoy.com/images/headerimages/open_source.jpg');

...