# 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:framelabel: Nom affiché sur les interfacesaccess: Droit d'accès au smart field,Read,Write,ReadWriteouNoneextended: 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:arraylabel: Nom affiché sur les interfacesaccess: Droit d'accès au smart field,Read,Write,ReadWriteouNoneextended: 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:tablabel: Nom affiché sur les interfacesaccess: Droit d'accès au smart field,Read,Write,ReadWriteouNoneextended: 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,ReadWriteouNoneneeded:trueoufalse, sitrueil faut le remplir pour sauvegarder le Smart Element.is-title: Si cette option est àtruealors 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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:trueoufalse, sitrueun 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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:trueoufalse, sitrueun 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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:trueoufalse, 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueil 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,ReadWriteouNoneneeded:trueoufalse, sitrueune 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-fieldest modifiée. - Le Smart Element désigné par
extended-field-<TYPE>/copy/@relation-fieldest 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-fieldest 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
$smartFieldest mis à jour si la relation avec$publisherSmartElementIdest toujours d'actualité. - Si le Smart Element
$publisherSmartElementIdest 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-fieldestnull. - La valeur de
extended-field-<TYPE>/copy/@relation-fieldréférence un Smart Element qui n'existe pas. - La valeur de
extended-field-<TYPE>/copy/@relation-fieldré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>/@nameexiste déjà pour un autre Smart Field (étendu ou non) de cette Smart Structure. - L'accès du Smart Field étendu
extended-field-<TYPE>/@accessest àWriteouReadWrite. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldn'est pas renseigné. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldréférence un Smart Field inexistant dans la Smart Structure. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldest de typedocidet ne définit pas l'attributfield-docid/@relation. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldest de typedocidet son optionfield-docid/options/docrevest définie et différente delatest. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldest de typedocidetfield-docid/@multipleest àtrue. - Le Smart Field étendu est dans un tableau et
extended-field-<TYPE>/copy/@relation-fieldest en dehors de ce tableau. - Le Smart Field
extended-field-<TYPE>/copy/@relation-fieldest 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-fieldest de typedocidetfield-docid/@relationréférence une Smart Structure qui n'existe pas. - Le Smart Field désigné par
extended-field-<TYPE>/copy/@from-fieldn'existe pas dans le Smart Element référencé parextended-field-<TYPE>/copy/@relation-field. - Le Smart Field
extended-field-<TYPE>/copy/@from-fieldest 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;
$argsest un tableau contenant l'ensemble des arguments spécifiés dans les balisesfield-computed/field-argument- l'objet
$requestpermet d'accéder à la requête HTTP ayant initié la demande de recalcul - l'objet
$responsedoit ê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_n0sera égal à 10tst_n1sera égal à 44 (10 +34)tst_titlesera égal à "Hello"tst_t1sera é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-fieldest modifiée. - Un des Smart Elements désignés par
subscriptions/@relation-fieldest 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.