# Smart Field

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.

# Configurer les Smart Fields d'une Smart Structure

Les Smart Fields sont les éléments qui composent la structure. Chaque Smart Field est typé et possède des caractéristiques spécifiques suivant son type.

Les Smart Fields sont enregistrés dans la structure avec les balises structure-configuration/fields/field-<type>.

Attention

Chacune de ces balises indique un ordre de création ou de modification du Smart Field. Le fait de supprimer une ligne décrivant un Smart Field ne supprime pas le Smart Field.

# Les types de Smart Fields

Les Smart Fields de structure n'ont pas de valeurs ; ils servent à définir une organisation des autres types de Smart Fields.

Les contraintes suivantes sont imposées dans l'organisation de la structure :

  • Un Smart Field de structure de type "tab" ne peut pas être contenu dans un autre Smart Field de structure
  • Un Smart Field de structure de type "frame" ne peut être contenu que dans un Smart Field de structure de type "tab"
  • Un Smart Field de structure de type "array" ne peut être contenu que dans un Smart Field de structure de type "frame"
  • Un Smart Field non structurant doit être dans un Smart Field de structure de type "frame" ou de type "array"

L'arborescence des Smart Fields qui en découle a une incidence sur la définition de la sécurité et sur la définition des visibilités pour les représentations des informations.

Méthodes PHP pour gérer les Smart Fields :

  • Anakeen\SmartElement::getAttribute()
  • Anakeen\SmartElement::getAttributes()

# Smart Field structurant

# Frame

Les smarts fields de type frame permettent de structurer les formulaires.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • type : frame
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • extended : Permet de surcharger un Smart Field
  • insert-after : Placement après un autre smart field




 

 




<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
            <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-text name="my_text" label="Mon texte" access="ReadWrite" needed="true" is-title="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Array

Les smarts fields de type array permettent de structurer d'autres smarts fields sous forme d'un tableau.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • type : array
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • extended : Permet de surcharger un Smart Field
  • insert-after : Placement après un autre smart field





 





 


<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
            <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-set name="my_array" type="array" label="Mon tableau" access="ReadWrite">
                    <smart:field-text name="my_col1" label="Ma première colonne" access="ReadWrite" needed="true"/>
                    <smart:field-text name="my_col2" label="Ma deuxième colonne" access="ReadWrite" needed="true"/>
                </smart:field-set>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Tab

Les smarts fields de type tab permettent de créer des onglets.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • type : tab
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • extended : Permet de surcharger un Smart Field
  • insert-after : Placement après un autre smart field

TIP

Doit contenir un Smart field de type frame comment enfant.





 





 


<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
            <smart:field-set name="us_tab_system" type="tab" label="Technical Settings" access="None">
                <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                    <smart:field-text name="my_text" label="Mon texte" access="ReadWrite" needed="true"/>
                </smart:field-set>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Les Smarts fields contenant de la donnée

Tout les Smarts fields contenant de la donnée doivent être dans un Smart field structurant

# field-text

Les smarts fields de type text permettent de sauvegarder des données au format texte sur une seule ligne.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • is-title : Si cette option est à true alors le contenu du champ est dans la colonne titre. (défaut : false)
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.






 






<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-text name="my_text" label="Mon texte" access="ReadWrite" needed="true" is-title="true"/>
                <smart:field-text name="my_text_with_link" label="Mon texte avec un lien" access="ReadWrite" link="my_link"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-longtext

Les smarts fields de type longtext permettent de sauvegarder des données au format texte sur plusieurs lignes.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-longtext name="my_longtext" label="Mon texte multiligne" access="ReadWrite" needed="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-htmltext

Les smarts fields de type htmltext permettent de sauvegarder des données au format texte avec du style.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text sous la forme d'un fragment html.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-htmltext  name="my_htmltext" label="Mon texte avec du style" access="ReadWrite" needed="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-int

Les smarts fields de type int permettent de sauvegarder des nombres entiers.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type integer.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-int name="my_integer" label="Mon nombre entier" access="ReadWrite" needed="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-double

Les smarts fields de type double permettent de sauvegarder des nombres décimaux.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type double precision.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-double name="my_double" label="Mon nombre décimal" access="ReadWrite" needed="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-money

Les smarts fields de type money permettent de sauvegarder des nombres décimaux (2 chiffres après la virgule) avec le symbole d'une monnaie.

TIP

Par défaut, le symbole en lecture est :

WARNING

La valeur est stockée en base de donnée, pas la devise. Donc si la devise est changée, la valeur n'est pas mise à jour.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type double precision.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-money name="my_money" label="Mon prix" access="ReadWrite" needed="true"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-docid

Les smarts fields de type docid permettent de sauvegarder un lien vers un Smart Element.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • relation : Correspond au type de Smart structure, sur les interfaces, une liste déroulante avec une autocomplétion est présente.
  • multiple : true ou false, si true un ensemble de lien vers plusieurs Smarts Elements peut être affiché.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Les options :

  • doctitle : Définir un titre automatiquement

Cette option permet d'enregistrer le titre du Smart élément dans une autre colonne.
Avec la valeur auto, cette nouvelle colonne porte le name : [nomDuSmartField]_title

Ce type de Smart field est stocké en base de donnée dans une colonne de type text. Si l'option multiple est à true, ce type de Smart field est stocké en base de donnée dans une colonne de type text[].






 







<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-docid access="ReadWrite" name="my_collection" label="Collection" relation="MYSMARTSTRUCT">
                    <smart:field-option name="doctitle">auto</smart:field-option>
                </smart:field-docid>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-account

Les smarts fields de type account permettent de sauvegarder un lien vers un Smart Element de type compte utilisateur.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • relation : Correspond au type de Smart structure, une liste déroulante avec une autocomplétion est présente.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien
  • multiple : true ou false, si true un lien vers plusieurs Smarts Elements peut être affiché.

Les options :

  • doctitle : Définir un titre automatiquement sur un docid.
  • match : Permet d'afficher dans l'autocomplétion les groupes, les rôles et / ou user.
  • group : Permet d'afficher dans l'autocomplétion les utilisateurs qui sont dans le groupe sélectionné.
  • role : Permet d'afficher dans l'autocomplétion les utilisateurs qui portent le rôle sélectionné.

Ce type de Smart field est stocké en base de donnée dans une colonne de type text. Si l'option multiple est à true, ce type de Smart field est stocké en base de donnée dans une colonne de type text[].






 






















<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-account name="my_group" label="Un groupe" access="ReadWrite">
                    <smart:field-option name="doctitle">auto</smart:field-option>
                    <smart:field-option name="match">group</smart:field-option><!-- filter by groups -->
                </smart:field-account>
                <smart:field-account name="my_groups" label="Des groupes" multiple="true" access="ReadWrite">
                    <smart:field-option name="match">group</smart:field-option><!-- filter by groups -->
                </smart:field-account>
                <smart:field-account name="my_roles" label="Rôle" access="ReadWrite">
                    <smart:field-option name="match">role</smart:field-option> <!--  filter by roles -->
                </smart:field-account>
                <smart:field-account name="my_user" label="User" access="ReadWrite"/> <!-- Défault option filter by users -->
                <smart:field-account name="my_autocomplete_all" label="All" access="ReadWrite">
                    <smart:field-option name="match">all</smart:field-option> <!--  get all (groups, roles, users) -->
                </smart:field-account>

                <smart:field-account name="my_users_in_group" label="User dans le groupe" group="my_group" access="ReadWrite"/>
                <smart:field-account name="my_user_in_role" label="User dans le rôle" role="my_role" access="ReadWrite"/>

            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-date

Les smarts fields de type date permettent de sauvegarder une date.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type date.

WARNING

La valeur stockée en base de donnée ne contient pas la timezone.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-date name="my_date" label="Une date" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-time

Les smarts fields de type time permettent de sauvegarder une heure.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type time without time zone.

WARNING

La valeur stockée en base de donnée ne contient pas la timezone.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-time name="my_time" label="Une heure" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-timestamp

Les smarts fields de type timestamp permettent de sauvegarder une date avec une heure.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type timestamp without time zone.

WARNING

La valeur stockée en base de donnée ne contient pas la timezone.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-timestamp name="my_timestamp" label="Une date avec une heure" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-file

Les smarts fields de type file permettent de sauvegarder un fichier.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.
Format en base de donnée sous la forme : mime|id|fileName

Documentation de la table vaultdiskstorage d'un nouveau Smart Element.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-file name="my_file" label="Mon fichier" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-image

Les smarts fields de type image permettent de sauvegarder une image.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.
Format en base de donnée sous la forme : mime|id|fileName

Documentation de la table vaultdiskstorage d'un nouveau Smart Element.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
            <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-image name="my_image" label="Une image" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-enum

Les smarts fields de type enum permettent sélectionner un ou plusieurs éléments dans une liste à choix multiple.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • relation : Correspond au nom de l'énuméré, sur les interfaces, une liste déroulante avec une autocomplétion est présente.
  • insert-after : Placement après un autre smart field
  • multiple : true ou false, si true, le champ défini une liste de lien vers des Smarts Elements.

Ce type de Smart field est stocké en base de donnée dans une colonne de type text. Si l'option multiple est à true, Format d'un enuméré simple: name de la valeur
Exemple : Item2

Ce type de Smart field est stocké en base de donnée dans une colonne de type text[].
Format d'un enuméré multiple : {name Valeur1, name Valeur2, ...}
Exemple : {Item1, Item3}






 













<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
        <smart:enum-configuration name="MyEnumList">
            <smart:enum name="Item1" label="Premier élément"/>
            <smart:enum name="Item2" label="Second élément"/>
            <smart:enum name="Item3" label="Troisième élément"/>
            <smart:enum name="Item4" label="Quatrième élément"/>
        </smart:enum-configuration>

    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-enum name="my_enum" label="Un énuméré" access="ReadWrite" relation="MyEnum">
                <smart:field-enum name="my_enum_list" label="Des énumérés" access="ReadWrite" relation="MyEnumList" multiple="true">
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-color

Les smarts fields de type color permettent de sauvegarder une couleur.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.
Format en base de donnée sous forme hexadécimale.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-color name="my_color" label="Une couleur" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-password

Les smarts fields de type password permettent de sauvegarder un mot de passe.

  • En modification les caractères ne sont pas affiché, mais remplacé par des points
  • En Lecture seule, les caractères sont remplacés par des étoiles.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field
  • label : Nom affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true il faut le remplir pour sauvegarder le Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type text.

WARNING

Le mot de passe n'est pas chiffré en base.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-password name="my_password" label="Un mot de passe" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# field-json

Les smarts fields de type json permettent de sauvegarder des données au format json.

Les attributs possibles dans la déclaration xml sont :

  • name : Nom unique correspondant au smart field dans la Smart Structure
  • label : Libellé affiché sur les interfaces
  • access : Droit d'accès au smart field, Read, Write, ReadWrite ou None
  • needed : true ou false, si true une valeur est requise lors de la sauvegarde du Smart Element.
  • insert-after : Placement après un autre smart field
  • link : Affiche le contenu du champ dans un lien

Ce type de Smart field est stocké en base de donnée dans une colonne de type jsonb.






 





<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MYSTRUCT" label="Ma structure">
        <smart:fields>
          <smart:field-set name="my_frame" type="frame" label="Mon cadre" access="ReadWrite">
                <smart:field-json name="my_json" label="Mon champ json" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Déclarer des énumérés dans les Smart Fields Enum

Les Smart Fields de type field-enum doivent référencer un ensemble d'énumérés. Cette référence est indiquée dans l'attribut field-enum/@relation

# Énuméré statique un seul niveau

La déclaration se fait dans la balise enumerates/enum-configuration. L'attribut enumerates/enum-configuration/@name est la référence de l'énuméré. C'est cette référence qui doit être indiquée dans l'attribut enumerates/enum-configuration. Celle-ci doit être unique sur l'ensemble du contexte.

Les éléments d'énumérés sont décrits dans les balises enumerates/enum-configuration/enum. Cette balise possède les 2 attributs suivants :

  • enumerates/enum-configuration/enum/@name : valeur de l'énuméré qui sera enregistré
  • enumerates/enum-configuration/enum/@label : libellé de l'énuméré qui sera affiché dans les interfaces
<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="PrimaryColors">
            <smart:enum name="R" label="Red"/>
            <smart:enum name="G" label="Green"/>
            <smart:enum name="B" label="Blue"/>
        </smart:enum-configuration>
    </smart:enumerates>
</smart:config>

Structure référençant l'énuméré ci-dessus :






 





<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MY_STRUCTURE"  label="Ma structure">
        <smart:fields>
            <smart:field-set name="my_fr_info" type="frame" label="Information" access="ReadWrite">
                <smart:field-text name="my_title" label="Titre" access="ReadWrite" needed="true" is-title="true"/>
                <smart:field-enum name="my_colorl" label="Couleur" relation="PrimaryColors" access="ReadWrite" />
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Énuméré statique plusieurs niveaux

Les éléments d'un ensemble peuvent suivre une hiérarchie. Le nom des éléments (attribut name) doivent être uniques dans l'ensemble. les balises enum peuvent contenir d'autres balises enum.

Le nom de l'élément est enregistré (sans l'arborescence).

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="SomeColors">
            <smart:enum name="RED" label="Rouge">
                <smart:enum name="INDIANRED" label="Rouge indien"/>
                <smart:enum name="LIGHTCORAL" label="Corail clair"/>
                <smart:enum name="SALMON" label="Saumon"/>
            </smart:enum>
            <smart:enum name="YELLOW" label="Jaune">
                <smart:enum name="GOLD" label="Or"/>
                <smart:enum name="LIGHTYELLOW" label="Jaune clair"/>
                <smart:enum name="LEMONCHIFFON" label="Citron"/>
            </smart:enum>
            <smart:enum name="GREEN" label="Vert">
                <smart:enum name="LIME" label="Citron vert">
                    <smart:enum name="LIMEGREEN" label="Citron très vert"/>
                </smart:enum>
                <smart:enum name="CHARTREUSE" label="Chartreuse"/>
            </smart:enum>
            <smart:enum name="BLUE" label="Bleu">
                <smart:enum name="LIGHTBLUE" label="Bleu ciel"/>
                <smart:enum name="NAVYBLUE" label="Bleu marine"/>
            </smart:enum>
        </smart:enum-configuration>
    </smart:enumerates>
</smart:config>

# Énuméré fonction un seul niveau

L'ensemble des éléments de l'énuméré peuvent être définis à l'aide d'une méthode statique. La méthode doit être définie dans l'attribut enumerates/enum-configuration/enum-callable/@function

La méthode doit retourner un tableau d'objet Anakeen\EnumItem. Un objet Anakeen\EnumItem est composé de la référence et du label.

Exemple d'un énuméré composé des 26 lettres majuscules de l'alphabet.

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="MyLetters">
            <smart:enum-callable function="Anakeen\EnumItem\Common::letters"/>
        </smart:enum-configuration>
    </smart:enumerates>
</smart:config>

Fichier vendor/My/Enumerates/Common.php :

namespace My\Enumerates;

use Anakeen\EnumItem;
class Common
{
  public static function letters()
  {
    $items = [];

    $a = ord('A');
    $z = ord('Z');
    for ($i = $a; $i <= $z; $i++) {
      $items[] = new EnumItem(chr($i), "Letter " . strtolower(chr($i)));
    }
    return $items;
  }
}

# Énuméré fonction plusieurs niveaux

Le troisième argument du constructeur d'un objet Anakeen\EnumItem permet d'indiquer les sous-éléments d'un élément.

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="TST_005-country">
            <smart:enum-callable function="My\Enumerates\SomeCountry"/>
        </smart:enum-configuration>
    </smart:enumerates>
</smart:config>

Fichier PHP : vendor/My/Enumerates/SomeCountry

namespace My\Enumerates;

use Anakeen\EnumItem;

class SomeCountry
{
  public function __invoke()
  {
    $items = [];
    $items[] = new EnumItem("europa", "Europe", [
      new EnumItem("france", "France", [
        new EnumItem("Paris"),
        new EnumItem("Colomiers"),
        new EnumItem("Besançon"),
        new EnumItem("Strasbourg"),
        new EnumItem("Souillac")
      ]),

      new EnumItem("italy", "Italie", [
        new EnumItem("Rome"),
        new EnumItem("Venise"),
        new EnumItem("Naple"),
        new EnumItem("Florence")
      ])
    ]);

    $items[] = new EnumItem("africa", "Afrique", [
      new EnumItem("morroco", "Maroc", [
        new EnumItem("Marrakech"),
        new EnumItem("Casablanca"),
        new EnumItem("Rabat"),
        new EnumItem("Fès")
      ])
    ]);

    return $items;
  }
}

# Énumérés configurables

Par défaut, l'ensemble des énumérés est réinitialisé à chaque importation du fichier de configuration. L'attribut enumerates/enum-configuration/@extendable permet d'inhiber cette réinitialisation. Cela permet par exemple de pouvoir ajouter des éléments supplémentaires à un énuméré existant sans répéter toute sa définition.



 








<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="MyColors" extendable="true">
            <smart:enum name="R" label="Red"/>
            <smart:enum name="G" label="Green"/>
            <smart:enum name="B" label="Blue"/>
        </smart:enum-configuration>
    </smart:enumerates>
</smart:config>

# Gérer les énumérés

Voir les méthodes :

  • Anakeen\Core\EnumManager::getEnums($enumSetName)
  • Anakeen\Core\EnumManager::getEnumItem($enumSetName, $enumItemName)

# Déclarer des Smart Fields étendus À partir de la version 2023.1.1

Les Smart Fields étendus permettent de synchroniser les Smarts Fields d'un Smart Element avec un autre. Ils permettent la recopie dynamique de la valeur d'un champ d'un Smart Element référencé dans un champ relationnel docid ou account.

# Définition d'un Smart Field étendu

La déclaration d'un Smart Field étendu se fait depuis une balise extended-field-<TYPE>, <TYPE> étant le type du Smart Field étendu (voir les types de Smart Field), par exemple extended-field-date.

La balise extended-field-<TYPE> supporte les attributs suivants :

Attribut Description Obligatoire
extended-field-<TYPE>/@name Identifiant du Smart Field étendu
extended-field-<TYPE>/@access Droit d'accès au Smart Field : Read ou None
extended-field-<TYPE>/@label Libellé du Smart Field étendu

Elle supporte également les options de Smart Field compatibles avec le <TYPE> du Smart Field étendu, par exemple extended-field-docid/@multiple.

Attention

Le Smart Field étendu ne peut pas avoir d'accès en écriture.

La définition des options de copie se fait depuis une balise extended-field-<TYPE>/copy qui supporte les attributs suivants :

Attribut Description Obligatoire
extended-field-<TYPE>/copy/@relation-field Identifiant du Smart Field de type docid ou account désignant le Smart Element depuis lequel recopier les données
extended-field-<TYPE>/copy/@from-field Identifiant du Smart Field dont la valeur sera copiée depuis le Smart Element référencé dans relation-field

WARNING

Le Smart Element pris en compte pour la copie sera toujours la dernière révision du Smart Element désigné par extended-field-<TYPE>/copy/@relation-field

Exemple

<?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="MY_STRUCTURE">
        <smart:fields>
            <smart:field-set name="my_frame" type="frame" access="ReadWrite">
                <smart:field-docid name="my_docid" relation="MY_REF_STRUCTURE" access="ReadWrite"/>
                <!-- La valeur de my_extended_field sera égale à la valeur du Smart Field ref_date_field de la dernière révision du Smart Element désigné par my_docid -->
                <smart:extended-field-date name="my_extended_field" access="Read" label="Smart Field étendu">
                    <smart:copy
                            relation-field="my_docid"
                            from-field="ref_date_field"
                    />
                </smart:extended-field-date>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

# Comportement

# Fonctionnement général

La synchronisation des données est assurée par le module @anakeen/workers.

Une demande de mise à jour est publiée à chaque fois que :

  • La valeur du champ extended-field-<TYPE>/copy/@relation-field est modifiée.
  • Le Smart Element désigné par extended-field-<TYPE>/copy/@relation-field est modifié.
  • Le Smart Field étendu est modifié.

Cette demande sera traitée de manière asynchrone par les workers du module @anakeen/workers. Néanmoins, afin d'assurer la cohérence des données visualisées, les demandes de mises à jour en attente pour un Smart Element donné sont traitées avant sa visualisation.

Garanties

  • Les données visualisées d'un Smart Element sont toujours à jour.
  • Si la valeur du champ @relation-field est modifiée par un setValue(), les champs étendus du Smart Element sont mis à jour immédiatement dans l'objet en mémoire.

Attention

En revanche les résultats des Rapports et Recherches dépendent du traitement des mises à jour.

# Traitement de la mise à jour

Le traitement d'une demande de mise à jour passe par le déclenchement du Smart Hook SmartHooks::UPDATEESF.

La signature de son/ses callback(s) doit être la suivante :

function (string $smartField, int $publisherSmartElementId, int $index = -1): string;

$smartField est le nom du champ étendu à modifier et $publisherSmartElementId l'identifiant du Smart Element qui a déclenché la demande.

Paramètres optionnels :

  • $index : parfois spécifié pour éviter des calculs redondants si le champ étendu est dans un tableau et que sa position est déjà connue.

Le retour est un message d'erreur, vide si tout s'est bien passé.

Le callback suivant est enregistré par défaut sur la classe \Anakeen\SmartElement pour le hook SmartHooks::UPDATEESF :

$this->getHooks()->addListener(SmartHooks::UPDATEESF, function (
  string $smartField,
  int $publisherSmartElementId,
  int $index = -1
) {
  return $this->updateExtendedSmartField($smartField, $publisherSmartElementId, $index);
});

Le comportement de la fonction updateExtendedSmartField est le suivant :

  • Le champ $smartField est mis à jour si la relation avec $publisherSmartElementId est toujours d'actualité.
  • Si le Smart Element $publisherSmartElementId est un Smart Element supprimé (Zombie) la valeur du champ étendu n'est pas modifiée.

# Personnalisation de la mise à jour

Le comportement de la mise à jour est donc facilement personnalisable pour chacune des Smart Structures en remplaçant le callback enregistré pour le Smart Hook SmartHooks::UPDATEESF.

Exemple :


class <SmartStructure>Behavior extends \Anakeen\SmartElement
{
    public function registerHooks()
    {
        parent::registerHooks();
        $this->getHooks()->removeListeners(SmartHooks::UPDATEESF);
        $this->getHooks()->addListener(
            SmartHooks::UPDATEESF,
            function (string $smartField, int $publisherSmartElementId, int $index = -1) {
                if ($this->state === 'PUBLISHED') {
                    return "";
                }
                return $this->updateExtendedSmartField($smartField, $publisherSmartElementId, $index);
            }
        );
    }
}

Dans cet exemple, tous les SmartElement à l'état PUBLISHED ne verront plus leurs champs étendus modifiés.

# Valeurs nulles

La valeur du Smart Field étendu sera null si :

  • La valeur de extended-field-<TYPE>/copy/@relation-field est null.
  • La valeur de extended-field-<TYPE>/copy/@relation-field référence un Smart Element qui n'existe pas.
  • La valeur de extended-field-<TYPE>/copy/@relation-field référence un Smart Element supprimé (mode Zombie) avant la création du lien. Plus simplement, si une nouvelle relation est créée avec un Smart Element supprimé le champ étendu est laissé à null, en revanche, si le lien existait et que le Smart Element référencé est supprimé la valeur du champ étendu est conservée.

# Cardinalités

Si le Smart Field étendu est lui-même de type account ou docid, alors il peut se définir en tant que Smart Field multiple grâce à l'attribut extended-field-<TYPE>/@multiple. De la même manière, le Smart Field extended-field-<TYPE>/copy/@from-field peut être simple ou multiple. Enfin, chacun des Smart Field peut être inclus dans un tableau.

Attention

Le Smart Field extended-field-<TYPE>/copy/@relation-field ne peut pas avoir l'option field-docid/@multiple ou field-account/@multiple à true.

Attention

Si le Smart Field étendu est inclus dans un tableau, le Smart Field extended-field-<TYPE>/copy/@relation-field doit être dans le même tableau.

Pour des raisons de cohérences de données, seules certaines combinaisons peuvent être autorisées. Le tableau suivant détaille les combinaisons possibles. Si une combinaison est impossible, une erreur sera levée à l'exécution.

@from-field simple @from-field simple dans un tableau @from-field multiple @from-field multiple dans un tableau
Smart Field étendu simple
Smart Field étendu simple dans un tableau
Smart Field étendu multiple
Smart Field multiple dans un tableau

# Erreurs / Exceptions

Une erreur sera levée à l'importation si :

  • L'identifiant extended-field-<TYPE>/@name existe déjà pour un autre Smart Field (étendu ou non) de cette Smart Structure.
  • L'accès du Smart Field étendu extended-field-<TYPE>/@access est à Write ou ReadWrite.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field n'est pas renseigné.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field référence un Smart Field inexistant dans la Smart Structure.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field est de type docid et ne définit pas l'attribut field-docid/@relation.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field est de type docid et son option field-docid/options/docrev est définie et différente de latest.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field est de type docid et field-docid/@multiple est à true.
  • Le Smart Field étendu est dans un tableau et extended-field-<TYPE>/copy/@relation-field est en dehors de ce tableau.
  • Le Smart Field extended-field-<TYPE>/copy/@relation-field est dans un tableau et le Smart Field étendu est en dehors de ce tableau.
  • La création du Smart Field étendu générerait un cycle de dépendances entre champs étendus.

Une exception sera levée à l'exécution si :

  • Le Smart Field extended-field-<TYPE>/copy/@relation-field est de type docid et field-docid/@relation référence une Smart Structure qui n'existe pas.
  • Le Smart Field désigné par extended-field-<TYPE>/copy/@from-field n'existe pas dans le Smart Element référencé par extended-field-<TYPE>/copy/@relation-field.
  • Le Smart Field extended-field-<TYPE>/copy/@from-field est multiple et dans un tableau.
  • La configuration ne respecte pas les règles de cardinalité.
  • Le type <TYPE> du Smart Field étendu est différent du type du Smart Field extended-field-<TYPE>/copy/@from-field

Dans ce cas, toute transaction en base de donnée sera annulée.

# Exemples

On dispose d'une Smart Structure PLAT qui définit différents attributs comme le nom du plat, sa description et son prix :

<?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="PLAT" label="Plat">
        <smart:fields>
            <smart:field-set name="plat_frame" type="frame" access="ReadWrite" label="Informations">
                <smart:field-text name="plat_name" is-title="true" access="ReadWrite" label="Nom"/>
                <smart:field-text name="description" access="ReadWrite" label="Description"/>
                <smart:field-money name="price" access="ReadWrite" label="Prix"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

On souhaite définir une structure MENU_SIMPLE référençant un plat et le prix associé. On peut utiliser un Smart Field étendu pour définir un field menu_plat référençant un plat et un Smart Field plat_price portant l'information de prix du plat référencé dans menu_plat :

<?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_SIMPLE" label="Menu simple">
        <smart:fields>
            <smart:field-set name="menu_frame" type="frame" access="ReadWrite" label="Informations du menu">
                <smart:field-docid name="menu_plat" relation="PLAT" access="ReadWrite" label="Plat"/>
                <smart:extended-field-money name="plat_price" access="Read" label="Prix du plat">
                    <smart:copy
                            relation-field="menu_plat"
                            from-field="price"
                    />
                </smart:extended-field-money>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

On souhaite maintenant définir une structure MENU référençant plusieurs plats et leur prix associé. De la même manière, on peut utiliser un Smart Field étendu pour définir un field menu_plat référençant un plat et un Smart Field plat_price portant l'information du prix du plat référencé dans menu_plat :

<?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:fields>
            <smart:field-set name="menu_frame" type="array" access="ReadWrite" label="Composition du menu">
              <smart:field-docid name="menu_plat" relation="PLAT" access="ReadWrite" label="Plat"/>
              <smart:extended-field-money name="plat_price" access="Read" label="Prix du plat">
                <smart:copy
                        relation-field="menu_plat"
                        from-field="price"
                />
              </smart:extended-field-money>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

Informations

Des exemples plus complets sont disponibles dans le manuel HowTo.

# Déclarer des Smart Fields calculés À partir de la version 2023.1.2

Les Smart Fields calculés permettent de calculer automatiquement la valeur d'un champ en fonction d'autres champs d'un Smart Element. Ils sont, par défaut, visibles (mais non modifiables) en vue d'édition et recalculés dynamiquement.

# Définition d'un Smart Field calculé

La déclaration d'un Smart Field calculé se fait depuis une balise computed-field-<TYPE>, <TYPE> étant le type du Smart Field calculé. Les types supportés sont les types contenant de la donnée ainsi que le type array.

# Définir un champ calculé contenant de la donnée

La balise computed-field-<TYPE> supporte les attributs suivants :

Attribut Description Obligatoire
computed-field-<TYPE>/@name Identifiant du Smart Field calculé
computed-field-<TYPE>/@access Droit d'accès au Smart Field : Read ou None
computed-field-<TYPE>/@label Libellé du Smart Field calculé
computed-field-<TYPE>/@is-key Uniquement pour les champs contenus dans un computed-field-array

Exemple




 




 <smart:structure-configuration name="MYSTRUCT">
   <smart:fields>
     <smart:field-set name="my_frame" type="frame" access="ReadWrite">
       <smart:computed-field-text name="computed_field" access="Read"/>
     </smart:field-set>
   </smart:fields>
</smart:structure-configuration>

# Définir un champ calculé de type array

Un computed-field-array est un Smart Field structurant de type tableau ne contenant que des champs calculés contenant de la donnée ou des champs étendus. Il supporte donc les attributs suivants :

Attribut Description Obligatoire
computed-field-array/@name Identifiant du tableau
computed-field-array/@access Droit d'accès au tableau : Read ou None
computed-field-array/@label Libellé du tableau

Il doit contenir uniquement des champs calculés ou étendus et en particulier un seul et unique champ calculé qui déterminera sa taille.

Ce champ est appelé la clé du tableau et doit être spécifié avec l'attribut is-key="true".

Exemple




 
 
 
 




<smart:structure-configuration name="MYSTRUCT">
  <smart:fields>
    <smart:field-set name="my_frame" type="frame" access="ReadWrite">
      <smart:computed-field-array name="my_computed_array" access="Read">
        <smart:computed-field-int access="Read" name="computed_key" is-key="true"/>
        <smart:computed-field-int access="Read" name="computed_field"/>
      </smart:computed-field-array>
    </smart:field-set>
  </smart:fields>
</smart:structure-configuration>

# Définir les dépendances et la fonction de calcul

Pour calculer et recalculer dynamiquement de façon efficace les champs calculés, la définition d'un champ en tant que computed-field nécessite également :

  • la liste des champs nécessaires au recalcul
  • la fonction PHP à appeler pour effectuer le calcul

La déclaration des fonctions à appeler et des dépendances de chacun de champs calculés est réalisée dans le XML de configuration de la Smart Structure depuis la balise structure-configuration/computed.

Ces informations sont regroupées sous la balise computed/field-computed pour chacun des champs calculés.

Attention

Cette configuration doit être effectuée uniquement pour les champs calculés contenant de la donnée.

La balise field-computed supporte les attributs suivants :

Attribut Description Obligatoire
field-computed/@field Nom du champ calculé concerné par la configuration

Elle doit contenir :

  • une ou plusieurs balises field-argument
  • une unique balise field-callable

# Définition des dépendances

La balise field-argument supporte les attributs suivants :

Attribut Description Obligatoire
field-argument/@type Type d'argument
field-argument/@name Spécifie le nom de l'argument passé à la fonction @field-callable

Les types d'arguments possibles sont :

Type Description Valeurs possibles
field Nom du champ dont le calcul dépend N'importe quel nom de champ contenant de la donnée dans la Smart Structure
string Chaîne de caractères *
property Propriété de la Smart Structure id, initid, fromid, title ou viewId

L'ensemble de ces arguments seront disponibles lors de l'appel à la fonction de calcul.

Informations

La valeur du champ field-computed/@field est recalculée dynamiquement en vue d'édition et à la sauvegarde lorsqu'un des arguments de type field est modifié.

# Définition de la fonction de calcul

La balise field-callable supporte l'attribut @function définissant la fonction à appeler pour le calcul du champ. Cette fonction peut :

  • être une fonction de la classe de comportement du Smart Element, le cas échéant elle devra être définie comme ::functionToCall
  • être une fonction statique dans une classe externe, cette fois sa définition devra spécifier sa classe MyClass::myStaticFunction

La fonction de calcul spécifiée dans computed/field-computed/@field-callable doit avoir la signature suivante :

function (DynamicUpdateRequest $request, DynamicUpdateResponse $response, $args): DynamicUpdateResponse;
  • $args est un tableau contenant l'ensemble des arguments spécifiés dans les balises field-computed/field-argument
  • l'objet $request permet d'accéder à la requête HTTP ayant initié la demande de recalcul
  • l'objet $response doit être retourné et possède deux méthodes principales :
    • $response->setResult($value) pour définir le résultat du champ calculé
    • $response->setError($error) si une erreur doit être remontée

Exemple

 <smart:structure-configuration name="MYSTRUCT">
   <smart:fields>
     <smart:field-set name="my_frame" type="frame" access="ReadWrite">
       <smart:field-text name="my_text" access="ReadWrite"/>
       <smart:computed-field-text name="computed_field" access="Read"/>
     </smart:field-set>
   </smart:fields>

   <smart:computed>
     <smart:field-computed field="computed_field">
       <smart:field-callable function="MyClass::myStaticFunction"/>
       <smart:field-argument type="field" name="rawText">my_text</smart:field-argument>
       <smart:field-argument type="string" name="suffix">SUFFIX</smart:field-argument>
     </smart:field-computed>
   </smart:computed>

</smart:structure-configuration>
use Anakeen\Core\SmartStructure\Dynamic\DynamicUpdateRequest;
use Anakeen\Core\SmartStructure\Dynamic\DynamicUpdateResponse;

class MyClass
{
  public static function myStaticFunction(
    DynamicUpdateRequest $request,
    DynamicUpdateResponse $response,
    $args
  ): DynamicUpdateResponse {
    return $response->setResult($args['rawText'] . $args['suffix']);
  }
}

Dans cet exemple à chaque modification du champ my_text, le champ computed_field prendra la valeur ${my_text}SUFFIX.

# Cas particulier des champs calculés dans les tableaux

Les champs calculés peuvent être définis dans des tableaux (tableau simple ou computed). La règle est la suivante :

Si un champ calculé se trouve dans le même tableau qu'une de ses dépendances alors la dépendance est dite inline. Cela signifie que le calcul du champ ne dépendra que de la valeur de sa dépendance au même index.

La fonction de calcul ne recevra en argument que la valeur simple du champ de la dépendance à l'index modifié et non toute la colonne.

Dans tous les autres cas la dépendance n'est pas inline et l'intégralité de la colonne est envoyée.

Informations

Des exemples plus complets sont disponibles dans le manuel HowTo.

# Valeur par défaut des Smart Fields

Cette configuration détermine la valeur du Smart Field lors de la création d'un nouveau Smart Element.

Dans le cas d'héritage, si la valeur par défaut n'est pas enregistrée, alors la valeur est recherchée dans ses ancêtres jusqu'à trouver une valeur enregistrée.

Une fois la valeur par défaut enregistrée, elle n'est plus modifiée par une réimportation de configuration sauf si l'option reset est utilisée.

Balise Description Options
defaults/@reset (bool)Déenregistre toutes les valeurs par défaut déjà enregistrées false par défaut
defaults/default/@field Réference au Smart Field de structure obligatoire
defaults/default/@reset (bool)Indique si la valeur doit être réenregistré (la valeur enregistrée précedement est écrasée) false par défaut
defaults/default/@inherit (bool)Indique si la valeur doit être déenregistré - Dans ce cas, elle prendra celle de ses parents false par défaut
defaults/default/ valeur brute de la valeur par défaut si vide alors pas de valeur par défaut
defaults/default/field-callable/@function référence à une méthode PHP méthode statique ou __invoke )
defaults/default/field-argument/@type string , field, property "field" : la valeur doit être une référence à un Smart Field, "property" : la valeur doit être une des propriétés d'un Smart Element (initid, locked, ...)
defaults/default/field-argument/ valeur de l'argument (nom du Smart Field si type est field)
<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="TST_007" label="Test n°7">
        <smart:class>My\Test\MyHooks</smart:class>
        <smart:fields>
            <smart:field-set name="tst_f_title" type="frame" label="Titre" access="ReadWrite">
                <smart:field-text name="tst_title" label="Le titre" access="ReadWrite" is-title="true"/>
                <smart:field-int name="tst_n0" access="ReadWrite"/>
                <smart:field-int name="tst_n1" access="ReadWrite"/>
                <smart:field-date name="tst_d1" access="ReadWrite"/>
                <smart:field-text name="tst_t0" access="ReadWrite"/>
                <smart:field-longtext name="tst_t1" access="ReadWrite"/>
                <smart:field-text name="tst_t2" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
        <smart:parameters/>

        <smart:defaults>
            <smart:default field="tst_title">Hello</smart:default>
            <smart:default field="tst_n0">10</smart:default>

            <smart:default field="tst_n1">
                <smart:field-callable function="::simpleAdd"/>
                <smart:field-argument type="string">34</smart:field-argument>
                <smart:field-argument type="field">tst_n0</smart:field-argument>
            </smart:default>
            <smart:default field="tst_d1">
                <!-- 7 jours après la date du jour -->
                <smart:field-callable function="My\Utils\Date::dayInterval"/>
                <smart:field-argument type="string">7</smart:field-argument>
            </smart:default>

            <smart:default field="tst_t1"><![CDATA[Omelette:
- 3 œufs
- fromage
]]>
            </smart:default>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

Exemple avec le fichier : "vendor/My/Test/MyHooks.php"
Lors de la création du smart element, le Smart Field

  • tst_n0 sera égal à 10
  • tst_n1 sera égal à 44 (10 +34)
  • tst_title sera égal à "Hello"
  • tst_t1 sera égal à "44 "Omelette:\n3 œufs\nfromage"
<?php
namespace My\Test;

class MyHooks extends \Anakeen\SmartElement
{
  public static function simpleAdd(...$args)
  {
    return array_sum($args);
  }
}

Exemple de calcul de la valeur par défaut de tst_d1 avec le fichier vendor/My/Utils/Date.php.

<?php
namespace My\Utils;
class Date
{
  public static function dayInterval($day)
  {
    return date('Y-m-d', strtotime(sprintf("now + %d days", $day)));
  }
}

La valeur par défaut est recalculée à chaque appel de la méthode SEManager::createDocument().

Pour les valeurs multiples, lorsqu'un Smart Field est déclaré "multiple", le valeur par défaut doit être un tableau au format JSON.

Exemple avec un énuméré multiple (tst_e0) et un simple (tst_e1) :

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:enumerates>
        <smart:enum-configuration name="RGB">
            <smart:enum name="red" label="Rouge"/>
            <smart:enum name="green" label="Vert"/>
            <smart:enum name="blue" label="Bleu"/>
        </smart:enum-configuration>
    </smart:enumerates>
    <smart:structure-configuration name="TST_007" label="Test n°7">
        <smart:fields>
            <smart:field-set name="tst_f_title" type="frame" label="Info" access="ReadWrite">
                <smart:field-text name="tst_title" label="Le titre" access="ReadWrite" is-title="true"/>
                <smart:field-enum name="tst_e0" relation="RGB" multiple="true" access="ReadWrite"/>
                <smart:field-enum name="tst_e1" relation="RGB" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>

        <smart:defaults>
            <smart:default field="tst_e1">blue</smart:default>
            <smart:default field="tst_e0">["red","green"]</smart:default>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

Pour les tableaux, il est aussi possible de configurer une valeur par défaut dans cas, la valeur doit contenir l'ensemble des valeurs de chaque ligne du tableau au format JSON. La valeur peut aussi contenir la référence (field-callable) à une méthode qui retournera un tableau indexé contenant les valeurs de chaque rangée.

Si la valeur par défaut du tableau n'est pas renseignée et qu'un de ces Smart Fields a une valeur par défaut alors cette valeur (ce qui correspond à une cellule du tableau) sera utilisée comme valeur par défaut. Le tableau aura alors une seule rangée déjà préremplie.

Les valeurs par défaut des Smart Fields contenus dans un tableau sont aussi utilisés lorsqu'on ajoute une nouvelle rangée dans le tableau depuis le formulaire web.

Si le tableau contient une valeur par défaut, le tableau sera prérempli avec cette valeur, les valeurs par défaut des Smart Fields du tableau ne seront pris en compte qu'avec le formulaire lorsqu'on ajoute des rangées.

Si on veux avoir des valeurs par défaut dans les Smart Fields du tableau et avoir lors de la création un tableau vide, il faut mettre la valeur par défaut [] sur le tableau.

Exemple de valeurs par défaut pour les tableaux :

Le tableau tst_t_t1 sera prérempli avec deux lignes, chaque nouvelle ligne sera préremplie avec 24 pour le Smart Field tst_is. Le tableau tst_t_t2 sera prérempli avec une ligne via les valeurs par défaut des Smart Fields tst_lts et ts_ds. La ligne préremplis et chaque nouvelle ligne ajoutée par le formulaire auront les valeurs Bonjour et 6.78.

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="TST_007" label="Test n°7">
        <smart:class>Anakeen\Pu\SmartStructures\TestDefaultHooks</smart:class>
        <smart:tag name="vendor">Anakeen</smart:tag>
        <smart:fields>
            <smart:field-set name="tst_f_title" type="frame" label="Titre" access="ReadWrite">
                <smart:field-text name="tst_title" label="Le titre" access="ReadWrite" is-title="true"/>

                <smart:field-set name="tst_t_t1" access="ReadWrite" type="array">
                    <smart:field-text name="tst_ts" access="ReadWrite"/>
                    <smart:field-int name="tst_is" access="ReadWrite"/>
                </smart:field-set>
                <smart:field-set name="tst_t_t2" access="ReadWrite" type="array">
                    <smart:field-longtext name="tst_lts" access="ReadWrite"/>
                    <smart:field-double name="tst_ds" access="ReadWrite"/>
                </smart:field-set>
            </smart:field-set>
        </smart:fields>

        <smart:defaults>
            <smart:default field="tst_t_t1">
                [{"tst_ts":"Hola", "tst_is":12},{"tst_ts":"Hombre", "tst_is":56}]
            </smart:default>
            <smart:default field="tst_is">24</smart:default>
            <smart:default field="tst_lts">Bonjour</smart:default>
            <smart:default field="tst_ds">6.78</smart:default>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

# Réinitialisation de la structure

Il n'est pas possible de supprimer complètement un Smart Field depuis le fichier de configuration. Par contre, il est possible d'indiquer une directive de réinitialisation avec l'attribut structure-configuration/fields/@reset.

<smart:fields reset="true">
   ...
</smart:fields>

Cette directive efface toutes les définitions des Smart Fields préalablement enregistrés. Par contre, les valeurs de ces Smart Fields ne sont pas effacées, celles-ci persistent dans la base de données et il est donc facilement possible de rétablir les Smart Fields supprimés sans perte de données.

Attention

Cette directive efface aussi les paramètres de structures

# Les Smart Fields dans les structures avec héritage

# Ajouter des Smart Fields sur une structure héritée

La déclaration de Smart Field dans une structure héritée insère les éléments à la suite des Smart Fields parents.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="SA">
        <smart:fields>
            <smart:field-set name="a1" type="frame" access="ReadWrite">
                <smart:field-text name="a2" access="ReadWrite"/>
                <smart:field-text name="a3" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
    <smart:structure-configuration name="SB">
        <smart:extends ref="SA"/>
        <smart:fields>
            <smart:field-set name="b1" type="frame" access="ReadWrite">
                <smart:field-text name="b2" access="ReadWrite"/>
                <smart:field-text name="b3" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

Dans ce cas, la structure résultante de SB est :

  • A1
    • A2
    • A3
  • B1
    • B2
    • B3

# Surcharger un Smart Field

La surcharge d'un Smart Field parent permet de modifier les propriétés du Smart Field hérité.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="SA">
        <smart:fields>
            <smart:field-set name="a1" type="frame" access="ReadWrite">
                <smart:field-text name="a2" access="ReadWrite" is-title="true"/>
                <smart:field-text name="a3" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
    <smart:structure-configuration name="SB">
        <smart:extends ref="SA"/>
        <smart:fields>
            <smart:field-set name="b1" type="frame" access="ReadWrite">
                <smart:field-text name="b2" access="ReadWrite" is-title="true"/>
                <smart:field-text name="b3" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
        <!-- here a1 is not a part of title -->
        <smart:field-override  field="a1" is-title="false" />
    </smart:structure-configuration>
</smart:config>

Ici la propriété is-title du field a1 est passée à false dans SB.

# Placement de nouveaux Smart Fields

Par défaut l'ordre de la structure suit l'ordre donné par les instructions d'enregistrement des Smart Fields.

Soit la structure AA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="AA">
        <smart:fields>
            <smart:field-set name="a1" type="frame" access="ReadWrite">
                <smart:field-text name="a2" access="ReadWrite"/>
                <smart:field-text name="a3" access="ReadWrite"/>
                <smart:field-set name="a4" type="array" access="ReadWrite">
                    <smart:field-text name="a5" access="ReadWrite"/>
                </smart:field-set>
            </smart:field-set>
            <smart:field-set name="a6" type="frame" access="ReadWrite">
                <smart:field-text name="a7" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

Dans ce cas, la structure résultante de AA est :

  • A1
    • A2
    • A3
    • A4
      • A5
  • A6
    • A7

La balise structure-configuration/fields/field-*/@insert-after permet de modifier l'ordre du Smart Field dans la structure.

En cas de surcharge ou d'héritage de Smart Structure, l'attribut insert-after permet d'indiquer où le nouveau Smart Field sera inséré.

Par défaut, l'attribut insert-after a la valeur ::auto. Le mot-clef ::auto indique que le Smart Field sera inséré à la fin du Smart Field encadrant (field-set cadre, onglet, tableau), s'il n'y a pas de Smart Field encadrant, il sera inséré à la fin de la structure.

Soit la structure BA héritant de la structure AA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="BA">
        <smart:extends ref="AA"/>
        <smart:fields>
            <smart:field-set name="b1" type="frame" access="ReadWrite">
                <smart:field-text name="b2" access="ReadWrite"/>
                <smart:field-text name="b3" access="ReadWrite"/>
            </smart:field-set>
            <smart:field-set name="b4" type="frame" access="ReadWrite">
                <smart:field-text name="b5" access="ReadWrite"/>
                 <!-- field parent étendu -->
                <smart:field-set name="a4" extended="true">
                    <smart:field-text name="b7" access="ReadWrite"/>
                    <smart:field-text name="b8" access="ReadWrite"/>
                </smart:field-set>
            </smart:field-set>
            <!-- field parent étendu -->
            <smart:field-set name="a6" extended="true">
                <smart:field-text name="b6" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

La structure résultante de BA est la suivante :

  • A1
    • A2
    • A3
    • A4
      • A5
      • B7
      • B8
  • A6
    • A7
    • B6
  • B1
    • B2
    • B3
  • B4
    • B5

L'attribut structure-configuration/fields/field-set/@extended indique l'utilisation d'un Smart Field parent pour lequel des Smart Fields supplémentaires seront ajoutés.

Le mot-clef ::first, permet d'insérer un attribut en premier dans la structure englobante.

Soit la structure CA héritant de la structure AA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="CA">
        <smart:extends ref="AA"/>
        <smart:fields>
            <smart:field-set name="c1" type="frame" access="ReadWrite" insert-after="::first">
                <smart:field-text name="c2" access="ReadWrite"/>
                <smart:field-text name="c3" access="ReadWrite"/>
            </smart:field-set>
            <smart:field-set name="c4" type="frame" access="ReadWrite" insert-after="::first">
              <smart:field-text name="c5" access="ReadWrite"/>
            </smart:field-set>
            <smart:field-set name="a4" extended="true">
              <smart:field-text name="c6" access="ReadWrite" insert-after="::first"/>
              <smart:field-text name="c7" access="ReadWrite" insert-after="::first"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

La structure résultante de CA est :

  • C4
    • C5
  • C1
    • C2
    • C3
  • A1
    • A2
    • A3
    • A4
      • C7
      • C6
      • A5
  • A6
    • A7

Dans ce cas, on remarque que c1 est derrière c4 alors qu'il a été déclaré avant c4 dans le fichier. Ceci est dû à l'ordre ::first qui est interprété dans l'ordre de la déclaration. Au moment de l'interprétation c1 était déjà inséré. Le même principe est visible pour les Smart Fields c6 et c7.

L'ordre peut contenir une référence à un Smart Field. Cette référence indique que le Smart Field sera placé après cette référence. Cette référence ne peut être qu'un Smart Field du même encadrant.

Soit la structure DA héritant de la structure AA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="DA">
        <smart:extends ref="AA"/>
        <smart:fields>
            <smart:field-set name="d1" type="frame" access="ReadWrite" insert-after="a1">
                <smart:field-text name="d2" access="ReadWrite"/>
                <smart:field-text name="d3" access="ReadWrite"/>
            </smart:field-set>
            <smart:field-set name="d4" type="frame" access="ReadWrite" insert-after="d1">
                <smart:field-text name="d5" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

La structure résultante de DA est :

  • A1
    • A2
    • A3
    • A4
      • A5
  • D1
    • D2
    • D3
  • D4
    • D5
  • A6
    • A7

L'attribut D1 est inséré après A1. L'attribut D4 est inséré après D1.

L'ordre est appliqué suivant la hiérarchie des héritages. C'est-à-dire que les ordres d'une structure fille sont calculés à partir des ordres calculés de la structure mère.

Soit la structure EA héritant de la structure AA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="EA">
        <smart:extends ref="AA"/>
        <smart:fields>
            <smart:field-set name="e1" type="frame" access="ReadWrite">
                <smart:field-text name="e2" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
        <smart:field-override  field="a1" insert-after="a6"/>
    </smart:structure-configuration>
</smart:config>

La structure résultante de EA est :

  • A6
    • A7
  • A1
    • A2
    • A3
    • A4
      • A5
  • E1
    • E2

Soit la structure FE héritant de la structure EA :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="FE">
        <smart:extends ref="EA"/>
        <smart:fields>
            <smart:field-set name="f1" type="frame" access="ReadWrite" insert-after="e1">
                <smart:field-text name="f2" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
        <smart:field-override  field="e1" insert-after="a6"/>
    </smart:structure-configuration>
</smart:config>

La structure résultante de FE est :

  • A6
    • A7
  • E1
    • E2
  • F1
    • F2
  • A1
    • A2
    • A3
    • A4
      • A5

# S'abonner à un Smart Element référencé dans un Smart Field À partir de la version 2023.1.1

Il est possible de s'abonner aux changements d'un Smart Element référencé dans un Smart Field de type docid ou account. Comme pour les champs étendus, un Smart Hook est déclenché à chaque modification (quelle que soit sa nature) de l'élément ciblé.

# Définition d'un abonnement

La déclaration d'un abonnement est réalisée dans le XML de configuration de la Smart Structure depuis la balise structure-configuration/subscriptions/subscribe.

La balise subscriptions contient la liste des abonnements et supporte les attributs suivants :

Attribut Description Contrainte Obligatoire
subscriptions/@reset Réinitialiser les abonnements Booléen

La balise subscribe déclare un abonnement et supporte les attributs suivants :

Attribut Description Contrainte Obligatoire
subscribe/@relation-field Champ relationnel auquel s'abonner Le champ référencé doit être de type docid ou account

Exemple :
















 
 
 
 




<?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="<SmartStructure>" label="<SmartStructure>">

        <smart:class>Anakeen\SmartStructures\<SmartStructure>\<SmartStructure>Behavior</smart:class>

        <smart:fields>
            <smart:field-set name="my_set" type="frame" access="ReadWrite">
                <smart:field-docid name="to_subscribe" relation="RELATION1" access="ReadWrite"/>
                <smart:field-set name="my_array" type="array" access="ReadWrite">
                    <smart:field-docid name="to_subscribe_array" relation="RELATION2" access="ReadWrite"/>
                </smart:field-set>
            </smart:field-set>
        </smart:fields>

        <smart:subscriptions reset="true">
            <smart:subscribe relation-field="to_subscribe"/>
            <smart:subscribe relation-field="to_subscribe_array"/>
        </smart:subscriptions>

    </smart:structure-configuration>
</smart:config>

# Comportement

# Fonctionnement général

À chaque modification d'un élément référencé, une notification sera publiée. Cette notification sera traitée de manière asynchrone par les workers du module @anakeen/workers.

Une notification est publiée à chaque fois que :

  • La valeur du champ subscriptions/@relation-field est modifiée.
  • Un des Smart Elements désignés par subscriptions/@relation-field est modifié.

# Traitement de la notification

Le traitement de la notification correspond au déclenchement du Smart Hook SmartHooks::ONSUBSCRIPTIONEVENT.

La signature de son/ses callback(s) doit être la suivante :

function (string $smartField, int $publisherSmartElementId): string;

$publisherSmartElementId est l'identifiant du Smart Element qui a été modifié et $smartField le nom du champ le référençant. Le callback doit retourner une chaîne vide s'il n'y a pas d'erreur, ou une chaîne non-vide contenant le message d'erreur dans le cas contraire.

Exemple

class <SmartStructure>Behavior extends \Anakeen\SmartElement
{
    public function registerHooks()
    {
        parent::registerHooks();
        $this->getHooks()->addListener(
            SmartHooks::ONSUBSCRIPTIONEVENT,
            function (string $smartField, int $publisherSmartElementId) {
                switch ($smartField) {
                    case "to_subscribe":
                        // l'élément d'identifiant $publisherSmartElementId, référencé
                        // dans "to_subscribe", a été modifié
                        break;
                    case "to_subscribe_array":
                        // l'élément d'identifiant $publisherSmartElementId, référencé
                        // dans "to_subscribe_array", a été modifié
                        break;
                }
                return "";
            }
        );
    }
}

Informations

Un exemple plus complet est disponible dans le manuel HowTo.