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é
preDelete
Hook 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.
postCreated
Hook 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;
});
}
}
postDelete
Hook 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