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 disponible ici

Générer les fichiers de configurations

Nous allons ici créer quatre Smart Structures différentes en rapport avec notre projet 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
Create a smart structure

Options:
  --version             Show version number                            [boolean]
  --sourcePath, -s      path to the info.xml directory [Mandatory]
                                                         [string] [default: "."]
  --name, -n            name of the smart structure [Mandatory]         [string]
  --vendorName, -v      vendor name of the module [Mandatory]
                                                   [string] [default: (default)]
  --moduleName, -m      name of the module [Mandatory]
                                                   [string] [default: (default)]
  --parentName, -p      parent name of the smartStructure [string] [default: ""]
  --smartStructurePath  path where the smart structure will be added
                                                   [string] [default: (default)]
  --inSelfDirectory     add a directory for the new smart structure (not
                        compatible with smartStructurePath)
                                                       [boolean] [default: true]
  --withRender          add renders class              [boolean] [default: true]
  --withParameters      add parameters                 [boolean] [default: true]
  --withBehavior        add a class behavior           [boolean] [default: true]
  --withSettings        add settings                   [boolean] [default: true]
  --withAutocompletion  add an autocompletion          [boolean] [default: true]
  --insertIntoInfo      Insert into info.xml           [boolean] [default: true]
  -h, --help            Show help                                      [boolean]

Il existe ici aussi, deux modes d’utilisation de cette commande. Nous utilisons la ligne de commande, mais vous pouvez également utiliser le mode interactif.


Créons les Smart Structures Consommable et Menu :

npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name CONSOMMABLE
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name MENU

Astuce

A la fin de chaque commande createSmartStructure, vous devez voir le message

✔ success createSmartStructure done

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 fichier 100-BoisssonScture.xml

Voilà les fichiers générés pour nos quatre Smart Structures src/vendor/<vendorName>/<moduleName>/SmartStructures

CreateCommandResult

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 configuration 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 Smart Fields et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible 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écessaires.

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

src/vendor/Cogip/Restauratec/SmartStructures/Consommable/100-ConsommableStructure.xml

<?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-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

src/vendor/Cogip/Restauratec/SmartStructures/Plat/100-PlatStructure.xml

<?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"/> <!-- 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

src/vendor/Cogip/Restauratec/SmartStructures/Boisson/100-BoissonStructure.xml

<?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: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>
<?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>

Attention

Pensez à effectuer une réinstallation afin que l’application prenne en compte les modifications effectuées :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall

La partie principale de nos Smart Structures est créée : Les Smart Fields.

Informations

Dans chacune des Smart Structures précédemment créées, 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

icons

Retrouver la Smart Structure créée

Afin de voir graphiquement ce qui vient d’être réalisé, rendons-nous sur un formulaire de création de Smart Element via l’url http://localhost:8080/api/v2/smart-elements/<STRUCTURE>/views/!defaultCreation.html.

Par exemple http://localhost:8080/api/v2/smart-elements/PLAT/views/!defaultCreation.html :

Formulaire de création d’un Smart Element PLAT

Il ne reste plus qu’à cliquer sur 💾 Créer en haut à droite du formulaire et le Smart Element Salade César est créé.

Et ensuite ?

Comment définir la valeur par défaut d’un Smart Field ?