Comment ajouter des conditions avant la sauvegarde dans un formulaire ?

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 ?.

Comment déclencher du code JavaScript avant la sauvegarde d’un Smart Element ?

On souhaite ajouter une vérification avant la sauvegarde d’un Smart Element Menu afin de vérifier que sa description n’est pas vide et que son prix n’est pas supérieur à trente euros.

L’événement beforeValidate est déclenché avant la sauvegarde d’un Smart Element et peut être écouté au moyen de la méthode addEventListener.

Recommandations

Si vous n’êtes pas familier avec l’événement beforeValidate, il est recommandé de lire la documentation associée disponible ici

Modifions la classe de rendu du menu en édition pour injecter du code JavaScript :

src/vendor/Cogip/Restauratec/SmartStructures/Menu/Render/MenuEditRender.php :

















 
 
 
 
 
 
 
 
 
 


<?php

namespace Cogip\Restauratec\SmartStructures\Menu\Render;

use Anakeen\Routes\Core\Lib\ApiMessage;
use Anakeen\Ui\CommonRenderOptions;
use Anakeen\Ui\RenderAttributeNeeded;
use Anakeen\Ui\RenderOptions;
use SmartStructure\Fields\Menu as MenuFields;
use \Anakeen\Core\Internal\SmartElement;
use SmartStructure\Renderdescription;

class MenuEditRender extends \Anakeen\Ui\DefaultConfigEditRender
{
    [...]

    /**
     * @param SmartElement|null $document
     * @return array
     */
    public function getJsReferences(\Anakeen\Core\Internal\SmartElement $document = null): array
    {
        $js = parent::getJsReferences($document);
        $js['menuEdit'] = new \Anakeen\Ui\JsAssetReference("/menuEdit.js");
        return $js;
    }
}

Créer le fichier src/public/menuEdit.js :

window.ank.smartElement.globalController.registerFunction("menuEdit", (controller) => {
  controller.addEventListener("beforeValidate", function eventBeforeSave(event, documentObject, data) {
    const description = controller.getValue("menu_description").value;
    if (description == null) {
      event.preventDefault();
      controller.showMessage({
        type: "error",
        message: "Le menu n’a pas de description.",
      });
    }
    const price = controller.getValue("menu_price").value;
    if (price > 30) {
      event.preventDefault();
      controller.showMessage({
        type: "warning",
        message: "Le menu est au-dessus de 30 €",
      });
    }
  });
});

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 un MENU en création ou modification :

http://localhost:8080/api/v2/smart-elements/MENU/views/!defaultCreation.html

JSCondition

Et ensuite ?

Comment afficher les Smart Fields de manière conditionnelle ?