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

icones

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 Bouton créer 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.

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 ?