Model
Représente Les classes persistantes du système. Par exemple Une classe Livre.
Nous allons utiliser un système de gestion des bibliothèques pour expliquer cette partie.
Dans votre application, créez un dossier “model” qui contiendra vos classes.
Pour chaque classe, vous devez créer sa définition.
1. Notion de "Model Définition"
a. Exemple de 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. Obtention d’une instance unique
Le bloc de code suivant doit être ajouté dans toutes vos définitions c’est pour s’assurer qu’on ait qu’une seule instance de la classe dans l’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. La méthode « createModel »
La méthode « createModel » permet de fournir le moyen de créer une nouvelle instance d’un model.
d. La méthode «createDefinition»
La méthode «createDefinition» retourne un tableau associatif définissant la classe. Le tableau suivant explique ces différents champs.
- Champs
- name
- Description : Représente le nom de la classe qui sera utilisée par le support de persistance (Par exemple pour la base de données ça représentera le nom de la table).
- Type de donnée : Chaine
- facultatif : non
- primary
- Description : Le nom du champ représentant l’identifiant de l’objet.
- Type de donnée : Chaine
- facultatif : Oui (Si l’objet a plusieurs identifiant)
- primaries
- Description : Nom des champs permettant d’identifier l’objet.
- Type de donnée : tableau
- facultatif : Oui (Si l’objet a un seul identifiant)
- autoIncrement
- Description : Indique si l’on veut que la valeur de l’identifiant d’un objet soit attribué automatiquement. Ce champ n’est utile que pour les Classes ayant un seul identifiant.
- Type de donnée : booléen
- facultatif : oui
- multilingual
- Description Permet de spécifier si l’objet prend en compte le multilingue.
- Type de donnée : booléen
- facultatif : oui
- 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”/]
- Type de donnée : Tableau associatif
- facultatif : oui
- fields
- Description : Représente la définition des attributs persistant de la classe.
- Type de donnée : Tableau associatif
- facultatif : non
- presentationFields
- Description Champs utilisés pour la description de l’objet et aussi pour l’auto complétion.
Si vous ne renseignez pas cette information, le système cherchera les champs appropriés parmi les valeurs suivantes (dans cet order) : « firstName + lastName », « label », « displayName », « name », « title », « code », « reference».firstName + lastName“,“Label”, “displayName”, “name”, “title”, “code”, “reference”. - Type de donnée : tableau
- facultatif : oui
- Description Champs utilisés pour la description de l’objet et aussi pour l’auto complétion.
- presentationFields Separator
- Description Le séparateur à utiliser au cas où "presentationFields" contient plus d’un élément. La valeur pas défaut est l’espace.
- Type de donnée : Chaine
- facultatif : oui
- projectType
- Description : Le type de projet auquel l’objet est associé. La valeur par défaut est muuskaprojectconstantsProjectType::Application
- Type de donnée : Chaine
- facultatif : oui
- projectName
- Description Le nom du projet auquel l’objet est associé.
- Type de donnée : Chaine
- facultatif : oui
- associations
- Description Permet de définir les associations multiples.
C’est tableau associatif où la clé représente le nom de l’association et la valeur est un tableau définissant l’association. La définition de l’association est un tableau associatif avec les infos suivantes :
- reference : objet représentant la définition de la classe externe.
- field : nom du champ représentant l’identifiant de l’objet courant dans la classe externe
- Type de donnée : tableau
- facultatif : oui
- Description Permet de définir les associations multiples.
C’est tableau associatif où la clé représente le nom de l’association et la valeur est un tableau définissant l’association. La définition de l’association est un tableau associatif avec les infos suivantes :
e. Définition des associations multiples
[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. Définition d’un champ
Le champ « fields » de la définition du Model retourné par la méthode « createDefinition»
Le champs "fields" est un tableau associatif représentant la définition des attributs persistant de la classe.
NB: Si dans la méthode "createDefinition" le champ "autoIncrement" est définit avec la valeur "true", la propriété représentant l’identifiant de la classe ne doit pas figurer dans le tableau "fields” table.
Le tableau « fields » est de la forme "clé-valeur" où :
- La "clé" est une chaine de caractère représentant le nom d’une propriété de la classe exemple " firstName "
- La "value" est un tableau associatif représentant la définition de la propriété. Le tableau suivant liste des champs disponibles :
- Champs
- 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.
- Type de donnée : entier
- Optional : non
- nature
- Description : Représente la nature de la donnée. C’est-à-dire le type d’information que la variable est censé contenir ça peut être un numéro de téléphone, une adresse email, un mot de passe, un nom, etc…
A set of constants is defined in the muuska constants FieldNature class. - Type de donnée : entier
- Optional : oui
- Description : Représente la nature de la donnée. C’est-à-dire le type d’information que la variable est censé contenir ça peut être un numéro de téléphone, une adresse email, un mot de passe, un nom, etc…
- required
- Description : Permet de spécifier si l’attribut est obligatoire ou pas.
- Type de donnée : booléen
- Optional : oui
- 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.
Exemple « isPhoneNumber » - Type de donnée : Chaine
- Optional : oui
- 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 Liste des règles de validation
- Type de donnée : tableau
- Optional : oui
- maxSize
- Description : Le nombre de caractère maximum autorisé par l’attribut.
- Type de donnée : entier
- Optional : oui
- minSize
- Description : Le nombre de caractère minimum autorisé par l’attribut.
- Type de donnée : entier
- Optional : oui
- maxValue
- Description : Valeur maximum autorisé
- Type de donnée : entier
- Optional : oui
- minValue
- Description : Valeur minimum autorisé
- Type de donnée : entier
- Optional : oui
- unique
- Description : Permet de spécifier la valeur de l’attribut doit être unique par exemple je ne veux pas avoir deux livres dans mon système avec le même code.
- Type de donnée : booléen
- Optional : oui
- reference
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::EXISTING_MODEL_ID.
Il représente l’objet contenant la définition de la classe vers laquelle l’attribut pointe.
Cet objet doit être une instance de la classe
“Muuska model AbstractModelDefinition”. - Type de donnée : Objet
- Optional : oui
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::EXISTING_MODEL_ID.
Il représente l’objet contenant la définition de la classe vers laquelle l’attribut pointe.
- onDelete
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::EXISTING_MODEL_ID.
Permet de spécifier le comportement (CASCADE, RESTRICT, etc…) en cas de suppression de la référence de l’objet.
A set of constants are defined in the muuskadaoconstantsReferenceOption class. - Type de donnée : entier
- Optional : oui
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::EXISTING_MODEL_ID.
Permet de spécifier le comportement (CASCADE, RESTRICT, etc…) en cas de suppression de la référence de l’objet.
- optionProvider
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::OPTION.
Représente l’objet qui fournira les options à utiliser.
Cet attribut est utile au cas où l’on a une liste de valeur prédéfinit pour un champ en d’autre terme ça représente les énumérations.
This object must be an instance of the “muuskaoptionAbstractOptionProvider” class. - Type de donnée : Objet
- Optional : oui
- Description : N’est requis qu’au cas où la nature du champ à la valeur FieldNature::OPTION.
- validator
- Description : Permet de spécifier un validateur personnalisé pour le champ.
This object must implement the muuskavalidationValidator interface.
The muuskavalidationDefaultValidator class
Implémente cette interface et vous fournit un moyen de créer une instance en définissant une fonction de rappel. - Type de donnée : Objet
- Optional : oui
- Description : Permet de spécifier un validateur personnalisé pour le champ.
- type
Implémentation d’un validateur personnalisé pour un champ
[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”/]
Création des options pour un champ
Ajouter un dossier option dans votre application puis ajouter La classe de votre 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”/]
La méthode initOptions vous permet d’initialiser vos options. Grace à la méthode addArrayOption, vous pouvez ajouter vos options, le premier paramètre représente la valeur de l’option, et le deuxième le label de l’option. Il faut utiliser la méthode « l » pour obtenir la traduction d’un texte.
Définition d’un champ externe
[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. Utilisation d’un tableau associatif comme model
Vous n’êtes pas obligé de créer une classe model pour toutes vos définitions. Vous pouvez spécifier dans la définition que vous voulez qu’un tableau associatif soit créé. Pour le faire vous devez ajouter l’instruction suivante dans la définition :
[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.
Cette classe contient les méthodes suivantes :
getPropertyValue
Permet d’obtenir la valeur d’une propriété. Elle prend en paramètre le nom de la propriété.
setPropertyValue
Permet de modifier la valeur d’une propriété, elle prend en paramètre de nom de la propriété et la nouvelle valeur.
La définition finale de l’objet sera :
[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 de model
C’est une classe avec les attributs, méthode, les getters et les 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”/]
La classe AbstractModel contient les méthodes suivantes :
a. setAssociated
Permet de modifier l’instance d’un objet externe. Elle prend en paramètre le nom du champ sur lequel la référence de l’objet est définit et l’instance du nouvel objet.
b. getAssociated
Permet d’obtenir l’instance d’un objet externe. Elle prend en paramètre le nom du champ sur lequel la référence de l’objet est définit.
c. hasAssociated
Permet de vérifier si l’instance d’un objet externe existe. Elle prend en paramètre le nom du champ sur lequel la référence de l’objet est définit.
d. addMultipleAssociated
Permet d’ajouter un objet à une association multiple. Elle prend en paramètre le nom de l’association multiple et l’instance de l’objet.
e. setMultipleAssociatedModels
Permet modifier les instances d’une association multiple. Elle prend en paramètre le nom de l’association multiple et un tableau d’objet.
f. getMultipleAssociatedModels
Permet d’obtenir les instances d’une association multiple. Elle prend en paramètre le nom de l’association multiple.
3. Test des model
Nous allons créer un contrôler « test-model » pour tester nos Models.
a. Création du contrôler test-model
Allez dans votre dossier controller/front et créer une classe TestModelController
[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. Modification de la classe FrontSubApplication
[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”/]
Entrez l’url http://localhost/muuska/fr/test-model pour y accéder
c. Code de test
[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. Déploiement des models
Pour déployer les models sur le support d’accès aux données, vous devez faire une mise à jour de votre application en suivant les étapes suivantes :
a. Créer le processus de mise à jour
Ouvrez la classe MyApp et redéfinissez la méthode createUpgrade
[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”/]
Puis ajouter le code suivant :
[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. Modifier la version de l’application
Il faut modifier la version de l’application afin que la mise à jour puisse se lancer automatiquement à la prochaine exécution de l’application. Pour le faire il faut ajouter l’instruction suivante dans la classe MyApp
[pastacode lang=”php” manual=”protected%20%24version%20%3D%20’1.1’%3B” message=”” highlight=”” provider=”manual”/]
c. Code finale de l’application
[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. Démarrer la mise à jour
Lancer n’importe quel contrôleur de votre application. Le support d’accès aux données courant (Base de données) fera la mise à jour de votre application. Pour vérifier, ouvrez votre client de base de donnée vous verrez vos tables ajouté avec le préfix "msk_a_“.