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

Prix total du menu

Et ensuite ?

Continuons sur la gestion des champs de notre Smart Structure au travers du guide :

Comment définir un champ étendu ?