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
    1. 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).
    2. Data type : string
    3. optional : no
  • primary 
    1. Description : The name of the field representing the object identifier.
    2. Data type : string
    3. optional : yes (If the object has more than one identifier)
  • primaries
    1. Description : Nom des champs permettant d’identifier l’objet.
    2. Data type : table
    3. optional :  yes (If the object has only one identifier)
  • autoIncrement 
    1. 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.
    2. Data type : boolean
    3. optional : yes
  • multilingual
    1. Description : Allows to specify whether the object supports multilingual.
    2. Data type : boolean
    3. optional : yes
  • uniques
    1. 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”/]
    2. Data type : Associative table
    3. optional : yes
  • fields
    1. Description : Represents the definition of persistent attributes of the class.
    2. Data type : Associative table
    3. optional : no
  • presentationFields 
    1. 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”.
    2. Data type : table
    3. optional : yes
  •  presentationFields Separator 
    1. Description : The separator to be used in case “presentationFields” contains more than one element. The not-fault value is space.
    2. Data type : string
    3. optional : yes
  • projectType 
    1. Description : The type of project to which the object is associated. The default is muuskaprojectconstantsProjectType::Application
    2. Data type :  string
    3. optional : yes
  • projectName 
    1. Description : The name of the project to which the object is associated.
    2. Data type : string
    3. optional : yes
  • associations 
    1. 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
    2. Data type : table
    3. optional : yes

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
      1. 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.
      2. Data type : integer
      3. Optional : no
    • nature
      1. 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.
      2. Data type : integer
      3. Optional : yes
    • required
      1. Description : Allows to specify whether the attribute is required or not.
      2. Data type : boolean
      3. Optional : yes
    • validationRule 
      1. 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”
      2. Data type : string
      3. Optional :  yes
    • validationRules
      1. Description : List of validation rules
      2. Data type : table
      3. Optional :  yes
    • maxSize
      1. Description : The maximum number of characters allowed by the attribute.
      2. Data type : integer
      3. Optional : yes
    • minSize
      1. Description : The minimum number of characters allowed by the attribute.
      2. Data type : integer
      3. Optional : yes
    • maxValue
      1. Description : Maximum value allowed.
      2. Data type : integer
      3. Optional : yes
    • minValue
      1. Description : Minimum value allowed.
      2. Data type : integer
      3. Optional : yes
    • unique
      1. 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.
      2. Data type : boolean
      3. Optional : yes
    • reference
      1. 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”.
      2. Data type : Object
      3. Optional : yes
    • onDelete
      1. 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.
      2. Data type : integer
      3. Optional : yes
    • optionProvider
      1. 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.
      2. Data type : Object
      3. Optional : yes
    • validator
      1. 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.
      2. Data type : Object
      3. Optional : yes

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_“.

database_books

 

Leave a Reply

Your email address will not be published. Required fields are marked *