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 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 :
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 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
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
Et ensuite ?
Continuons la partie comportement du Smart Element en étudiant le système d'abonnement à un champ relationnel.