Comment modifier le comportement d’un Smart Element

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement avoir généré et parametré 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é.

Si vous n’êtes pas familier avec les hooks de la classe Smart Element et leur fonctionnement, il est fortement recommandé de lire la documentation associée

Comment procéder ?

Informations

Il existe deux types de hook :

  • pre[...], permettant d’effectuer des vérifications avant que le comportement se déroule et pouvant interrompre ce dernier,
  • post[...], permettant d’effectuer des traitements après que le comportement se soit déroulé

Hook preDelete

Recommandation

Pour plus d’informations sur ce hook preDelete, c’est ici

Nous allons ici empêcher la suppression d’un consommable s’il est présent dans un menu. Pour cela, rendons-nous dans le fichier gérant le comportement des consommables, c’est-à-dire src/vendor/<vendorName>/<moduleName>/SmartStructures/Consommable/ConsommableBehavior.php


















 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



<?php

namespace Cogip\Restauratec\SmartStructures\Consommable;

use Anakeen\Search\Filters\OrOperator;
use Anakeen\Search\Filters\Relation\OneEquals;
use Anakeen\Search\SearchElements;
use Anakeen\SmartHooks;
use SmartStructure\Fields\Consommable as ConsommableFields;
use SmartStructure\Fields\Menu as MenuFields;
use SmartStructure\Fields\Plat as PlatFields;

class ConsommableBehavior extends \Anakeen\SmartElement
{
  public function registerHooks()
    {
        parent::registerHooks();
        $this->getHooks()->addListener(SmartHooks::PREDELETE, function () {
            // Cherche des menus ...
            $s = new SearchElements("MENU");
            // ... dont le nom du plat OU de la boisson correspond à l’élément cherchant à être supprimé
            $s->addFilter(
                new OrOperator(
                    new OneEquals(MenuFields::menu_plat, $this->initid),
                    new OneEquals(MenuFields::menu_boisson, $this->initid)
                )
            );
            $results = $s->search()->getResults();
            if (count($results) > 0) {
                return "Ce consommable est présent dans un menu";
            }
            return "";
        });
    }
}

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

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

Vous pouvez maintenant déployer vos modifications :

make deploy

Si le consommable à supprimer n’est dans aucun menu, il est alors supprimé. Le cas échéant, l’utilisateur est averti et la suppression annulée.

On peut le tester en supprimant un plat ou une boisson utilisés dans un menu :

preDelete

Hook postCreated

Recommandation

Pour plus d’informations sur ce hook postCreated, c’est ici

Lors de la création d’un consommable, nous voulons que le champ consommable_creator soit rempli automatiquement avec l’utilisateur effectuant cette création. Pour cela, rendons-nous dans le fichier gérant ce comportement c’est à dire src/vendor/<vendorName>/<moduleName>/SmartStructures/Consommable/ConsommableBehavior.php


































 
 
 
 
 
 
 
 



<?php

namespace Cogip\Restauratec\SmartStructures\Consommable;

use Anakeen\Core\ContextManager;
use Anakeen\Search\Filters\OrOperator;
use Anakeen\Search\Filters\Relation\OneEquals;
use Anakeen\Search\SearchElements;
use Anakeen\SmartHooks;
use SmartStructure\Fields\Consommable as ConsommableFields;
use SmartStructure\Fields\Menu as MenuFields;

class ConsommableBehavior extends \Anakeen\SmartElement
{
    public function registerHooks()
    {
        parent::registerHooks();
        $this->getHooks()->addListener(SmartHooks::PREDELETE, function () {
            // Cherche des menus ...
            $s = new SearchElements("MENU");
            // ... dont le nom du plat OU de la boisson correspond à l’élément cherchant à être supprimé
            $s->addFilter(
                new OrOperator(
                    new OneEquals(MenuFields::menu_plat, $this->initid),
                    new OneEquals(MenuFields::menu_boisson, $this->initid)
                )
            );
            $results = $s->search()->getResults();
            if (count($results) > 0) {
                return "Ce consommable est présent dans un menu";
            }
            return "";
        });
        $this->getHooks()->addListener(SmartHooks::POSTCREATED, function () {
            $result = "";
            if ($this->revision == 0) {
                $userId = ContextManager::getCurrentUser()->fid;
                $result = $this->setValue(ConsommableFields::consommable_creator, $userId);
            }
            return $result;
        });
    }
}

On peut vérifier notre traitement à la création d’un consommable, une boisson par exemple :

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

postCreated

Hook postDelete

Recommandation

Pour plus d’informations sur ce hook postDelete, c’est ici

Nous parlons de ce hook dans le chapitre sur l’envoi de mail en se basant sur un modèle fraichement créé. Nous l’utilisons afin de prévenir de la suppression d’un plat. Pour consulter ce chapitre, rendez-vous ici

Et ensuite ?

Continuons la partie comportement du Smart Element en étudiant le système d'abonnement à un champ relationnel.