Comment créer et associer une aide à la saisie à un Smart Field
Prérequis
Afin de pouvoir suivre ce guide, il faut préalablement avoir
Comment procéder ?
Un plat peut être ajouté à des menus uniquement s’il est à l’état
À la carte
.Lors de la confection d’un menu, les plats étant dans un autre état ne doivent donc pas être proposés.
Recommandation
Si vous n’êtes pas familier avec les Aide à la saisie (Autocomplete)
et leur fonctionnement, il est fortement
recommandé de lire la documentation associée
disponible ici et plus particulièrement
celle concernant
l’aide à la saisie à plusieurs sorties nommées.
De plus, je vous conseille de vous renseigner sur :
Vous l’aurez deviné, la SmartStructure concernée ici est celle du Menu
. Deux fichiers sont ici concernés :
- Le fichier de configuration de la Smart Structure :
src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/100-MenuStructure.xml
- Le fichier gestion de l’aide à la saisie associé à la Smart Structure :
src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/MenuAutocompletion/MenuAutocompletetion.php
Astuce
Pensez à générer les stubs. Cela a pour but d’extraire les constantes des différents fichiers de configuration .xml
des SmartStructures 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
- Il faut dans un premier temps créer la méthode permettant d’obtenir des suggestions en rapport avec le champs
concerné. Cela se gère dans le fichier
MenuAutocompletetion.php
:
<?php
namespace Cogip\Restauratec\SmartStructures\Menu\MenuAutocompletion;
use Anakeen\SmartAutocompleteRequest;
use Anakeen\SmartAutocompleteResponse;
use Anakeen\Search\SearchElements;
use Anakeen\Search\Filters\State\Equals;
use Anakeen\Search\Filters\TitleContains;
use Anakeen\Core\Utils\Strings;
use Anakeen\Core\ContextManager;
class MenuAutocompletion
{
/**
* @param SmartAutocompleteRequest $request
* @param SmartAutocompleteResponse $response
* @param array $args
* @return SmartAutocompleteResponse
* @throws \Anakeen\Search\Exception
*/
public static function getSuggestionsFromElementId(
SmartAutocompleteRequest $request,
SmartAutocompleteResponse $response,
array $args
): SmartAutocompleteResponse {
$userInput = $request->getFilterValue();
$search = new SearchElements("PLAT");
// Ajoute un filtre indiquant au champ de ne récupérer que les plats `À la carte`
$search->addFilter(new Equals("state", "plat_e2"));
// Si l’utilisateur a saisie un terme dans le champ, ajoute un filtre recherchant un titre de plat contenant cette saisie
if ($userInput !== "") {
$search->addFilter(new TitleContains($userInput, TitleContains::NOCASE));
}
// Limite le nombre de résultat de la liste déroulante d’aide à la saisie
$search->setSlice(ContextManager::getParameterValue("Core", "CORE_AUTOCOMPLETE_SLICE", 100));
$results = $search->search()->getResults();
foreach ($results as $result) {
$title = $result->getTitle();
// Cette méthode ajoute des éléments à la liste d’aide à la saisie proposée à l’utilisateur
$response->appendEntry(
// Tout d’abord la valeur affichée dans la liste déroulante
Strings::xmlEncode($title),
// Associe à l’attribut "name" de la balise "<smart:field-return>" ...
// value : l’id du Smart Element selectionné
// displayValue : la valeur d’affichage/titre de ce Smart Element
["platName" => ["value" => $result->initid, "displayValue" => $title]]
);
}
return $response;
}
}
- Ensuite, dans le fichier de configuration de la SmartStructure concernée
src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/100-MenuStructure.xml
, la balise<smart:autocompletion>
est à ajouter et compléter :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="MENU" label="Menu">
<smart:icon file="menu.png"/>
<smart:class>Cogip\Restauratec\SmartStructures\Menu\MenuBehavior</smart:class>
<smart:fields>
<smart:field-set name="menu_frame" type="frame" access="ReadWrite" label="Informations relatives au menu">
<smart:field-text name="menu_title" needed="true" is-title="true" access="ReadWrite" label="Libellé"/>
<smart:field-htmltext name="menu_description" access="ReadWrite" label="Description"/>
<smart:field-set name="menu_composition" type="array" access="ReadWrite" label="Composition du menu">
<smart:field-docid access="ReadWrite" name="menu_plat" label="Plat" relation="PLAT"/>
<smart:field-docid access="ReadWrite" name="menu_boisson" label="Boisson" relation="BOISSON"/>
</smart:field-set>
<smart:field-double name="menu_discount" access="ReadWrite" label="Remise applicable (%)"/>
<smart:field-money name="menu_price" access="Read" label="Prix (€)"/>
</smart:field-set>
</smart:fields>
<smart:hooks>
<!-- attribut event : Évênement déclenchant l’appel de la méthode -->
<!-- attribut field : Champ où sera stocker la valeur retourné par la méthode -->
<smart:field-hook event="onPreRefresh" field="menu_price">
<smart:field-callable function="::calculateTotalPrice"/>
</smart:field-hook>
<smart:field-hook type="constraint" event="onPreStore" field="menu_discount">
<smart:field-callable function="Cogip\Restauratec\SmartStructures\Menu\Utils\Menu::checkDiscountValue"/>
<smart:field-argument type="field">menu_discount</smart:field-argument>
</smart:field-hook>
</smart:hooks>
<smart:autocompletion>
<!-- Champ concerné par l’aide à la saisie -->
<smart:field-autocomplete field="menu_plat">
<!-- Fonction à appeler retournant un tableau de valeurs -->
<smart:field-callable function="Cogip\Restauratec\SmartStructures\Menu\MenuAutocompletion\MenuAutocompletion::getSuggestionsFromElementId"/>
<!-- Champ(s) complété(s) par l’aide à la saisie -->
<smart:field-returns>
<smart:field-return name="platName" field="menu_plat"/>
</smart:field-returns>
</smart:field-autocomplete>
</smart:autocompletion>
<smart:defaults/>
</smart:structure-configuration>
</smart:config>
Voici quelques plats passés À la carte
pour vérifier si l’aide à la saisie mise en place sur notre champ est bien
fonctionnelle :
Voici la liste déroulante présente lors du clique sur le champs de sélection de plat dans la composition d’un menu :
Et voici le contenu de la liste déroulante variant en fonction de la saisie utilisateur :
Et ensuite ?
Comment paramétrer le cycle de vie - Gérer le comportement du modèle