SolutionModel
(solutionModel)
Overview
SolutionModel
provides runtime access to design-time objects in Servoy, enabling dynamic application modifications without recompilation. Developers can retrieve and modify forms, relations, media, and methods using methods like getForm(name)
, newForm(name)
, and getRelation(name)
. New components, forms, and relations can also be created or cloned dynamically.
Global methods and variables are managed with methods like newGlobalMethod(scopeName, code)
and newGlobalVariable(scopeName, name, type)
. Existing ones can be removed using corresponding remove
methods. Forms can be created with specific layouts and styles, made responsive, or reverted to their original configurations with revertForm(name)
.
The API supports argument wrapping for event handling with wrapMethodWithArguments(method, args)
and allows management of value lists, media, and relations.
Returned Types
DEFAULTS,FONTSTYLE,SCROLLBAR,JSForm,JSDataSourceNode,JSCalculation,JSLayoutContainer,JSComponent,JSMethod,JSPart,JSRelation,JSRelationItem,JSMedia,JSValueList,JSVariable,JSPart,JSPart,JSComponent,
Methods Summarized
Makes an exact copy of the given component (JSComponent/JSField/JSLabel) and gives it a new name.
Makes an exact copy of the given component (JSComponent/JSField/JSLabel), gives it a new name and moves it to a new parent form, specified as a parameter.
Gets the specified data source node and returns information about the form (see JSDataSourceNode node).
Gets the specified form object and returns information about the form (see JSForm node).
Get an array of forms, that are all based on datasource/servername and tablename.
Gets an existing relation by the specified name and returns a JSRelation Object.
Gets an array of all relations; or an array of all global relations if the specified table is NULL.
Gets an array of all relations; or an array of all global relations if the specified table is NULL.
Gets an existing valuelist by the specified name and returns a JSValueList Object that can be assigned to a field.
Creates a new form with the given JSForm as its super form.
Creates a new JSForm Object.
Creates a new global method with the specified code in a scope.
Creates a new global variable with the specified name and number type.
Creates a new media object for things like a CSS or LESS file that can be set as the clients solution style.
Creates a new JSRelation Object with a specified name; includes the primary datasource, foreign datasource and the type of join for the new relation.
Reverts the specified form to the original (blueprint) version of the form; will result in an exception error if the form is not an original form.
Get a JSMethod instance with arguments to be assigned to an event.
Methods Detailed
cloneComponent(newName, component)
Makes an exact copy of the given component (JSComponent/JSField/JSLabel) and gives it a new name.
Parameters
String newName the new name of the cloned component
JSComponent component the component to clone
Returns: JSComponent the exact copy of the given component
Sample
// get an existing field to clone.
var field = solutionModel.getForm("formWithField").getField("fieldName");
// make a clone/copy of the field
var clone = solutionModel.cloneComponent("clonedField",field);
cloneComponent(newName, component, newParentForm)
Makes an exact copy of the given component (JSComponent/JSField/JSLabel), gives it a new name and moves it to a new parent form, specified as a parameter.
Parameters
String newName the new name of the cloned component
JSComponent component the component to clone
JSForm newParentForm the new parent form
Returns: JSComponent the exact copy of the given component
Sample
// get an existing field to clone.
var field = solutionModel.getForm("formWithField").getField("fieldName");
// get the target form for the copied/cloned field
var form = solutionModel.getForm("targetForm");
// make a clone/copy of the field and re parent it to the target form.
var clone = solutionModel.cloneComponent("clonedField",field,form);
// show it
forms["targetForm"].controller.show();
cloneForm(newName, jsForm)
Makes an exact copy of the given form and gives it the new name.
Parameters
Returns: JSForm a JSForm
Sample
// get an existing form
var form = solutionModel.getForm("existingForm")
// make a clone/copy from it
var clone = solutionModel.cloneForm("clonedForm", form)
// add a new label to the clone
clone.newLabel("added label",50,50,80,20);
// show it
forms["clonedForm"].controller.show();
getAllRelations()
Gets an array of all relations.
Returns: Array an array of all relations (all elements in the array are of type JSRelation)
Sample
var relations = solutionModel.getAllRelations();
if (relations.length != 0)
for (var i in relations)
application.output(relations[i].name);
getDataSourceNode(dataSource)
Gets the specified data source node and returns information about the form (see JSDataSourceNode node). The JSDataSourceNode holds all calculations and foundset methods.
Parameters
String dataSource table data source
Returns: JSDataSourceNode a JSDataSourceNode
Sample
var dsnode = solutionModel.getDataSourceNode('db:/example_data/customers');
var c = dsnode.getCalculation("myCalculation");
application.output("Name: " + c.getName() + ", Stored: " + c.isStored());
getForm(name)
Gets the specified form object and returns information about the form (see JSForm node).
Parameters
String name the specified name of the form
Returns: JSForm a JSForm
Sample
var myForm = solutionModel.getForm('existingFormName');
//get the style of the form (for all other properties see JSForm node)
var styleName = myForm.styleName;
getForms()
Get an array of all forms.
Returns: Array an array of JSForm type elements
Sample
var forms = solutionModel.getForms()
for (var i in forms)
application.output(forms[i].name)
getForms(datasource)
Get an array of forms, that are all based on datasource/servername.
Parameters
String datasource the datasource or servername
Returns: Array an array of JSForm type elements
Sample
var forms = solutionModel.getForms(datasource)
for (var i in forms)
application.output(forms[i].name)
getForms(server, tablename)
Get an array of forms, that are all based on datasource/servername and tablename.
Parameters
Returns: Array an array of JSForm type elements
Sample
var forms = solutionModel.getForms(datasource,tablename)
for (var i in forms)
application.output(forms[i].name)
getGlobalMethod(scopeName, name)
Gets an existing global method by the specified name.
Parameters
String scopeName the scope in which the method is searched
String name the name of the specified global method
Returns: JSMethod a JSMethod
Sample
var method = solutionModel.getGlobalMethod('globals', 'nameOfGlobalMethod');
if (method != null) application.output(method.code);
getGlobalMethods()
The list of all global methods.
Returns: Array an array of JSMethod type elements
Sample
var methods = solutionModel.getGlobalMethods('globals');
for (var x in methods)
application.output(methods[x].getName());
getGlobalMethods(scopeName)
The list of all global methods.
Parameters
String scopeName limit to global methods of specified scope name
Returns: Array an array of JSMethod type elements
Sample
var methods = solutionModel.getGlobalMethods('globals');
for (var x in methods)
application.output(methods[x].getName());
getGlobalVariable(scopeName, name)
Gets an existing global variable by the specified name.
Parameters
String scopeName the scope in which the variable is searched
String name the specified name of the global variable
Returns: JSVariable a JSVariable
Sample
var globalVariable = solutionModel.getGlobalVariable('globals', 'globalVariableName');
application.output(globalVariable.name + " has the default value of " + globalVariable.defaultValue);
getGlobalVariables()
Gets an array of all global variables.
Returns: Array an array of JSVariable type elements
Sample
var globalVariables = solutionModel.getGlobalVariables('globals');
for (var i in globalVariables)
application.output(globalVariables[i].name + " has the default value of " + globalVariables[i].defaultValue);
getGlobalVariables(scopeName)
Gets an array of all global variables.
Parameters
String scopeName limit to global vars of specified scope name
Returns: Array an array of JSVariable type elements
Sample
var globalVariables = solutionModel.getGlobalVariables('globals');
for (var i in globalVariables)
application.output(globalVariables[i].name + " has the default value of " + globalVariables[i].defaultValue);
getMedia(name)
Gets the specified media object; can be assigned to a button/label.
Parameters
String name the specified name of the media object
Returns: JSMedia a JSMedia element
Sample
var myMedia = solutionModel.getMedia('button01.gif')
//now set the imageMedia property of your label or button
//myButton.imageMedia = myMedia
// OR
//myLabel.imageMedia = myMedia
getMediaList()
Gets the list of all media objects.
Returns: Array a list with all the media objects.
Sample
var mediaList = solutionModel.getMediaList();
if (mediaList.length != 0 && mediaList != null) {
for (var x in mediaList) {
application.output(mediaList[x]);
}
}
getObjectByUUID(uuid)
Retrieves an element by its uuid.
Parameters
Object uuid element uuid
Returns: Object found element
Sample
solutionModel.getObjectByUUID(uuid)
getRelation(name)
Gets an existing relation by the specified name and returns a JSRelation Object.
Parameters
String name the specified name of the relation
Returns: JSRelation a JSRelation
Sample
var relation = solutionModel.getRelation('name');
application.output("The primary server name is " + relation.primaryServerName);
application.output("The primary table name is " + relation.primaryTableName);
application.output("The foreign table name is " + relation.foreignTableName);
application.output("The relation items are " + relation.getRelationItems());
getRelations(datasource)
Gets an array of all relations; or an array of all global relations if the specified table is NULL.
Parameters
String datasource the specified name of the datasource for the specified table
Returns: Array an array of all relations (all elements in the array are of type JSRelation)
Sample
var relations = solutionModel.getRelations('server_name','table_name');
if (relations.length != 0)
for (var i in relations)
application.output(relations[i].name);
getRelations(servername, tablename)
Gets an array of all relations; or an array of all global relations if the specified table is NULL.
Parameters
String servername the specified name of the server for the specified table
String tablename the specified name of the table
Returns: Array an array of all relations (all elements in the array are of type JSRelation)
Sample
var relations = solutionModel.getRelations('server_name','table_name');
if (relations.length != 0)
for (var i in relations)
application.output(relations[i].name);
getScopeNames()
Gets an array of all scope names used.
Returns: Array an array of String scope names
Sample
var scopeNames = solutionModel.getScopeNames();
for (var name in scopeNames)
application.output(name);
getValueList(name)
Gets an existing valuelist by the specified name and returns a JSValueList Object that can be assigned to a field.
NOTE: Changes to valuelist should be done before showing any form that has component using the valuelist.
Parameters
String name the specified name of the valuelist
Returns: JSValueList a JSValueList object
Sample
var myValueList = solutionModel.getValueList('myValueListHere')
//now set the valueList property of your field
//myField.valuelist = myValueList
getValueLists()
Gets an array of all valuelists for the currently active solution.
NOTE: Changes to valuelist should be done before showing any form that has component using the valuelist.
Returns: Array an array of JSValueList objects
Sample
var valueLists = solutionModel.getValueLists();
if (valueLists != null && valueLists.length != 0)
for (var i in valueLists)
application.output(valueLists[i].name);
newForm(name)
Creates a new JSForm Object.
Parameters
String name the specified name of the form
Returns: JSForm a new JSForm object
Sample
var myForm = solutionModel.newForm('newForm')
newForm(name, isResponsive)
Create a responsive form:
Parameters
String name The name of the new form, must be a valid javascript identifier
Boolean isResponsive if true will create an responsive form, otherwise an absolute layout form
Returns: JSForm a new JSForm object
Sample
var frm = solutionModel.newForm('test', true);
var c = frm.newLayoutContainer(1);
newForm(name, superForm)
Creates a new form with the given JSForm as its super form.
Parameters
String name The name of the new form
JSForm superForm the super form that will extended from, see JSform.setExtendsForm();
Returns: JSForm a new JSForm object
Sample
//creates 2 forms with elements on them; shows the parent form, waits 2 seconds and shows the child form
var mySuperForm = solutionModel.newForm('mySuperForm', 'db:/my_server/my_table', null, false, 800, 600);
var label1 = mySuperForm.newLabel('LabelName', 20, 20, 120, 30);
label1.text = 'DataProvider';
label1.background = 'red';
mySuperForm.newTextField('myDataProvider', 140, 20, 140,20);
forms['mySuperForm'].controller.show();
application.sleep(2000);
var mySubForm = solutionModel.newForm('mySubForm', mySuperForm);
var label2 = mySuperForm.newLabel('SubForm Label', 20, 120, 120, 30);
label2.background = 'green';
forms['mySuperForm'].controller.recreateUI();
forms['mySubForm'].controller.show();
newForm(name, superForm, isResponsive)
Creates a new form with the given JSForm as its super form. Use this function in the case when the super form is a logical form (no parts/UI).
Parameters
String name The name of the new form, must be a valid javascript identifier
JSForm superForm the super form that will extended from, see JSform.setExtendsForm();
Boolean isResponsive ;
Returns: JSForm a new JSForm object
Sample
//creates 2 forms with elements on them; shows the parent form, waits 2 seconds and shows the child form
var mySuperForm = solutionModel.newForm('mySuperForm', 'db:/my_server/my_table', null, false, 800, 600);
var label1 = mySuperForm.newLabel('LabelName', 20, 20, 120, 30);
label1.text = 'DataProvider';
label1.background = 'red';
mySuperForm.newTextField('myDataProvider', 140, 20, 140,20);
forms['mySuperForm'].controller.show();
application.sleep(2000);
var mySubForm = solutionModel.newForm('mySubForm', mySuperForm);
var label2 = mySuperForm.newLabel('SubForm Label', 20, 120, 120, 30);
label2.background = 'green';
forms['mySuperForm'].controller.recreateUI();
forms['mySubForm'].controller.show();
newForm(name, dataSource, isResponsive)
Create a responsive form:
Parameters
String name The name of the new form, must be a valid javascript identifier
String dataSource the form datasource
Boolean isResponsive if true will create an responsive form, otherwise an absolute layout form
Returns: JSForm a new JSForm object
Sample
var frm = solutionModel.newForm('test','db:/my_server/my_table', true);
var c = frm.newLayoutContainer(1);
newForm(name, dataSource, styleName, show_in_menu, width, height)
Creates a new JSForm Object.
NOTE: See the JSForm node for more information about form objects that can be added to the new form.
Parameters
String name the specified name of the form, must be a valid javascript identifier
String dataSource the specified name of the datasource for the specified table
String styleName the specified style
Boolean show_in_menu if true show the name of the new form in the menu; or false for not showing
Number width the width of the form in pixels
Number height the height of the form in pixels
Returns: JSForm a new JSForm object
Sample
var myForm = solutionModel.newForm('newForm', 'db:/my_server/my_table', 'myStyleName', false, 800, 600)
//now you can add stuff to the form (under JSForm node)
//add a label
myForm.newLabel('Name', 20, 20, 120, 30)
//add a "normal" text entry field
myForm.newTextField('dataProviderNameHere', 140, 20, 140,20)
newForm(name, serverName, tableName, styleName, show_in_menu, width, height)
Creates a new JSForm Object.
NOTE: See the JSForm node for more information about form objects that can be added to the new form.
Parameters
String name the specified name of the form
String serverName the specified name of the server for the specified table
String tableName the specified name of the table
String styleName the specified style
Boolean show_in_menu if true show the name of the new form in the menu; or false for not showing
Number width the width of the form in pixels
Number height the height of the form in pixels
Returns: JSForm a new JSForm object
Sample
var myForm = solutionModel.newForm('newForm', 'my_server', 'my_table', 'myStyleName', false, 800, 600)
//With only a datasource:
//var myForm = solutionModel.newForm('newForm', datasource, 'myStyleName', false, 800, 600)
//now you can add stuff to the form (under JSForm node)
//add a label
myForm.newLabel('Name', 20, 20, 120, 30)
//add a "normal" text entry field
myForm.newTextField('dataProviderNameHere', 140, 20, 140,20)
newGlobalMethod(scopeName, code)
Creates a new global method with the specified code in a scope.
Parameters
String scopeName the scope in which the method is created
String code the specified code for the global method
Returns: JSMethod a JSMethod object
Sample
var method = solutionModel.newGlobalMethod('globals', 'function myglobalmethod(){foundset.newRecord()}')
newGlobalVariable(scopeName, name, type)
Creates a new global variable with the specified name and number type.
NOTE: The global variable number type is based on the value assigned from the SolutionModel-JSVariable node; for example: JSVariable.INTEGER.
Parameters
String scopeName the scope in which the variable is created
String name the specified name for the global variable
Number type the specified number type for the global variable
Returns: JSVariable a JSVariable object
Sample
var myGlobalVariable = solutionModel.newGlobalVariable('globals', 'newGlobalVariable', JSVariable.INTEGER);
myGlobalVariable.defaultValue = 12;
//myGlobalVariable.defaultValue = "{a:'First letter',b:'Second letter'}" // an js object, type must be media.
//myGlobalVariable.defaultValue = '"some text"'; // Use two pairs of quotes if you want to assign a String as default value.
newMedia(name, bytes)
Creates a new media object that can be assigned to a label or a button.
Parameters
Returns: JSMedia a JSMedia object
Sample
var myMedia = solutionModel.newMedia('button01.gif',bytes)
//now set the imageMedia property of your label or button
//myButton.imageMedia = myMedia
// OR
//myLabel.imageMedia = myMedia
newMedia(name, bytes)
Creates a new media object for things like a CSS or LESS file that can be set as the clients solution style. The stringContents is converted to bytes through the UTF-8 charset.
Parameters
Returns: JSMedia a JSMedia object
Sample
var myMedia = solutionModel.newMedia('button01.gif',stringContent)
//now set the imageMedia property of your label or button
//myButton.imageMedia = myMedia
// OR
//myLabel.imageMedia = myMedia
newRelation(name, primaryDataSource, foreignDataSource, joinType)
Creates a new JSRelation Object with a specified name; includes the primary datasource, foreign datasource and the type of join for the new relation.
Parameters
String name the specified name of the new relation
String primaryDataSource the specified name of the primary datasource
String foreignDataSource the specified name of the foreign datasource
Number joinType the type of join for the new relation; JSRelation.INNER_JOIN, JSRelation.LEFT_OUTER_JOIN
Returns: JSRelation a JSRelation object
Sample
var rel = solutionModel.newRelation('myRelation', myPrimaryDataSource, myForeignDataSource, JSRelation.INNER_JOIN);
application.output(rel.getRelationItems());
newValueList(name, type)
Creates a new valuelist with the specified name and number type.
Parameters
String name the specified name for the valuelist
Number type the specified number type for the valuelist; may be JSValueList.CUSTOM_VALUES, JSValueList.DATABASE_VALUES, JSValueList.EMPTY_VALUE_ALWAYS, JSValueList.EMPTY_VALUE_NEVER
Returns: JSValueList a JSValueList object
Sample
var vl1 = solutionModel.newValueList("customText",JSValueList.CUSTOM_VALUES);
vl1.customValues = "customvalue1\ncustomvalue2";
var vl2 = solutionModel.newValueList("customid",JSValueList.CUSTOM_VALUES);
vl2.customValues = "customvalue1|1\ncustomvalue2|2";
var form = solutionModel.newForm("customValueListForm",controller.getDataSource(),null,true,300,300);
var combo1 = form.newComboBox("scopes.globals.text",10,10,120,20);
combo1.valuelist = vl1;
var combo2 = form.newComboBox("scopes.globals.id",10,60,120,20);
combo2.valuelist = vl2;
removeForm(name)
Removes the specified form during the persistent connected client session.
NOTE: Make sure you call history.remove first in your Servoy method (script).
Parameters
String name the specified name of the form to remove
Returns: Boolean true is form has been removed, false if form could not be removed
Sample
//first remove it from the current history, to destroy any active form instance
var success = history.removeForm('myForm')
//removes the named form from this session, please make sure you called history.remove() first
if(success)
{
solutionModel.removeForm('myForm')
}
removeGlobalMethod(scopeName, name)
Removes the specified global method.
Parameters
String scopeName the scope in which the method is declared
String name the name of the global method to be removed
Returns: Boolean true if the removal was successful, false otherwise
Sample
var m1 = solutionModel.newGlobalMethod('globals', 'function myglobalmethod1(){application.output("Global Method 1");}');
var m2 = solutionModel.newGlobalMethod('globals', 'function myglobalmethod2(){application.output("Global Method 2");}');
var success = solutionModel.removeGlobalMethod('globals', 'myglobalmethod1');
if (success == false) application.output('!!! myglobalmethod1 could not be removed !!!');
var list = solutionModel.getGlobalMethods('globals');
for (var i = 0; i < list.length; i++) {
application.output(list[i].code);
}
removeGlobalVariable(scopeName, name)
Removes the specified global variable.
Parameters
String scopeName the scope in which the variable is declared
String name the name of the global variable to be removed
Returns: Boolean true if the removal was successful, false otherwise
Sample
var v1 = solutionModel.newGlobalVariable('globals', 'globalVar1', JSVariable.INTEGER);
var v2 = solutionModel.newGlobalVariable('globals', 'globalVar2', JSVariable.TEXT);
var success = solutionModel.removeGlobalVariable('globals', 'globalVar1');
if (success == false) application.output('!!! globalVar1 could not be removed !!!');
var list = solutionModel.getGlobalVariables('globals');
for (var i = 0; i < list.length; i++) {
application.output(list[i].name + '[ ' + list[i].variableType + ']: ' + list[i].variableType);
}
removeMedia(name)
Removes the media item specified by name.
Parameters
String name the name of the media item to be removed
Returns: Boolean true if the removal was successful, false otherwise
Sample
var bytes1 = plugins.file.readFile('D:/Imgs/image1.png');
var image1 = solutionModel.newMedia('image1.png', bytes1);
var bytes2 = plugins.file.readFile('D:/Imgs/image2.jpg');
var image2 = solutionModel.newMedia('image2.jpg',bytes2);
var bytes3 = plugins.file.readFile('D:/Imgs/image3.jpg');
var image3 = solutionModel.newMedia('image3.jpg',bytes3);
var f = solutionModel.newForm("newForm",databaseManager.getDataSource('example_data', 'orders'),null,false,500,350);
var l = f.newLabel('', 20, 70, 300, 200);
l.imageMedia = image1;
l.borderType = solutionModel.createLineBorder(4,'#ff0000');
forms["newForm"].controller.show();
var status = solutionModel.removeMedia('image1.jpg');
if (status) application.output("image1.png has been removed");
else application.output("image1.png has not been removed");
var mediaList = solutionModel.getMediaList();
for (var i = 0; i < mediaList.length; i++) {
application.output(mediaList[i].getName() + ":" + mediaList[i].mimeType);
}
removeRelation(name)
Removes the relation specified by name. You cannot remove the relation if it is touched within the application. So even if you remove all the ui elements using it, like tabs, it still can't be removed, because of underlying created and cached data.
Parameters
String name the name of the relation to be removed
Returns: Boolean true if the removal was successful, false otherwise
Sample
var success = solutionModel.removeRelation('myRelation');
if (success) { application.output("Relation has been removed");}
else {application.output("Relation could not be removed");}
removeValueList(name)
Removes the specified valuelist.
Parameters
String name name of the valuelist to be removed
Returns: Boolean true if the removal was successful, false otherwise
Sample
var vlName = "customValueList";
var vl = solutionModel.newValueList(vlName,JSValueList.CUSTOM_VALUES);
vl.customValues = "customvalue1\ncustomvalue2";
var status = solutionModel.removeValueList(vlName);
if (status) application.output("Removal has been done.");
else application.output("ValueList not removed.");
var vls = solutionModel.getValueLists();
if (vls != null) {
for (var i = 0; i < vls.length; i++) {
application.output(vls[i]);
}
application.output("");
}
revertForm(name)
Reverts the specified form to the original (blueprint) version of the form; will result in an exception error if the form is not an original form.
NOTE: Make sure you call history.remove first in your Servoy method (script) or call form.controller.recreateUI() before the script ends.
Parameters
String name the specified name of the form to revert
Returns: JSForm a JSForm object
Sample
// revert the form to the original solution form, removing any changes done to it through the solution model.
var revertedForm = solutionModel.revertForm('myForm')
// add a label on a random place.
revertedForm.newLabel("MyLabel",Math.random()*100,Math.random()*100,80,20);
// make sure that the ui is up to date.
forms.myForm.controller.recreateUI();
wrapMethodWithArguments(method, args)
Get a JSMethod instance with arguments to be assigned to an event.
Parameters
Returns: JSMethod a JSMethod
Sample
var str = "John's Bookstore"
var form = solutionModel.getForm('orders')
var button = form.getButton('abutton')
var method = form.getFormMethod('doit') // has 4 arguments: event (fixed), boolean, number and string
// string arguments have to be quoted, they are interpreted before the method is called
var quotedString = "'"+utils.stringReplace(str, "'", "\\'")+"'"
// list all arguments the method has, use nulls for fixed arguments (like event)
button.onAction = solutionModel.wrapMethodWithArguments(method, [null, true, 42, quotedString])
Last updated
Was this helpful?