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 ce comportement c'est à dire src/vendor/<vendorName>/<moduleName>/SmartStructures/Consommable/ConsommableBehavior.php


















 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



<?php

namespace Cogip\Restauratec\SmartStructures\Consommable;

use Anakeen\Search\Filters\OneDocumentTitle;
use Anakeen\Search\Filters\OrOperator;
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 OneDocumentTitle(MenuFields::menu_plat, $this->getAttributeValue(ConsommableFields::consommable_title)),
          new OneDocumentTitle(MenuFields::menu_boisson, $this->getAttributeValue(ConsommableFields::consommable_title))
        )
      );
      $results = $s->search()->getResults();
      if (count($results) > 0) {
        return "Ce consommable est présent dans un menu";
      }
      return "";
    });
  }
}

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.

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 champs 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\OneDocumentTitle;
use Anakeen\Search\Filters\OrOperator;
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 OneDocumentTitle(MenuFields::menu_plat, $this->getAttributeValue(ConsommableFields::consommable_title)),
          new OneDocumentTitle(MenuFields::menu_boisson, $this->getAttributeValue(ConsommableFields::consommable_title))
        )
      );
      $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;
    });
  }
}

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 ?

Comment définir les accès d'un Smart Element