Comment afficher les Smart Fields de manière conditionnelle ?
Prérequis
Afin de pouvoir suivre ce guide, il faut préalablement savoir :
- Comment déclencher un code javascript lors de la sélection d’un menu spécifique ?
- Créé Une Smart Structure
Présentation de la Smart Structure LIVRAISON
Nous allons ici créer une Smart Structure LIVRAISON
qui définit des informations de livraison de repas.
Comme dans le How-To de création de Smart Structures, lancer la commande :
npx @anakeen/anakeen-cli createSmartStructure --sourcePath . --name LIVRAISON
Rendons-nous donc dans le fichier de configuration de la SmartStructure LIVRAISON
:
src/vendor/Cogip/Restauratec/SmartStructures/Livraison/100-LivraisonStructure.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="LIVRAISON" label="Livraison">
<smart:icon file="livraison.png" />
<smart:class>Cogip\Restauratec\SmartStructures\Livraison\LivraisonBehavior</smart:class>
<smart:fields>
<smart:field-set name="livraison_frame" type="frame" label="Informations de la livraison" access="ReadWrite">
<smart:field-text name="livraison_client_nom" label="Nom du client" access="ReadWrite" />
<smart:field-text name="livraison_client_prenom" label="Prénom du client" access="ReadWrite" />
<smart:field-text name="livraison_ref" label="Référence de la commande" access="ReadWrite" />
<smart:field-text name="livraison_adresse" label="Adresse de livraison" access="ReadWrite" />
<smart:field-enum name="livraison_adresse_identique" label=" Adresse de facturation identique ?" access="ReadWrite" relation="Admin_Param_TrueFalse" />
<smart:field-text name="livraison_adresse_facturation" label="Adresse de facturation" access="ReadWrite" />
<smart:field-set name="livraison_composition" type="array" access="ReadWrite" label="Composition de la commande">
<smart:field-docid access="ReadWrite" name="livraison_menu" label="Menu" relation="MENU"/>
</smart:field-set>
<smart:field-money name="livraison_frais" access="Read" label="Frais de la livraison (€)"/>
</smart:field-set>
</smart:fields>
<smart:hooks />
</smart:structure-configuration>
</smart:config>
Comment déclencher du code JavaScript au changement de valeur d’un Smart Element ?
On souhaite que le champ d’adresse de facturation ne s’affiche en modification uniquement lorsque le champ
Adresse de facturation identique ?
est à false
. Pour cela nous allons injecter du code JavaScript dans le formulaire
de livraison en édition.
Modifier la classe de rendu en modification de la SMart Structure LIVRAISON
:
src/vendor/Cogip/Restauratec/SmartStructures/Livraison/Render/LivraisonEditRender.php
<?php
namespace Cogip\Restauratec\SmartStructures\Livraison\Render;
class LivraisonEditRender extends \Anakeen\Ui\DefaultConfigEditRender
{
/**
* @param \Anakeen\Core\Internal\SmartElement|null $document
* @return array
*/
public function getJsReferences(\Anakeen\Core\Internal\SmartElement $document = null): array
{
$jsRefs = parent::getJsReferences($document);
$jsRefs['livraisonEdit'] = new \Anakeen\Ui\JsAssetReference("/livraisonEdit.js");
return $jsRefs;
}
}
L’événement smartFieldChange
est déclenché à chaque fois qu’un Smart Field est modifié et peut être écouté au moyen de
la méthode addEventListener
.
Recommandations
Si vous n’êtes pas familier avec l’événement smartFieldChange
, il est recommandé de lire la documentation associée
disponible ici
Créer le fichier src/public/livraisonEdit.js
:
window.ank.smartElement.globalController.registerFunction("livraisonEdit", (controller) => {
controller.addEventListener(
"smartFieldChange",
{
check: (documentObject) => "edit" === documentObject.renderMode,
smartFieldCheck: (attributeObject) => attributeObject.id === "livraison_adresse_identique",
},
function eventButtonView(event, documentObject, attributeObject, values) {
if (values.current.value == "FALSE") {
controller.hideSmartField("livraison_adresse_facturation");
} else {
controller.showSmartField("livraison_adresse_facturation");
}
}
);
});
Vous pouvez maintenant déployer vos modifications :
npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
Et voir le résultat sur une livraison en création ou modification :
http://localhost:8080/api/v2/smart-elements/LIVRAISON/views/!defaultCreation.html
Et ensuite ?
Comment ajouter des contraintes sur des Smart Fields du formulaires lors de la saisie ?