# 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 fieldtype
:frame
label
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
extended
: Permet de surcharger un Smart Fieldinsert-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 fieldtype
:array
label
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
extended
: Permet de surcharger un Smart Fieldinsert-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 fieldtype
:tab
label
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
extended
: Permet de surcharger un Smart Fieldinsert-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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
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 fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
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
oufalse
, sitrue
un ensemble de lien vers plusieurs Smarts Elements peut être affiché.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
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 fieldlink
: Affiche le contenu du champ dans un lienmultiple
:true
oufalse
, sitrue
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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
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 fieldmultiple
:true
oufalse
, sitrue
, 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 fieldlabel
: Nom affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
il faut le remplir pour sauvegarder le Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 Structurelabel
: Libellé affiché sur les interfacesaccess
: Droit d'accès au smart field,Read
,Write
,ReadWrite
ouNone
needed
:true
oufalse
, sitrue
une valeur est requise lors de la sauvegarde du Smart Element.insert-after
: Placement après un autre smart fieldlink
: 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 unsetValue()
, 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;
où $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
estnull
. - 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
ouReadWrite
. - 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 typedocid
et ne définit pas l'attributfield-docid/@relation
. - Le Smart Field
extended-field-<TYPE>/copy/@relation-field
est de typedocid
et son optionfield-docid/options/docrev
est définie et différente delatest
. - Le Smart Field
extended-field-<TYPE>/copy/@relation-field
est de typedocid
etfield-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 typedocid
etfield-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é parextended-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 Fieldextended-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 balisesfield-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 à 10tst_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;
où $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.