Model
Represents the persistent classes of the system. For example A Book class. We will use a library management system to explain this part.
In your application, create a “model” folder which will contain your classes. For each class, you must create its definition.
1. Notion of “model definition”
a. Sample code
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Cmodel%3B%0Ause%20muuska%5Cconstants%5CDataType%3B%0Ause%20muuska%5Cconstants%5CFieldNature%3B%0Ause%20muuska%5Cmodel%5CAbstractModelDefinition%3B%0Ause%20myapp%5Coption%5CAccessibilityProvider%3B%0Aclass%20LibraryDefinition%20extends%20AbstractModelDefinition%0A%7B%0A%20%20%20%20protected%20static%20%24instance%3B%0A%20%20%20%20public%20static%20function%20getInstance()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(self%3A%3A%24instance%20%3D%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self%3A%3A%24instance%20%3D%20new%20static()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20self%3A%3A%24instance%3B%0A%20%20%20%20%7D%0A%20%20%20%20protected%20function%20createDefinition()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20’name’%20%3D%3E%20’library’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’primary’%20%3D%3E%20’id’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’autoIncrement’%20%3D%3E%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’fields’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’addressId’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_INT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AEXISTING_MODEL_ID%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’required’%20%3D%3E%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’reference’%20%3D%3E%20AddressDefinition%3A%3AgetInstance()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’name’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3ANAME%2C%20’maxSize’%20%3D%3E%20200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’openingTime’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’validateRule’%20%3D%3E%20’isGenericName’%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’accessibility’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_INT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AOPTION%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’optionProvider’%20%3D%3E%20new%20AccessibilityProvider()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’image’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AIMAGE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’description’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3ALONG_TEXT%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%20%20%20%20public%20function%20createModel()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Library()%3B%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
b. Getting a single instance
The following block of code should be added in all of your definitions to ensure that there is only one instance of the class in the application.
[pastacode lang=”php” manual=”protected%20static%20%24instance%3B%0Apublic%20static%20function%20getInstance()%0A%7B%0A%20%20%20%20if%20(self%3A%3A%24instance%20%3D%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20self%3A%3A%24instance%20%3D%20new%20static()%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20self%3A%3A%24instance%3B%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
c. the “createModel” method
The “createModel” method allows to create a new instance of a model.
d. The “createDefinition” method
The “createDefinition” method returns an associative table defining the class. The following content explains these different fields.
– FIELDS
- name
- Description : Represents the name of the class that will be used by the persistence support (For example for the database it will represent the name of the table).
- Data type : string
- optional : no
- primary
- Description : The name of the field representing the object identifier.
- Data type : string
- optional : yes (If the object has more than one identifier)
- primaries
- Description : Nom des champs permettant d’identifier l’objet.
- Data type : table
- optional : yes (If the object has only one identifier)
- autoIncrement
- Description : Indicates whether you want the value of the identifier of an object to be assigned automatically. This field is only useful for Classes with a single identifier.
- Data type : boolean
- optional : yes
- multilingual
- Description : Allows to specify whether the object supports multilingual.
- Data type : boolean
- optional : yes
- uniques
- Description : allows to specify an attribute group for which you do not want to have multiple records with the same pairs of values. For example, if I don’t want to have two authors with the same first name and the same last name[pastacode lang=”php” manual=”‘uniques’%20%3D%3E%20array(%0A%20%20%20%20%20%20array(‘firstName’%2C%20’lastName’)%0A%20)%2C%0A” message=”” highlight=”” provider=”manual”/]
- Data type : Associative table
- optional : yes
- fields
- Description : Represents the definition of persistent attributes of the class.
- Data type : Associative table
- optional : no
- presentationFields
- Description : Fields used for the description of the object and also for auto-completion.
If you leave this information blank, the system will search for the appropriate fields among the following values (in this order): “firstName + lastName“,“Label”, “displayName”, “name”, “title”, “code”, “reference”. - Data type : table
- optional : yes
- Description : Fields used for the description of the object and also for auto-completion.
- presentationFields Separator
- Description : The separator to be used in case “presentationFields” contains more than one element. The not-fault value is space.
- Data type : string
- optional : yes
- projectType
- Description : The type of project to which the object is associated. The default is muuskaprojectconstantsProjectType::Application
- Data type : string
- optional : yes
- projectName
- Description : The name of the project to which the object is associated.
- Data type : string
- optional : yes
- associations
- Description : It is associative table where the key represents the name of the association and the value is a table defining the association. The definition of the association is an associative table with the following info:
- reference : object representing the definition of the external class.
- field : field name representing the ID of the common object in the external class
- Data type : table
- optional : yes
- Description : It is associative table where the key represents the name of the association and the value is a table defining the association. The definition of the association is an associative table with the following info:
e. Definition of multiple associations
[pastacode lang=”php” manual=”‘associations’%20%3D%3E%20array(%0A%20%20%20%20’books’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20’reference’%20%3D%3E%20BookDefinition%3A%3AgetInstance()%2C%0A%20%20%20%20%20%20%20%20’field’%20%3D%3E%20’libraryId’%0A%20%20%20%20)%2C%0A%20%20%20%20’speciatilies’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20’reference’%20%3D%3E%20LibrarySpecialityDefinition%3A%3AgetInstance()%2C%0A%20%20%20%20%20%20%20%20’field’%20%3D%3E%20’libraryId’%0A%20%20%20%20)%2C%0A%20%20%20%20’types’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20’reference’%20%3D%3E%20LibraryTypeDefinition%3A%3AgetInstance()%2C%0A%20%20%20%20%20%20%20%20’field’%20%3D%3E%20’libraryId’%0A%20%20%20%20)%2C%0A)%0A” message=”” highlight=”” provider=”manual”/]
f. Definition of a field
The “fields” field of the model definition returned by the “createDefinition” method
The “fields” field is an associative table representing the definition of the persistent attributes of the class.
NB: If in the “createDefinition” method, the “autoIncrement” field is defined with the value “true“, the property representing the identifier of the class must not appear in the “fields” table.
The “fields” table is of the form “key-value” where:
- The “key” is a string representing the name of a property of the example class “firstName”.
- The “value” is an associative table representing the definition of the property. The following table lists the available fields :
– FIELDS
- type
- Description : The type of data handled by the attribute. This type is the type under which the data will be persisted. (integer, character string, boolean, etc …) A set of constants are defined in the muuska constants DataType class.
- Data type : integer
- Optional : no
- nature
- Description : Represents the nature of the data. That is, the type of information that the variable is supposed to contain can be a phone number, an email address, a password, a name, etc.
A set of constants is defined in the muuska constants FieldNature class. - Data type : integer
- Optional : yes
- Description : Represents the nature of the data. That is, the type of information that the variable is supposed to contain can be a phone number, an email address, a password, a name, etc.
- required
- Description : Allows to specify whether the attribute is required or not.
- Data type : boolean
- Optional : yes
- validationRule
- Description : Allows to specify the name of the method that will be used for the validation of attribute data. This name must match a method name in the muuska validation ValidationRuleManager class.
Example “isPhoneNumber” - Data type : string
- Optional : yes
- Description : Allows to specify the name of the method that will be used for the validation of attribute data. This name must match a method name in the muuska validation ValidationRuleManager class.
- validationRules
- Description : List of validation rules
- Data type : table
- Optional : yes
- maxSize
- Description : The maximum number of characters allowed by the attribute.
- Data type : integer
- Optional : yes
- minSize
- Description : The minimum number of characters allowed by the attribute.
- Data type : integer
- Optional : yes
- maxValue
- Description : Maximum value allowed.
- Data type : integer
- Optional : yes
- minValue
- Description : Minimum value allowed.
- Data type : integer
- Optional : yes
- unique
- Description : Allows specifying that the attribute value should be unique eg I don’t want to have two books in my system with the same code.
- Data type : boolean
- Optional : yes
- reference
- Description : Required only in case the nature of the field is FieldNature :: EXISTING_MODEL_ID. It represents the object containing the definition of the class to which the attribute points.
This object must be an instance of the class
“Muuska model AbstractModelDefinition”. - Data type : Object
- Optional : yes
- Description : Required only in case the nature of the field is FieldNature :: EXISTING_MODEL_ID. It represents the object containing the definition of the class to which the attribute points.
- onDelete
- Description : Required only if the nature of the field is FieldNature :: EXISTING_MODEL_ID. Allows to specify the behavior (CASCADE, RESTRICT, etc …) in case of deletion of the object reference.
A set of constants are defined in the muuskadaoconstantsReferenceOption class. - Data type : integer
- Optional : yes
- Description : Required only if the nature of the field is FieldNature :: EXISTING_MODEL_ID. Allows to specify the behavior (CASCADE, RESTRICT, etc …) in case of deletion of the object reference.
- optionProvider
- Description : Required only if the nature of the field is FieldNature :: OPTION.
Represents the object that will provide the options to use.
This attribute is useful in case we have a predefined list of values for a field in other words, it represents enumerations.
This object must be an instance of the “muuskaoptionAbstractOptionProvider” class. - Data type : Object
- Optional : yes
- Description : Required only if the nature of the field is FieldNature :: OPTION.
- validator
- Description : Allows to specify a custom validator for the field.
This object must implement the muuskavalidationValidator interface.
The muuskavalidationDefaultValidator class
Implements this interface and allows you to create an instance by defining a callback function. - Data type : Object
- Optional : yes
- Description : Allows to specify a custom validator for the field.
- type
Implementing a custom validator for a field
[pastacode lang=”php” manual=”%24callback%20%3D%20function%20(%5Cmuuska%5Cvalidation%5Cinput%5CValidationInput%20%24input)%20%7B%0A%20%20%20%20%24result%20%3D%20null%3B%0A%20%20%20%20if%20(%24input-%3EgetValue()%20%3D%3D%3D%20’My%20value’)%20%7B%0A%20%20%20%20%20%20%20%20%24result%20%3D%20App%3A%3Avalidations()-%3EcreateDefaultValidationResult(true)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%24result%20%3D%20App%3A%3Avalidations()-%3EcreateDefaultValidationResult(%0A%20%20%20%20%20%20%20%20%20%20%20%20false%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BApp%3A%3AtranslateApp(App%3A%3AcreateErrorTranslationConfig()%2C’My%20value%20is%20required’%2C%24input-%3EgetLang())%5D%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%24result%3B%0A%7D%3B%0A%24validator%20%3D%20App%3A%3Avalidations()-%3EcreateDefaultValidator(%24callback)%3B%0A%0A’description’%20%3D%3E%20array(%0A%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3ALONG_TEXT%2C%0A%20%20%20%20’validator’%20%3D%3E%20%24validator%0A)%0A” message=”” highlight=”” provider=”manual”/]
Create options for a field
Add an options folder in your application then add the class of your option.
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Coption%3B%0A%0Ause%20muuska%5Coption%5Cprovider%5CAbstractOptionProvider%3B%0Ause%20myapp%5Cconstants%5CAccessibility%3B%0A%0Aclass%20AccessibilityProvider%20extends%20AbstractOptionProvider%0A%7B%0A%20%20%20%20protected%20function%20initOptions()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24this-%3EaddArrayOption(Accessibility%3A%3APUBLIC%2C%20%24this-%3El(‘Public’))%3B%0A%20%20%20%20%20%20%20%20%24this-%3EaddArrayOption(Accessibility%3A%3APRIVATE%2C%20%24this-%3El(‘Private’))%3B%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
The initOptions method allows to initialize your options. With the addArrayOption method, you can add your options, the first parameter represents the value of the option, and the second the label of the option. You must use the “l” method to obtain the translation of a text.
Definition of an external field
[pastacode lang=”php” manual=”‘addressId’%20%3D%3E%20array(%0A%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_INT%2C%0A%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AEXISTING_MODEL_ID%2C%0A%20%20%20%20’required’%20%3D%3E%20true%2C%0A%20%20%20%20’reference’%20%3D%3E%20AddressDefinition%3A%3AgetInstance()%2C%0A%20%20%20%20’onDelete’%20%3D%3E%20ReferenceOption%3A%3ACASCADE%0A)%2C%0A” message=”” highlight=”” provider=”manual”/]
g. Using an associative table as a template
You don’t have to create a model class for all of your definitions. You can specify in the definition that you want to create an associative table. To do this, you need to add the following statement in the definition:
[pastacode lang=”php” manual=”‘modelType’%20%3D%3E%20self%3A%3AMODEL_TYPE_ARRAY%2C” message=”” highlight=”” provider=”manual”/]
Once this instruction has been added, each time we want an instance of the model, an instance of the muuska model ArrayModel class will be returned.
This class contains the following methods :
getPropertyValue
Get the value of a property. It takes the name of the property as a parameter.
setPropertyValue
Used to change the value of a property, it takes the name of the property and the new value as a parameter.
The final definition of the object will be :
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Cmodel%3B%0A%0Ause%20muuska%5Cconstants%5CDataType%3B%0Ause%20muuska%5Cconstants%5CFieldNature%3B%0Ause%20muuska%5Cdao%5Cconstants%5CReferenceOption%3B%0Ause%20muuska%5Cmodel%5CAbstractModelDefinition%3B%0A%0Aclass%20%20CategoryDefinition%20extends%20AbstractModelDefinition%0A%7B%0A%0A%20%20%20%20protected%20static%20%24instance%3B%0A%0A%20%20%20%20public%20static%20function%20getInstance()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(self%3A%3A%24instance%20%3D%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self%3A%3A%24instance%20%3D%20new%20static()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20self%3A%3A%24instance%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20protected%20function%20createDefinition()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20’name’%20%3D%3E%20’category’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’primary’%20%3D%3E%20’id’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’autoIncrement’%20%3D%3E%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’fields’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’parentId’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_INT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AEXISTING_MODEL_ID%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’reference’%20%3D%3E%20static%3A%3AgetInstance()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’onDelete’%20%3D%3E%20ReferenceOption%3A%3ACASCADE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’name’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3ANAME%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’required’%20%3D%3E%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’maxSize’%20%3D%3E%20200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’image’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3AIMAGE%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’maxSize’%20%3D%3E%2050%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’description’%20%3D%3E%20array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’type’%20%3D%3E%20DataType%3A%3ATYPE_STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20’nature’%20%3D%3E%20FieldNature%3A%3ALONG_TEXT%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
2. Notion of model
It is a class with attributes, a method, getters and setters.
It must inherit from the muuskamodelAbstractModel class
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Cmodel%3B%0A%0Ause%20muuska%5Cmodel%5CAbstractModel%3B%0A%0Aclass%20Library%20extends%20AbstractModel%7B%0A%09protected%20%24id%3B%0A%09protected%20%24addressId%3B%0A%09protected%20%24name%3B%0A%09protected%20%24openingTime%3B%0A%09protected%20%24accessibility%3B%0A%09protected%20%24image%3B%0A%09protected%20%24description%3B%09%0A%0A%09public%20function%20getId()%7B%0A%09%09return%20%24this-%3Eid%3B%0A%09%7D%0A%09public%20function%20setId(%24id)%7B%0A%09%09%24this-%3Eid%20%3D%20%24id%3B%0A%09%7D%0A%09public%20function%20getAddressId()%7B%0A%09%09return%20%24this-%3EaddressId%3B%0A%09%7D%0A%09public%20function%20setAddressId(%24addressId)%7B%0A%09%09%24this-%3EaddressId%20%3D%20%24addressId%3B%0A%09%7D%0A%09public%20function%20getName()%7B%0A%09%09return%20%24this-%3Ename%3B%0A%09%7D%0A%09public%20function%20setName(%24name)%7B%0A%09%09%24this-%3Ename%20%3D%20%24name%3B%0A%09%7D%0A%09public%20function%20getOpeningTime()%7B%0A%09%09return%20%24this-%3EopeningTime%3B%0A%09%7D%0A%09public%20function%20setOpeningTime(%24openingTime)%7B%0A%09%09%24this-%3EopeningTime%20%3D%20%24openingTime%3B%0A%09%7D%0A%09public%20function%20getAccessibility()%7B%0A%09%09return%20%24this-%3Eaccessibility%3B%0A%09%7D%0A%09public%20function%20setAccessibility(%24accessibility)%7B%0A%09%09%24this-%3Eaccessibility%20%3D%20%24accessibility%3B%0A%09%7D%0A%09public%20function%20getImage()%7B%0A%09%09return%20%24this-%3Eimage%3B%0A%09%7D%0A%09public%20function%20setImage(%24image)%7B%0A%09%09%24this-%3Eimage%20%3D%20%24image%3B%0A%09%7D%0A%09public%20function%20getDescription()%7B%0A%09%09return%20%24this-%3Edescription%3B%0A%09%7D%0A%09public%20function%20setDescription(%24description)%7B%0A%09%09%24this-%3Edescription%20%3D%20%24description%3B%0A%09%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
The AbstractModel class contains the following methods :
a. setAssociated
Used to modify the instance of an external object. It takes as parameter the name of the field on which the object reference is defined and the instance of the new object.
b. getAssociated
Obtain the instance of an external object. It takes as parameter the name of the field on which the object reference is defined.
c. hasAssociated
Used to check if the instance of an external object exists. It takes as parameter the name of the field on which the object reference is defined.
d. addMultipleAssociated
Allows to add an object to a multiple association. It takes as parameter the name of the multiple association and the object instance.
e. setMultipleAssociatedModels
Allows to modify an instance of a multiple association. It takes as parameter the name of the multiple association and an table of objects.
f. getMultipleAssociatedModels
Used to get instances of a multiple association. It takes the name of the multiple association as a parameter.
3. Model test
We are going to create a “test-model” control to test our Models.
a. Creating the test-model control
Go to your controller/front folder and create a TestModelController class
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Ccontroller%5Cfront%3B%0A%0Ause%20muuska%5Ccontroller%5CAbstractController%3B%0A%0Aclass%20TestModelController%20extends%20AbstractController%0A%7B%0A%20%20%20%20protected%20function%20processDefault()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
b. Modifying the FrontSubApplication class
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%3B%0A%0Ause%20muuska%5Cproject%5CAbstractSubApplication%3B%0A%0Aclass%20FrontSubApplication%20extends%20AbstractSubApplication%0A%7B%0A%20%20%20%20public%20function%20createController(%5Cmuuska%5Ccontroller%5CControllerInput%20%24input)%20%7B%0A%20%20%20%20%20%20%20%20%24result%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20if%20(%24input-%3EcheckName(‘hello-world’))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result%20%3D%20new%20%5Cmyapp%5Ccontroller%5Cfront%5CHelloWorldController(%24input)%3B%0A%20%20%20%20%20%20%20%20%7Delseif%20(%24input-%3EcheckName(‘test-model’))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result%20%3D%20new%20%5Cmyapp%5Ccontroller%5Cfront%5CTestModelController(%24input)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24result%3B%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
Enter the url http://localhost/muuska/fr/test-model to access it
c. Test code
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%5Ccontroller%5Cfront%3B%0A%0Ause%20muuska%5Ccontroller%5CAbstractController%3B%0Ause%20myapp%5Cmodel%5CLibrary%3B%0Ause%20myapp%5Cconstants%5CAccessibility%3B%0Ause%20myapp%5Cmodel%5CAddressDefinition%3B%0Ause%20myapp%5Cmodel%5CSpecialityDefinition%3B%0A%0Aclass%20TestModelController%20extends%20AbstractController%0A%7B%0A%20%20%20%20protected%20function%20processDefault()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F*Cr%C3%A9ation%20de%20la%20bibliotheque*%2F%0A%20%20%20%20%20%20%20%20%24library%20%3D%20new%20Library()%3B%0A%20%20%20%20%20%20%20%20%24library-%3EsetName(‘My%20library’)%3B%0A%20%20%20%20%20%20%20%20%24library-%3EsetOpeningTime(‘Monday’)%3B%0A%20%20%20%20%20%20%20%20%24library-%3EsetAccessibility(Accessibility%3A%3APUBLIC)%3B%0A%20%20%20%20%20%20%20%20%24library-%3EsetDescription(‘My%20library%20desc’)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*Cr%C3%A9ation%20de%20l’adresse*%2F%0A%20%20%20%20%20%20%20%20%24address%20%3D%20AddressDefinition%3A%3AgetInstance()-%3EcreateModel()%3B%0A%20%20%20%20%20%20%20%20%24address-%3EsetPropertyValue(‘address’%2C%20’4500%20NY’)%3B%0A%20%20%20%20%20%20%20%20%24address-%3EsetPropertyValue(‘city’%2C%20’New%20york’)%3B%0A%20%20%20%20%20%20%20%20%24address-%3EsetPropertyValue(‘state’%2C%20’New%20york’)%3B%0A%20%20%20%20%20%20%20%20%24address-%3EsetPropertyValue(‘country’%2C%20’US’)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*Cr%C3%A9ation%20de%20la%20specialit%C3%A9*%2F%0A%20%20%20%20%20%20%20%20%24speciality1%20%3D%20SpecialityDefinition%3A%3AgetInstance()-%3EcreateModel()%3B%0A%20%20%20%20%20%20%20%20%24speciality1-%3EsetPropertyValue(‘name’%2C%20’Art’)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24speciality2%20%3D%20SpecialityDefinition%3A%3AgetInstance()-%3EcreateModel()%3B%0A%20%20%20%20%20%20%20%20%24speciality2-%3EsetPropertyValue(‘name’%2C%20’Musique’)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*Modification%20de%20l’adresse%20de%20la%20bibliotheque*%2F%0A%20%20%20%20%20%20%20%20%24library-%3EsetAssociated(‘addressId’%2C%20%24address)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*Ajout%20des%20specialit%C3%A9s%20a%20la%20bibliotheque*%2F%0A%20%20%20%20%20%20%20%20%24library-%3EaddMultipleAssociated(‘specialities’%2C%20%24speciality1)%3B%0A%20%20%20%20%20%20%20%20%24library-%3EaddMultipleAssociated(‘specialities’%2C%20%24speciality2)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*Affichage*%2F%0A%20%20%20%20%20%20%20%20var_dump(‘bibliotheque%20%3A%20’%2C%20%24library)%3B%0A%20%20%20%20%20%20%20%20var_dump(‘adresse%20%3A%20’%2C%20%24library-%3EgetAssociated(‘addressId’))%3B%3B%0A%20%20%20%20%20%20%20%20var_dump(‘specialit%C3%A9s%20%3A%20’%2C%20%24library-%3EgetMultipleAssociatedModels(‘specialities’))%3B%0A%20%20%20%20%7D%0A%7D%0A%0A” message=”” highlight=”” provider=”manual”/]
4. Deployment of models
To deploy the models to the data access medium, you must update your application by doing the following:
a. Create the update process
Open the MyApp class and override the createUpgrade method
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%3B%0A%0Ause%20muuska%5Cproject%5CAbstractApplication%3B%0Ause%20muuska%5Cutil%5CApp%3B%0Ause%20muuska%5Cproject%5Cconstants%5CSubAppName%3B%0A%0Aclass%20MyApp%20extends%20AbstractApplication%0A%7B%0A%20%20%20%20protected%20function%20registerMainDAOSources()%7B%0A%20%20%20%20%20%20%20%20parent%3A%3AregisterMainDAOSources()%3B%0A%20%20%20%20%20%20%20%20%24this-%3EregisterDaoSource(App%3A%3Adaos()-%3EcreatePDOSourceFromConfiguration())%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20protected%20function%20createSubProject(%24subAppName)%7B%0A%20%20%20%20%20%20%20%20if(%24subAppName%20%3D%3D%3D%20SubAppName%3A%3AFRONT_OFFICE)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20FrontSubApplication(%24subAppName%2C%20%24this)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20protected%20function%20createAppSetup()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20%5Cmyapp%5Csetup%5CAppSetup(%24this)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20protected%20function%20createUpgrade()%7B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%0A%7D%0A%0A” message=”AbstractApplication.php” highlight=”” provider=”manual”/]
Then add the following code :
[pastacode lang=”php” manual=”protected%20function%20createUpgrade()%7B%0A%20%20%20%20%24daoInput%20%3D%20App%3A%3Adaos()-%3EcreateProjectDAOUpgradeInput(%24this)%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(SpecialityDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(TypeDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(AddressDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(CategoryDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(PublisherDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(AuthorDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibraryDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibraryTypeDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibrarySpecialityDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(BookDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20return%20App%3A%3Aprojects()-%3EcreateDefaultProjectUpgrade(%24this%2C%20%24this-%3EdaoFactory%2C%20%24daoInput)%3B%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
b. Change the version of the application
You must change the version of the app so that the update can start automatically the next time you run the app. To do this, add the following statement in the MyApp class
[pastacode lang=”php” manual=”protected%20%24version%20%3D%20’1.1’%3B” message=”” highlight=”” provider=”manual”/]
c. final application code
[pastacode lang=”php” manual=”%3C%3Fphp%0Anamespace%20myapp%3B%0A%0Ause%20muuska%5Cproject%5CAbstractApplication%3B%0Ause%20muuska%5Cutil%5CApp%3B%0Ause%20muuska%5Cproject%5Cconstants%5CSubAppName%3B%0Ause%20myapp%5Cmodel%5CSpecialityDefinition%3B%0Ause%20myapp%5Cmodel%5CTypeDefinition%3B%0Ause%20myapp%5Cmodel%5CAddressDefinition%3B%0Ause%20myapp%5Cmodel%5CCategoryDefinition%3B%0Ause%20myapp%5Cmodel%5CPublisherDefinition%3B%0Ause%20myapp%5Cmodel%5CAuthorDefinition%3B%0Ause%20myapp%5Cmodel%5CLibraryDefinition%3B%0Ause%20myapp%5Cmodel%5CLibraryTypeDefinition%3B%0Ause%20myapp%5Cmodel%5CLibrarySpecialityDefinition%3B%0Ause%20myapp%5Cmodel%5CBookDefinition%3B%0A%0Aclass%20MyApp%20extends%20AbstractApplication%0A%7B%0A%20%20%20%20protected%20%24version%20%3D%20’1.1’%3B%0A%20%20%20%20%0A%20%20%20%20protected%20function%20registerMainDAOSources()%7B%0A%20%20%20%20%20%20%20%20parent%3A%3AregisterMainDAOSources()%3B%0A%20%20%20%20%20%20%20%20%24this-%3EregisterDaoSource(App%3A%3Adaos()-%3EcreatePDOSourceFromConfiguration())%3B%0A%20%20%20%20%7D%0A%20%20%20%20protected%20function%20createSubProject(%24subAppName)%7B%0A%20%20%20%20%20%20%20%20if(%24subAppName%20%3D%3D%3D%20SubAppName%3A%3AFRONT_OFFICE)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20FrontSubApplication(%24subAppName%2C%20%24this)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20protected%20function%20createAppSetup()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20%5Cmyapp%5Csetup%5CAppSetup(%24this)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20protected%20function%20createUpgrade()%7B%0A%20%20%20%20%20%20%20%20%24daoInput%20%3D%20App%3A%3Adaos()-%3EcreateProjectDAOUpgradeInput(%24this)%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(SpecialityDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(TypeDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(AddressDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(CategoryDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(PublisherDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(AuthorDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibraryDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibraryTypeDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(LibrarySpecialityDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20%24daoInput-%3EaddAddedModelDefinition(BookDefinition%3A%3AgetInstance())%3B%0A%20%20%20%20%20%20%20%20return%20App%3A%3Aprojects()-%3EcreateDefaultProjectUpgrade(%24this%2C%20%24this-%3EdaoFactory%2C%20%24daoInput)%3B%0A%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
d. Start update
Launch any controller in your app. The current data access medium (database) will update your application. To verify, open your database client, you will see your tables added with the prefix “msk_a_“.