Comment créer une Smart Structure
Recommandation
Une Smart Structure est un objet interne de la plateforme permettant de définir des structures de données.
Si vous n'êtes pas familier avec les Smart Structures
et leur fonctionnement, il est fortement recommandé de lire la
documentation associée
diponible ici
Générer les fichiers de configurations
Nous allons ici créer 4 Smart Structures différentes étant en rapport avec notre contexte qu'est le Restauratec :
Smart Structure | Smart Fields |
---|---|
Consommable | - Nom - Descriptif (HTML) - Prix HT (€) - Prix TTC (€) - Créateur |
Plat | - Type de plat (enum : entrée / plat principal / dessert) - Date de validité |
Boisson | Une boisson est un consommable contenant un Smart Field supplémentaire : - Contenance (cl) |
Menu | - Libellé - Description (HTML) - Ensemble de consommables ordonnés - Remise (en %) - Prix TTC (Somme des consommables avec remise; arrondi à l'euro inférieur) |
Afin de créer ces Smart Structures, nous utiliserons ici la commande createSmartStructure
. Cette dernière accepte
plusieurs arguments
comme indiqués sur la documentation
ou en exécutant la commande suivante :
npx @anakeen/anakeen-cli createSmartStructure --h
Il existe ici aussi, deux modes d'utilisation de cette commande. J'utiliserai ici la manière "classique" mais libre à
vous d'utiliser le mode interactif. Nous allons donc créer la Smart Structure Consommable
et Menu
:
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name CONSOMMABLE
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name MENU
Les fichiers de configuration de la Smart Structure Consommable
et Menu
sont maintenant créés. Il ne reste plus qu'à
faire cette manipulation pour les deux autres Smart Structures restantes (Cf. Tableau ci-dessus)
Attention
Les Smart Structures Boisson
et Plat
sont des consommables. Il faut donc bien renseigner lors de la création de ces
dernières, le paramètre --parentName
avec pour valeur CONSOMMABLE
afin d'apporter cette notion d'héritage.
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name BOISSON --parentName CONSOMMABLE
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name PLAT --parentName CONSOMMABLE
Astuce
- Si vous avez créé votre Smart Structure sans héritage et que vous voulez ajouter l'héritage vous-même, vous pouvez
utiliser la balise
<smart:extends ref="CONSOMMABLE"/>
dans le fichier100-BoisssonScture.xml
Voilà les fichiers générés pour nos quatre Smart Structures src/vendor/<vendorName>/<moduleName>/SmartStructures
Informations
Pour chaque Smart Structure créée, nous constatons que le fichier info.xml
est mis à jour. Ce dernier a été généré
lors de l'exécution de la commande create
qui nous a permis de créer le module Restauratec
. Ce fichier contient
diverses informations dont un
ensemble d'actions post-install
et post-upgrade
. Concrètement, ces modifications demandent à l'application
d'importer ces fichiers de configurations de Smart Structure fraichement générés lors de son installation.
Paramétrer les fichiers de configuration - Définir les Smart Fields
Recommandation
Un Smart Field est un élément d'information typé au sein d'une Smart Structure. > Il permet d'indiquer comment stocker, représenter et manipuler un élément d'information.
Si vous n'êtes pas familier avec les SmartFields
et leur fonctionnement, il est fortement recommandé de lire la
documentation associée
diponible ici
Maintenant que nous avons créé les fichiers de configuration de nos différentes Smart Structures, il nous faut
intégrer les Smart Fields dont nous avons besoin pour chacune d'entre elle. Pour cela, il faut se rendre, pour
chaque structure, dans le fichier .xml
généré ayant pour nom 100-{STRUCTURENAME}Structure.xml
. Il suffit de
compléter la balise <smart:fields></smart:fields>
. Référons-nous au tableau de la partie précédente pour y trouver les
Smart Fields nécéssaires.
De manière générale, le fichier .xsd
associé ainsi que la
documentation
sur les types de SmartFields
sont de bons guides dans cette démarche.
CONSOMMABLE
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="CONSOMMABLE" label="Consommable">
<smart:icon file="consommable.png"/>
<smart:class>Cogip\Restauratec\SmartStructures\Consommable\ConsommableBehavior</smart:class>
<smart:fields>
<smart:field-set name="consommable_frame" type="frame" access="ReadWrite" label="Informations relatives au consommable">
<smart:field-text name="consommable_title" needed="true" is-title="true" access="ReadWrite" label="Titre"/>
<smart:field-htmltext name="consommable_description" access="ReadWrite" label="Description"/>
<smart:field-money name="consommable_price_excl_vat" access="Read" label="Prix HT (€)"/>
<smart:field-money name="consommable_price_incl_vat" access="ReadWrite" label="Prix TTC (€)"/>
<smart:field-account access="Read" name="consommable_creator" label="Créateur"></smart:field-account>
</smart:field-set>
</smart:fields>
<smart:hooks/>
<smart:defaults/>
</smart:structure-configuration>
</smart:config>
Informations
Si vous n'êtes pas familiers avec les Énumérés
et leur fonctionnement, il est fortement recommandé de lire la
documentation associée
disponible ici
PLAT
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:enumerates>
<smart:enum-configuration name="Plat_Type">
<smart:enum name="ENTREE" label="Entrée" />
<smart:enum name="PRINCIPAL" label="Plat principal" />
<smart:enum name="DESSERT" label="Dessert" />
</smart:enum-configuration>
</smart:enumerates>
<smart:structure-configuration name="PLAT" label="Plat">
<smart:extends ref="CONSOMMABLE"></smart:extends> <!-- La smart structure PLAT hérite de la smart structure CONSOMMABLE -->
<smart:icon file="plat.png" />
<smart:class>Cogip\Restauratec\SmartStructures\Plat\PlatBehavior</smart:class>
<smart:fields>
<!-- extended="true" indique que l'on récupère ici la frame du parent (Consommable) à laquelle on ajoute d'autres Smart Fields -->
<smart:field-set name="consommable_frame" extended="true">
<smart:field-enum name="plat_type" label="Type de plat" relation="Plat_Type" access="ReadWrite" />
<smart:field-date name="plat_validity_date" label="Disponible jusqu'au" access="ReadWrite" />
</smart:field-set>
</smart:fields>
<smart:hooks />
<smart:defaults />
</smart:structure-configuration>
</smart:config>
BOISSON
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="BOISSON" label="Boisson">
<smart:extends ref="CONSOMMABLE"></smart:extends>
<smart:icon file="boisson.png"/>
<smart:class>Cogip\Restauratec\SmartStructures\Boisson\BoissonBehavior</smart:class>
<smart:fields>
<!-- extended="true" indique que l'on récupère ici la frame du parent (Consommable) à laquelle on ajoute d'autres Smart Fields -->
<smart:field-set name="consommable_frame" extended="true">
<smart:field-int name="boisson_capacity" access="ReadWrite" label="Contenance (cl)"/>
</smart:field-set>
</smart:fields>
<smart:hooks/>
<smart:defaults/>
</smart:structure-configuration>
</smart:config>
MENU
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="MENU" label="Menu">
<smart:icon file="menu.png"/>
<smart:class>Cogip\Restauratec\SmartStructures\Menu\MenuBehavior</smart:class>
<smart:fields>
<smart:field-set name="menu_frame" type="frame" access="ReadWrite" label="Informations relatives au menu">
<smart:field-text name="menu_title" needed="true" is-title="true" access="ReadWrite" label="Libellé"/>
<smart:field-htmltext name="menu_description" access="ReadWrite" label="Description"/>
<smart:field-set name="menu_composition" type="array" access="ReadWrite" label="Composition du menu">
<smart:field-docid access="ReadWrite" name="menu_plat" label="Plat" relation="PLAT"/>
<smart:field-docid access="ReadWrite" name="menu_boisson" label="Boisson" relation="BOISSON"/>
</smart:field-set>
<smart:field-double name="menu_discount" access="ReadWrite" label="Remise applicable (%)"/>
<smart:field-money name="menu_price" access="Read" label="Prix (€)"/>
</smart:field-set>
</smart:fields>
<smart:hooks/>
<smart:defaults/>
</smart:structure-configuration>
</smart:config>
Voilà, la partie "principale" de nos Smart Structures est créée : Les Smart Fields.
Informations
Dans chacune des Smart Structure précédemment créée, on remarque qu'il y a une balise indiquant une icône liée à cette dernière.
<smart:icon file="<smartStructureName>.png"/>
Il suffit de placer le fichier <smartStructureName>.png
l'emplacement suivant src/public/Images
et de réinstaller
l'application à l'aide de la commande suivante :
npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
Retrouver la Smart Structure créée
Afin de voir graphiquement ce qui vient d'être réalisé, rendons-nous dans le Development Center
dans l'onglet
Smart Structure
et sélectionnons par exemple la Smart Structure PLAT
précédemment créée. (Au travers de la barre de
recherche ou bien à l'URL suivante : <context_url>/devel/smartStructures/PLAT/infos
).
Le bouton ouvre un formulaire ayant comme Smart Fields ceux qui ont été
paramétrés dans le fichier
.xml
associé. Cela permet donc la création d'un Smart Element de la Smart Structure PLAT
.
Il ne reste plus qu'à cliquer sur 💾 Créer
en haut à droite du formulaire et le Smart Element Salade César
est créé.