Comment ajouter une vérification spécifique avant le passage de transition d’un cycle de vie

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement avoir personnalisé la fenêtre de transition d’un cycle de vie et avoir ajouté un menu permettant d’accéder à une url spécifique.

On souhaite empêcher la transition Valider dans le cas où la date de validation d’un PLAT est antérieure au jour courant. Pour cela nous allons utiliser l’événement beforeDisplayTransition.

Recommandations

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

Comment procéder ?

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

window.ank.smartElement.globalController.registerFunction("platView", (controller) => {
  controller.addEventListener("ready", function addListeners(event, documentObject) {
    controller.addEventListener("beforeDisplayTransition", function checkTransition(
      event,
      smartElement,
      transitionObject
    ) {
      if (transitionObject.transition === "t_plat_e1_e2") {
        const validityDateValue = controller.getValue("plat_validity_date").value;
        if (validityDateValue) {
          const validityDate = new Date(validityDateValue);
          const now = Date.now();
          if (validityDate < now) {
            event.preventDefault();
            controller.showMessage({
              type: "error",
              message: `Validation impossible : la date de validité du plat (${validityDate.toLocaleString(
                "fr-FR"
              )}) est dépassée.`,
            });
          }
        }
      }
    });
  });
});

Ajouter le script JavaScript à la classe de rendu src/vendor/Cogip/Restauratec/SmartStructures/Plat/Render/PlatViewRender.php :































































 
 
 
 
 
 


<?php

namespace Cogip\Restauratec\SmartStructures\Plat\Render;

use Anakeen\Core\Internal\SmartElement as InternalSmartElement;
use Anakeen\Routes\Core\Lib\ApiMessage;
use Anakeen\Ui\BarMenu;
use Anakeen\Ui\ItemMenu;
use Anakeen\Ui\MenuTargetOptions;
use Anakeen\Ui\RenderAttributeVisibilities;
use Cogip\Restauratec\SmartStructures\Consommable\Render\ConsommableViewRender;
use SmartStructure\Fields\Plat as PlatFields;

class PlatViewRender extends ConsommableViewRender
{

    /**
     * @param InternalSmartElement $document
     * @return BarMenu
     * @throws \Anakeen\Core\DocManager\Exception
     * @throws \Anakeen\Exception
     * @throws \Anakeen\Database\Exception
     * @throws \Anakeen\Search\Exception
     */
    public function getMenu(InternalSmartElement $document): BarMenu
    {
        $menu = parent::getMenu($document);
        $imagePlat= $document ->getFileLink(PlatFields::plat_image);
        if(!empty($imagePlat)){
            $itemImage = new ItemMenu("platImage");
            $url = sprintf("%s?inline=true&inline=yes",
                $imagePlat
            );
            $itemImage->setUrl($url);

            $option = new MenuTargetOptions();
            $option->windowHeight = 400;
            $option->windowWidth = 700;
            $itemImage->setTarget("_dialog", $option);
            $itemImage->setTextLabel("Afficher l’image");
            $menu->appendElement($itemImage);
        }
        return $menu;
    }

    public function getMessages(\Anakeen\Core\Internal\SmartElement $document)
    {
        $messages = parent::getMessages($document);
        $priceDiff = $document->getAttributeValue(PlatFields::plat_price_difference);
        if ($priceDiff !== 0) {
            $messages[] = new ApiMessage(sprintf("Le plat a changé de prix de %s euros", $priceDiff), ApiMessage::WARNING);
        }
        return $messages;
    }

    public function getVisibilities(InternalSmartElement $document, \SmartStructure\Mask $mask = null): RenderAttributeVisibilities
    {
        $vis = parent::getVisibilities($document, $mask);
        $vis->setVisibility(PlatFields::plat_price_difference, RenderAttributeVisibilities::HiddenVisibility);
        return $vis;
    }

    public function getJsReferences(\Anakeen\Core\Internal\SmartElement $document = null)
    {
        $jsRefs = parent::getJsReferences($document);
        $jsRefs['platView'] = new \Anakeen\Ui\JsAssetReference("/platView.js");
        return $jsRefs;
    }
}

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 PLAT à l’état En test en étant connecté avec un utilisateur de la direction :

login: pope
password: cogip

transitionCheck

Et ensuite ?

Comment rendre obligatoire des paramètres lors de la transition d’un cycle de vie