Comment calculer automatiquement la valeur d’un Smart Field
Prérequis
Afin de pouvoir suivre ce guide, il faut préalablement avoir généré et paramétré le(s) fichier(s) de configuration de notre/nos formulaire(s).
Cela nous assure que le fichier .php
de comportement associé à la Smart Structure concernée est bien généré.
Comment procéder ?
Il faut gérer le fait que le prix TTC de chaque menu se calcule de manière automatique.
Il suffit de calculer la somme des prix de chaque plat/boisson du menu et d’y appliquer la remise associée au menu concerné.
Vous l’aurez deviné, la Smart Structure concernée ici est celle du Menu
. Deux fichiers sont ici concernés :
- Le fichier de configuration de la Smart Structure :
src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/100-MenuStructure.xml
- Le fichier gérant le comportement de cette dernière :
src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/MenuBehavior.php
Astuce
Pensez à générer les stubs. Cela a pour but d’extraire les constantes des différents fichiers de configuration .xml
des Smart Structures que vous possédez. Cela apportera ici une complétion sur les Smart Fields, paramètres de Smart
Structure, étapes et transitions des cycles de vie, aussi bien dans le PHP que dans le JavaScript. Pour cela :
npx @anakeen/anakeen-cli generateStubs
Il faut dans un premier temps créer la méthode effectuant le calcul de la somme des consommables présents dans le menu
et retournant cette valeur. Cela se gère dans le fichier MenuBehavior.php
:
<?php
namespace Cogip\Restauratec\SmartStructures\Menu;
// Import des stubs de la Smart Structure `Menu`
use SmartStructure\Fields\Menu as MenuFields;
// Import des stubs de la Smart Structure `Consommables`
use SmartStructure\Fields\Consommable as ConsommableFields;
use Anakeen\Core\SEManager;
use Anakeen\SmartHooks;
class MenuBehavior extends \Anakeen\SmartElement
{
public function registerHooks()
{
parent::registerHooks();
}
public function calculateTotalPrice(): float
{
$consumables = array_merge(
array_values($this->getAttributeValue(MenuFields::menu_plat)),
array_values($this->getAttributeValue(MenuFields::menu_boisson))
);
$discount = $this->getAttributeValue(MenuFields::menu_discount);
$totalPrice = 0;
foreach ($consumables as $value) {
$smartElement = SEManager::getDocument($value);
if (!is_null($smartElement)) {
$smartField = $smartElement->getAttributeValue(ConsommableFields::consommable_price_incl_vat);
if (!is_null($smartField)) {
$totalPrice += floatval(
SEManager::getDocument($value)->getAttributeValue(ConsommableFields::consommable_price_incl_vat)
);
}
}
}
return $totalPrice * (1 - $discount / 100);
}
}
Autocomplétion dans les fichiers PHP
Par défaut, les fichiers PHP Anakeen Platform 4 ne sont pas déployés dans le projet. Ils sont archivés sous la forme de
fichiers .phar
dans les dépendances de votre projet.
Pour déployer les fichiers et ainsi bénéficier de l’autocomplétion pour les fichiers PHP dans votre IDE, lancez la commande :
make deploy-phar
- Ensuite, dans le fichier de configuration de la Smart Structure concernée, la balise
<smart:hooks>
est à ajouter et compléter :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="MENU" label="Menu">
<smart:icon file="menu.png"/>
<smart:class>Cogip\Restauratec\SmartStructures\Menu\MenuBehavior</smart:class>
<smart:fields>
<smart:field-set name="menu_frame" type="frame" access="ReadWrite" label="Informations relatives au menu">
<smart:field-text name="menu_title" needed="true" is-title="true" access="ReadWrite" label="Libellé"/>
<smart:field-htmltext name="menu_description" access="ReadWrite" label="Description"/>
<smart:field-set name="menu_composition" type="array" access="ReadWrite" label="Composition du menu">
<smart:field-docid access="ReadWrite" name="menu_plat" label="Plat" relation="PLAT"/>
<smart:field-docid access="ReadWrite" name="menu_boisson" label="Boisson" relation="BOISSON"/>
</smart:field-set>
<smart:field-double name="menu_discount" access="ReadWrite" label="Remise applicable (%)"/>
<smart:field-money name="menu_price" access="Read" label="Prix (€)"/>
</smart:field-set>
</smart:fields>
<smart:hooks>
<!-- attribut event : Évênement déclenchant l’appel de la méthode -->
<!-- attribut field : Champ où sera stocker la valeur retourné par la méthode -->
<smart:field-hook event="onPreRefresh" field="menu_price">
<smart:field-callable function="::calculateTotalPrice"/>
</smart:field-hook>
</smart:hooks>
<smart:defaults/>
</smart:structure-configuration>
</smart:config>
Attention
Pensez à effectuer une réinstallation afin que l’application prenne en compte les modifications effectuées :
npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
Résultat / Vérification
Lors de la création d’un menu, lorsque nous passons en mode consultation sur ce dernier, nous pouvons voir le prix calculé à l’aide de la méthode précédemment créée et référencée :
http://localhost:8080/api/v2/smart-elements/MENU/views/!defaultCreation.html
Et ensuite ?
Continuons sur la gestion des champs de notre Smart Structure au travers du guide :